Notification详解
1. 創(chuàng)建notification
Notification.Builder builder = new Notification.Builder(this).setSmallIcon(R.id.icon).setContentTitle("標(biāo)題").setContentText("詳細(xì)文本");通過(guò)Builder模式創(chuàng)建Notification.Builder實(shí)例,有了builder對(duì)象,可以給它添加各種屬性,例如標(biāo)題,內(nèi)容,圖標(biāo)等
2. 定義Action
給點(diǎn)擊Notification后要執(zhí)行的操作增加一個(gè)Intent,由于這個(gè)Intent不是馬上就執(zhí)行的,而是有用戶觸發(fā)的,所以Android給這樣的Intent提供了一個(gè)延遲意圖PendingIntent來(lái)幫助我們完成這樣的操作
PendingIntent的使用非常簡(jiǎn)單,只需要在Intent的基礎(chǔ)上包裝一層就可以了,代碼如下所示
Intent resultIntent = new Intent(this, ResultActivity.class); PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);這樣當(dāng)點(diǎn)擊Notification后,就會(huì)觸發(fā)PendingIntent事件,跳轉(zhuǎn)到指定的Activity
3. 設(shè)置點(diǎn)擊事件
builder.setContentIntent(resultPendingIntent);注意事項(xiàng):當(dāng)點(diǎn)擊通知跳轉(zhuǎn)到Activity的時(shí)候,Activity會(huì)重新走生命周期,想要保持原來(lái)的狀態(tài),需要給Activity配置一個(gè)launchMode = “singleTask”
4. 發(fā)送通知
通過(guò)NotificationManager通知管理器的notify()方法來(lái)發(fā)送Notification,并給Notification一個(gè)id值,這個(gè)id會(huì)在更新Notification的時(shí)候用到
NotificationManager mNotifyMgr =(NotificationManager) getSystemService(NOTIFICATION_SERVICE); int mNotificationId = 001; mNotifyMgr.notify(mNotificationId, builder.build());5. 使用BigView樣式
Notification.Builder builder = new Notification.Builder(this).setSmallIcon(R.drawable.ic_stat_notification).setContentTitle(getString(R.string.notification)).setContentText(getString(R.string.ping)).setDefaults(Notification.DEFAULT_ALL).setStyle(new NotificationCompat.BigTextStyle().bigText(msg)).addAction (R.drawable.ic_stat_dismiss,getString(R.string.dismiss), piDismiss).addAction (R.drawable.ic_stat_snooze,getString(R.string.snooze), piSnooze);6. 顯示Notification進(jìn)度
int id = 1; ... NotificationManager mNotifyManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder mBuilder = new Notification.Builder(this); mBuilder.setContentTitle("Picture Download").setContentText("Download in progress").setSmallIcon(R.drawable.ic_notification);new Thread(new Runnable() {@Overridepublic void run() {int i;for (i = 0; i <= 100; i+=5) {mBuilder.setProgress(100, i, false);mNotifyManager.notify(id, mBuilder.build());Thread.sleep(5*1000);}mBuilder.setContentText("Download complete").setProgress(0,0,false);mNotifyManager.notify(id, mBuilder.build());}} ).start();7. 更新通知
根據(jù)id來(lái)更新通知
8. 自定義通知布局
Notification的自定義布局通過(guò)RemoteViews去實(shí)現(xiàn),調(diào)用Notification.Builder的setCustomContentView()方法設(shè)置自定義的布局
//通過(guò)RemoteViews來(lái)創(chuàng)建自定義的Notification視圖 RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification); contentView.setTextViewText(R.id.tv, "show me when collapsed");Notification.Builder builder = new Notification.Builder(this).setCustomContentView(contentView);折疊式Notification
折疊式Notification 也是一種自定義視圖的Notification ,常常用于顯示長(zhǎng)文本。它擁有兩個(gè)視圖狀態(tài), 一個(gè)是普通狀態(tài)下的視圖狀態(tài), 另一個(gè)是展開狀態(tài)下的視圖狀態(tài)。在Notitication中,使用RemoteViews 來(lái)幫助我們創(chuàng)建一個(gè)自定義的Notification 視圖,代碼如下所示。
//通過(guò)RemoteViews來(lái)創(chuàng)建自定義的Notification視圖RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notification);contentView.setTextViewText(R.id.tv,"show me when collapsed");懸掛式Notification
觸發(fā)懸掛式的Notification的條件有
- Activity處于全屏模式
- Notification擁有很高的優(yōu)先級(jí)
Notification的顯示等級(jí)
Android 5.x 將Notification分成了三個(gè)等級(jí)
- VISIBILITY_PRIVATE:表面只有當(dāng)沒(méi)有鎖屏的時(shí)候才能夠顯示
- VISIBILITY_PUBLIC:表明任何情況下都會(huì)顯示
- VISIBILITY_SECRET:表明在pin,password等安全鎖和沒(méi)有鎖屏的情況下才能夠顯示
設(shè)置Notification的顯示等級(jí)
Notification.Builder builder = new Notification.Builder(this).setVisibility(Notification.VISIBILITY_PRIVATE);9. 創(chuàng)建一個(gè)常規(guī)的activity延遲意圖
<activity android:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity> <activity android:name=".ResultActivity"android:parentActivityName=".MainActivity"><meta-data android:name="android.support.PARENT_ACTIVITY"android:value=".MainActivity"/> </activity>為Intent創(chuàng)建一個(gè)回退棧
... Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); // Adds the back stack stackBuilder.addParentStack(ResultActivity.class); // Adds the Intent to the top of the stack stackBuilder.addNextIntent(resultIntent); // Gets a PendingIntent containing the entire back stack PendingIntent resultPendingIntent =stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); ... NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(id, builder.build());10. 創(chuàng)建一個(gè)特別的activity延遲意圖
<activity android:name=".ResultActivity"...android:launchMode="singleTask"android:taskAffinity=""android:excludeFromRecents="true"> </activity> ...NotificationCompat.Builder builder = new NotificationCompat.Builder(this);Intent notifyIntent = new Intent(this, ResultActivity.class); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);PendingIntent notifyPendingIntent =PendingIntent.getActivity(this,0,notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(notifyPendingIntent);NotificationManager mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mNotificationManager.notify(id, builder.build());11、Android 7.0 通知新特性
在Android N中重新設(shè)計(jì)了通知,可以達(dá)到更容易、更快使用的效果。一些主要的變化包括:
模板更新:更新了通知模板重點(diǎn)內(nèi)容和頭像。開發(fā)者將能夠利用的新模板的優(yōu)勢(shì),在他們的代碼中實(shí)現(xiàn)最低限度的調(diào)整。
捆綁通知:Android N的通知功能也更加人性化,現(xiàn)在會(huì)自動(dòng)將相同應(yīng)用的通知捆綁在一起,實(shí)現(xiàn)分組顯示,并且通過(guò)兩指滑動(dòng)實(shí)現(xiàn)預(yù)覽,理論上用戶可以在通知界面直接閱讀郵件等內(nèi)容。
直接回復(fù):對(duì)于實(shí)時(shí)通信應(yīng)用程序,Android系統(tǒng)支持在線回復(fù),使用戶可以以短信或短信通知界面內(nèi)快速、直接響應(yīng)。
自定義視圖:兩個(gè)新的 API 讓用戶在通知中使用自定義視圖。
Android N 開發(fā)者預(yù)覽版的通知系統(tǒng)中還加入了兩個(gè)全新的 API 接口:Direct Replies 和 Bundling。前者支持為第三方應(yīng)用的通知加入快速回復(fù)和快捷操作,后者則允許同時(shí)發(fā)出多條通知的應(yīng)用進(jìn)行通知拆分。
當(dāng)一款應(yīng)用完美的適配了 Android N,當(dāng)收到一條消息時(shí)就可以直接在下拉通知抽屜甚至是鎖屏中直接呼出輸入框進(jìn)行回復(fù),或是選擇事先設(shè)定好的快速處理操作(標(biāo)記為已讀、轉(zhuǎn)發(fā)等)。而當(dāng)用戶同時(shí)收到來(lái)自不同聯(lián)系人的消息時(shí),可以點(diǎn)擊知卡片上的通知拆分按鈕對(duì)已經(jīng)合并的通知進(jìn)行拆分,拆分后的通知可以像其他的獨(dú)立通知一樣進(jìn)行回復(fù)和處理。
當(dāng)然,現(xiàn)階段適配了這兩個(gè)特性的應(yīng)用屈指可數(shù),除了 Google 的環(huán)聊、Messenger 以及 Gmail 等應(yīng)用以外,目前僅發(fā)現(xiàn)第三方 Telegram 客戶端 Plus Messenger 支持以上功能。
面對(duì)各種應(yīng)用的通知推送, Android N取以優(yōu)先級(jí)為核心的通知管理方式,而在 Android N中,通知管理也變得更加簡(jiǎn)單:只需在需要在相應(yīng)的通知上左右輕掃便能看見(jiàn)一個(gè)設(shè)置圖標(biāo),點(diǎn)擊該圖標(biāo)就能在通知上方呼出一個(gè)簡(jiǎn)潔的通知優(yōu)先級(jí)設(shè)定界面,在這個(gè)界面可以將應(yīng)用通知設(shè)定為“靜默顯示”、“阻攔所有通知”和“默認(rèn)”三個(gè)等級(jí)。
如果在”系統(tǒng)界面調(diào)諧器 - 其它“中打開了”Show full importance settings”功能,這三個(gè)等級(jí)又將變?yōu)椤逼帘?- 低 - 一般 - 高 - 緊急”5 個(gè),設(shè)定的方式也由縱列選項(xiàng)變?yōu)樽笥一瑒?dòng)。這個(gè)看似新穎的設(shè)計(jì)實(shí)際上是對(duì)現(xiàn)有通知管理操作的一次簡(jiǎn)化,在 Android 6.0 中需要在兩個(gè)界面來(lái)回跳轉(zhuǎn)才能完成的操作,在Android 7.0只用在一個(gè)界面就可以搞定。
同時(shí),Google 也將其對(duì)通知優(yōu)先級(jí)的定義從”幕后”搬到了”臺(tái)前”,在進(jìn)行完整的五層次優(yōu)先級(jí)設(shè)定時(shí) Google 還會(huì)提醒不同優(yōu)先級(jí)所對(duì)應(yīng)的通知效果。最后,勿擾模式也在 Android N 中得到了完善,加入了自動(dòng)規(guī)則并允許用戶在“請(qǐng)勿打擾”模式下屏蔽靜音通知的彈窗甚至是手機(jī)的通知指示燈。
發(fā)送一個(gè)通知
private int i = 0; private NotificationManager mNotificationManager; private static final String GROUP_NAME = "com.heima.notification_type";//[1]獲取一個(gè)NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //[2]創(chuàng)建一個(gè)Notification //[2.1]需要給這個(gè)Notification對(duì)象指定icon,標(biāo)題,內(nèi)容, final Notification builder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_notification).setContentTitle(getString(R.string.app_name)).setContentText("這是一個(gè)消息通知").setAutoCancel(true).setGroup(GROUP_NAME).build(); //[3]發(fā)送一個(gè)通知 需要指定一個(gè)Notification對(duì)象和一個(gè)id,這個(gè)id必須是唯一的 mNotificationManager.notify(i++, builder); updateNotificationSummary();多個(gè)通知放入到一個(gè)組內(nèi)
//[4]創(chuàng)建一個(gè)notification組 String notificationContent = "傳智播客" + i; final NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_notification).setStyle(new NotificationCompat.BigTextStyle().setSummaryText(notificationContent)).setGroup(GROUP_NAME).setGroupSummary(true); final Notification notification = builder.build(); //[5]發(fā)送這個(gè)notification組 mNotificationManager.notify(101, notification);可以回復(fù)的通知
private NotificationManager mNotificationManager; //[1]獲取一個(gè)NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //[2]創(chuàng)建remoteInput對(duì)象,這個(gè)對(duì)象指定了這個(gè)notification的標(biāo)題和一個(gè)key String replyLabel = getResources().getString(R.string.app_name); RemoteInput remoteInput = new RemoteInput.Builder("heima").setLabel(replyLabel).build(); //[3]創(chuàng)建一個(gè)Action對(duì)象 可以指定用戶一個(gè)友好的輸入提示,可以指定跳轉(zhuǎn)意圖, Intent deleteIntent = new Intent(""); Notification.Action action =new Notification.Action.Builder(R.mipmap.ic_launcher,"請(qǐng)輸入內(nèi)容", PendingIntent.getActivity(this, 10002, deleteIntent, 0)).addRemoteInput(remoteInput).build();//[3]創(chuàng)建一個(gè)Notification對(duì)象 Notification notification =new Notification.Builder(this).setSmallIcon(R.mipmap.ic_notification).setContentTitle("傳智播客").setContentText("消息通知").addAction(action).build();//[4]發(fā)送這個(gè)notification mNotificationManager.notify(1, notification); public class MainActivity extends Activity {private int i = 0;private NotificationManager mNotificationManager;private static final String GROUP_NAME = "com.heima.notification_type";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void sendNotification(View v){//[1]獲取一個(gè)NotificationManagermNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//[2]創(chuàng)建一個(gè)Notification//[2.1]需要給這個(gè)Notification對(duì)象指定icon,標(biāo)題,內(nèi)容,final Notification builder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_notification).setContentTitle(getString(R.string.app_name)).setContentText("這是一個(gè)消息通知").setAutoCancel(true).setGroup(GROUP_NAME).build();//[3]發(fā)送一個(gè)通知 需要指定一個(gè)Notification對(duì)象和一個(gè)id,這個(gè)id必須是唯一的mNotificationManager.notify(i++, builder);}public void sendGroup(View v){//[1]獲取一個(gè)NotificationManagermNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//[2]創(chuàng)建一個(gè)Notification//[2.1]需要給這個(gè)Notification對(duì)象指定icon,標(biāo)題,內(nèi)容,final Notification builder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_notification).setContentTitle(getString(R.string.app_name)).setContentText("這是一個(gè)消息通知").setAutoCancel(true).setGroup(GROUP_NAME).build();//[3]發(fā)送一個(gè)通知 需要指定一個(gè)Notification對(duì)象和一個(gè)id,這個(gè)id必須是唯一的mNotificationManager.notify(i++, builder);//[4]創(chuàng)建一個(gè)notification組String notificationContent = "傳智播客" + i;final NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_notification).setStyle(new NotificationCompat.BigTextStyle().setSummaryText(notificationContent)).setGroup(GROUP_NAME).setGroupSummary(true);final Notification notification = builder1.build();//[5]發(fā)送這個(gè)notification組mNotificationManager.notify(101, notification);}public void send(View v){//[1]獲取一個(gè)NotificationManagermNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//[2]創(chuàng)建remoteInput對(duì)象,這個(gè)對(duì)象指定了這個(gè)notification的標(biāo)題和一個(gè)keyString replyLabel = getResources().getString(R.string.app_name);RemoteInput remoteInput = new RemoteInput.Builder("heima").setLabel(replyLabel).build();//[3]創(chuàng)建一個(gè)Action對(duì)象 可以指定用戶一個(gè)友好的輸入提示,可以指定跳轉(zhuǎn)意圖,Intent deleteIntent = new Intent(this,MainActivity.class);Notification.Action action =new Notification.Action.Builder(R.mipmap.ic_launcher,"請(qǐng)輸入內(nèi)容", PendingIntent.getActivity(this, 10002, deleteIntent, 0)).addRemoteInput(remoteInput).build();//[3]創(chuàng)建一個(gè)Notification對(duì)象Notification notification =new Notification.Builder(this).setSmallIcon(R.mipmap.ic_notification).setContentTitle("傳智播客").setContentText("消息通知").addAction(action).build();//[4]發(fā)送這個(gè)notificationmNotificationManager.notify(1, notification);} }http://android.xsoftlab.net/guide/topics/ui/notifiers/notifications.html#CustomNotification
http://android.xsoftlab.net/design/patterns/notifications.html
自定義Notification
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextView android:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="自定義的notification" /><ProgressBar android:id="@+id/progressBar1"android:max="100"android:progress="50"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" /></LinearLayout>實(shí)現(xiàn)代碼
public class DemoActivity extends Activity {/ Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}public void click(View view){System.out.println("haha");//1.創(chuàng)建notification 的管理器NotificationManager manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);//2 .創(chuàng)建notification的實(shí)例Notification notification = new Notification();notification.flags = Notification.FLAG_AUTO_CANCEL;notification.icon = R.drawable.ic_launcher;notification.tickerText="自定義notification";//notification.contentView;//遠(yuǎn)程的view 我們的view對(duì)象 是要顯示在另外一個(gè)進(jìn)程里面 另外一個(gè)程序里面 所以就需要一個(gè)remote viewRemoteViews rv = new RemoteViews(getPackageName(), R.layout.custom_notification);rv.setTextViewText(R.id.textView1, "textview 自定義notification");rv.setProgressBar(R.id.progressBar1, 100, 50, false);notification.contentView = rv;Intent intent = new Intent(this,DemoActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);notification.contentIntent = pendingIntent;manager.notify(2, notification);} }總結(jié)
以上是生活随笔為你收集整理的Notification详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 屏幕适配
- 下一篇: Android序列化与反序列化