android 通知欄NotificationManager及自定義通知欄Notification的使用
阿新 • • 發佈:2019-02-01
在Android作業系統中,狀態列通知Notification的運用是很常見的,比如我們收到簡訊,QQ訊息等,在手機頂端通知欄就會顯示一條圖文訊息來提示我們。Notification有很多的用法,比如最基本的即時訊息的提示,更新應用或下載檔案的進度條式的提示,用來顯示長文字和一些自定義佈局的摺疊式的提示,android5.0新增加的懸掛式的提示等。下面我們介紹一個最基本的Notification,瞭解大致的流程和設定屬性。
建立Notification大致需要以下四步:
1.從系統服務中獲得通知管理器NotificationManager物件
2.建立Notification
3.定義一個PendingIntent,將PendingIntent關聯到Notification
4.通過通知管理器來發起通知
程式碼如下:
java程式碼:
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.support .annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.TimePicker;
import java.util.Calendar;
import android.media.MediaPlayer;
import android.app .PendingIntent;
import android.app.Notification;
import android.app.NotificationManager;
import android.support.v7.app.NotificationCompat;
public class MainActivity extends AppCompatActivity {
private PendingIntent pendingIntent;
private AlarmManager alarmManager;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendinform(View view){
NotificationManager notificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//例項化通知
NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
//通知欄的標題,內容
builder.setContentTitle("大事件");
builder.setContentText("今天情人節,不要放孔明燈!");
//設定通知LED燈
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
//點選之後 該條通知將會移除
builder.setAutoCancel(true);
builder.setSmallIcon(android.R.drawable.ic_media_play);
builder.setContentIntent(PendingIntent.getActivity(this,0x102,new Intent(this,AlarmActivity.class),0));
Notification notification=builder.build();
//傳送通知
notificationManager.notify(0x101,notification);
}
public void senddefinition(View view){
//設定圖示,後面的自定義佈局的圖片會覆蓋它,但還是得設定,不然不會顯示到通知欄
Notification notification = new Notification();
notification.icon=R.drawable.b;
notification.tickerText="金正恩長兄金正男被殺";
notification.when = System.currentTimeMillis();
notification.flags = Notification.FLAG_AUTO_CANCEL;
// 設定通知欄佈局裡面控制元件的屬性
RemoteViews remoteViews=new RemoteViews(getPackageName(),R.layout.activity_notification);
remoteViews.setImageViewResource(R.id.iv_notification_view, R.drawable.b);
// remoteViews.setTextColor(R.id.ll_notification_layout, Color.BLUE);
remoteViews.setTextViewText(R.id.tv_notification_view, "金正恩長兄金正男被殺");
// remoteViews.setTextViewTextSize(R.id.tv_notification_view, 1, 15);
remoteViews.setTextViewText(R.id.tv_notification_view2, "金正男在吉隆坡國際機場遭兩女間諜遇害");
// PendingIntent有4種flag.
// - FLAG_ONE_SHOT 只執行一次
// - FLAG_NO_CREATE 若描述的Intent不存在則返回NULL值
// - FLAG_CANCEL_CURRENT 如果描述的PendingIntent已經存在,則在產生新的Intent之前會先取消掉當前的
// - FLAG_UPDATE_CURRENT 總是執行,這個flag用的最多
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this,AlarmActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.iv_notification_view, pendingIntent);
notification.contentView = remoteViews;
notification.contentIntent = pendingIntent;
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(1, notification);
}
}
自定義通知欄的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:id="@+id/ll_notification_layout"
android:layout_height="match_parent">
<LinearLayout
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="0dp">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/iv_notification_view"
/>
<TextView
android:layout_marginLeft="20dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:textSize="20sp"
android:gravity="center"
android:id="@+id/tv_notification_view"
/>
</LinearLayout>
<TextView
android:layout_marginLeft="20dp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textSize="15sp"
android:id="@+id/tv_notification_view2"
/>
</LinearLayout>
真機效果圖: