Android NotificationManager 和 Notification的使用總結
阿新 • • 發佈:2019-01-03
前言:
這段時間一直在寫一個自動檢測Apk自動更新的功能。
其中有使用到這個通知欄資訊,就一步去了解。
NotificationManager ,Notification的使用
這裡程式碼我就沒有全部貼出來了。就貼出來了關鍵的程式碼。希望能對大家有幫助。
正文:
R.layout.download_promp佈局檔案
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:padding="8dp" android:id="@+id/download_notification_root" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/download_promp_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:orientation="vertical" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/download_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/download_promp_info" android:paddingTop="8dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
1.這段程式碼提供給大家演示,直接建立一個方法,把一下程式碼copy到方法內就可以使用了
NotificationManager motificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification(); notification.icon = R.mipmap.ic_launcher_round; //新增聲音提示 notification.defaults = Notification.DEFAULT_SOUND; /* 或者使用以下幾種方式 * notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); * notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); * 如果想要讓聲音持續重複直到使用者對通知做出反應,則可以在notification的flags欄位增加"FLAG_INSISTENT" * 如果notification的defaults欄位包括了"DEFAULT_SOUND"屬性,則這個屬性將覆蓋sound欄位中定義的聲音 */ //audioStreamType的值必須AudioManager中的值,代表響鈴模式 notification.audioStreamType = AudioManager.ADJUST_LOWER; //新增LED燈提醒 notification.defaults |= Notification.DEFAULT_LIGHTS; //或者可以自己的LED提醒模式: /*notification.ledARGB = 0xff00ff00; notification.ledOnMS = 300; //亮的時間 notification.ledOffMS = 1000; //滅的時間 notification.flags |= Notification.FLAG_SHOW_LIGHTS;*/ //新增震動 notification.defaults |= Notification.DEFAULT_VIBRATE; //或者可以定義自己的振動模式: /*long[] vibrate = {0,100,200,300}; //0毫秒後開始振動,振動100毫秒後停止,再過200毫秒後再次振動300毫秒 notification.vibrate = vibrate;*/ //狀態列提示資訊 notification.tickerText = mUpdateInfo.getAppname()+" 發現新版本,點選下載"; //獲取當前時間 notification.when = System.currentTimeMillis(); //載入自定義佈局 notification.contentView = getRemoteViews(context,"發現新版本,點選下載"); // 點選清除按鈕或點選通知後會自動消失 notification.flags |= Notification.FLAG_AUTO_CANCEL; //開始顯示訊息 motificationManager.notify(0, notification);
2、這段是我們自定義的通知欄佈局
//自定義notification佈局 public static RemoteViews getRemoteViews(Context context,String info) { RemoteViews remoteviews = new RemoteViews(context.getPackageName(),R.layout.download_promp); remoteviews.setImageViewResource(R.id.download_promp_icon,R.mipmap.ic_launcher_round); remoteviews.setTextViewText(R.id.download_title,mUpdateInfo.getAppname()); remoteviews.setTextViewText(R.id.download_promp_info,info); //找到對應的控制元件(R.id.download_notification_root),為控制元件新增點選事件getPendingIntent(context) remoteviews.setOnClickPendingIntent(R.id.download_notification_root,getPendingIntent(context)); return remoteviews; }
R.id.download_notification_root),為控制元件新增點選事件getPendingIntent(context) remoteviews.setOnClickPendingIntent(R.id.download_notification_root,getPendingIntent(context)); return remoteviews; }
/**
* 給通知欄新增點選事件,實現具體操作,我們這裡將資訊傳送到Service中,在服務中去做具體操作。也可以不將資訊傳送到Service中
* @param context 上下文
* @return
*/
private PendingIntent getPendingIntent(Context context) {
Intent intent = new Intent(context,UpdateService.class);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("msg","Test傳送到Service");
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,0);
return pendingIntent;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//這個是在Service中的onStart() 中去獲取資訊
String msg = getIntent().getStringExtra("msg");
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
//這個是在Service中的onStart() 中去獲取資訊
String msg = getIntent().getStringExtra("msg");
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
或者我們將資訊傳送到我們需要接受的Activity中,並且在Activity中的onCreate中去獲取訊息。
private PendingIntent getPendingIntent() {
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("msg","從通知欄點選進來的");
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String msg = getIntent().getStringExtra("msg");
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
接下來可以檢視一下別的博主寫的:
====》
博主寫的很不錯,細節都做的很詳細。可以提供給我們學習使用。點選開啟連結
(
1
)、使用系統定義的Notification
以下是使用示例程式碼:
//建立一個NotificationManager的引用
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager)getSystemService(ns);
// 定義Notification的各種屬性
int icon = R.drawable.icon; //通知圖示
CharSequence tickerText = "Hello"; //狀態列顯示的通知文字提示
long when = System.currentTimeMillis(); //通知產生的時間,會在通知資訊裡顯示
//用上面的屬性初始化 Nofification
Notification notification = new Notification(icon,tickerText,when);
/*
* 新增聲音
* notification.defaults |=Notification.DEFAULT_SOUND;
* 或者使用以下幾種方式
* notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
* notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
* 如果想要讓聲音持續重複直到使用者對通知做出反應,則可以在notification的flags欄位增加"FLAG_INSISTENT"
* 如果notification的defaults欄位包括了"DEFAULT_SOUND"屬性,則這個屬性將覆蓋sound欄位中定義的聲音
*/
/*
* 新增振動
* notification.defaults |= Notification.DEFAULT_VIBRATE;
* 或者可以定義自己的振動模式:
* long[] vibrate = {0,100,200,300}; //0毫秒後開始振動,振動100毫秒後停止,再過200毫秒後再次振動300毫秒
* notification.vibrate = vibrate;
* long陣列可以定義成想要的任何長度
* 如果notification的defaults欄位包括了"DEFAULT_VIBRATE",則這個屬性將覆蓋vibrate欄位中定義的振動
*/
/*
* 新增LED燈提醒
* notification.defaults |= Notification.DEFAULT_LIGHTS;
* 或者可以自己的LED提醒模式:
* notification.ledARGB = 0xff00ff00;
* notification.ledOnMS = 300; //亮的時間
* notification.ledOffMS = 1000; //滅的時間
* notification.flags |= Notification.FLAG_SHOW_LIGHTS;
*/
/*
* 更多的特徵屬性
* notification.flags |= FLAG_AUTO_CANCEL; //在通知欄上點選此通知後自動清除此通知
* notification.flags |= FLAG_INSISTENT; //重複發出聲音,直到使用者響應此通知
* notification.flags |= FLAG_ONGOING_EVENT; //將此通知放到通知欄的"Ongoing"即"正在執行"組中
* notification.flags |= FLAG_NO_CLEAR; //表明在點選了通知欄中的"清除通知"後,此通知不清除,
* //經常與FLAG_ONGOING_EVENT一起使用
* notification.number = 1; //number欄位表示此通知代表的當前事件數量,它將覆蓋在狀態列圖示的頂部
* //如果要使用此欄位,必須從1開始
* notification.iconLevel = ; //
*/
//設定通知的事件訊息
Context context = getApplicationContext(); //上下文
CharSequence contentTitle = "My Notification"; //通知欄標題
CharSequence contentText = "Hello World!"; //通知欄內容
Intent notificationIntent = new Intent(this,Main.class); //點選該通知後要跳轉的Activity
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
//把Notification傳遞給 NotificationManager
mNotificationManager.notify(0,notification);
如果想要更新一個通知,只需要在設定好notification之後,再次呼叫 setLatestEventInfo(),然後重新發送一次通知即可,即再次呼叫notify()。
(2)、使用自定義的 Notification
要建立一個自定義的Notification,可以使用RemoteViews。要定義自己的擴充套件訊息,首先 要初始化一個RemoteViews物件,然後將它傳遞給Notification的contentView欄位,再把PendingIntent傳遞給 contentIntent欄位。以下示例程式碼是完整步驟:
//1、建立一個自 定義的訊息佈局 view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/image" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:layout_marginRight="10dp" />
<TextView android:id="@+id/text" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:textColor="#000" />
</LinearLayout>
//2、 在程式程式碼中使用RemoteViews的方法來定義image和text。然後把RemoteViews物件傳到contentView欄位
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.view);
contentView.setImageViewResource(R.id.image,R.drawable.icon);
contentView.setTextViewText(R.id.text,”Hello,this message is in a custom expanded view”);
notification.contentView = contentView;
//3、 為Notification的contentIntent欄位定義一個Intent(注意,使用自定義View不需要 setLatestEventInfo()方法)
Intent notificationIntent = new Intent(this,Main.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.contentIntent = contentIntent;
//4、傳送通知
mNotificationManager.notify(2,notification);
// 以下是全部示例程式碼
//建立一個 NotificationManager的引用
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager)getSystemService(ns);
// 定義Notification的各種屬性
int icon = R.drawable.icon; //通知圖示
CharSequence tickerText = "Hello"; //狀態列顯示的通知文字提示
long when = System.currentTimeMillis(); //通知產生的時間,會在通知資訊裡顯示
//用上面的屬性初始化 Nofification
Notification notification = new Notification(icon,tickerText,when);
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.view);
contentView.setImageViewResource(R.id.image, R.drawable.iconempty);
contentView.setTextViewText(R.id.text, "Hello,this is JC");
notification.contentView = contentView;
Intent notificationIntent = new Intent(this,Main.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
notification.contentIntent = contentIntent;
//把Notification傳遞給NotificationManager
mNotificationManager.notify(0,notification);
《=====