Android Notification 用法的4種形式
Android Notification在每一個Android應用開發中基本都會遇到,它可以按指定的規則向使用者推送一些訊息,是一項非常實用的功能。本文主要介紹了Android Notification 用法的4種形式,希望可以對各位Android開發者有所幫助。
實現通知一般有以下幾個步驟:
- 1.獲取通知服務物件NotificationManager
- 2.建立Notification物件
- 3.關聯intent
- 4.執行通知
Notification一般有幾種用途:,如下圖
1.啟動多次通知但只顯示一條
如果有很多通知的內容一樣,為了不影響系統通知顯示的列表過多,可以進行計數堆積,只顯示一條,程式碼如下:
btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { count++; //從系統服務中獲得通知管理器 NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE); //定義notification Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis()); n.flags=Notification.FLAG_AUTO_CANCEL; n.number=count; //通知訊息與Intent關聯 Intent it=new Intent(MainActivity.this,Second.class); it.putExtra("name", "name:"+count); PendingIntent pi=PendingIntent.getActivity(MainActivity.this, 100, it, PendingIntent.FLAG_CANCEL_CURRENT); //具體的通知內容 n.setLatestEventInfo(MainActivity.this, "標題", "啟動多次通知只顯示一條",pi); //執行通知 nm.notify(1, n); } });
點選4次後,效果如下:
這是由於nm.notify(1,n)的requestCode全相同導致的。
2.啟動多次通知,並且顯示多條,但只能用最新的一條跳轉至活動
btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { count++; //從系統服務中獲得通知管理器 NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE); //定義notification Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis()); n.flags=Notification.FLAG_AUTO_CANCEL; n.number=count; //通知訊息與Intent關聯 Intent it=new Intent(MainActivity.this,Second.class); it.putExtra("name", "name:"+count); PendingIntent pi=PendingIntent.getActivity(MainActivity.this, 100, it, PendingIntent.FLAG_CANCEL_CURRENT); //具體的通知內容 n.setLatestEventInfo(MainActivity.this, "標題", "啟動多次通知顯示多條,但只能用最新的通知跳轉到活動",pi); //執行通知 nm.notify(count, n); } });
結果如下:
點選第5,6條通知均不會跳轉,只有點選第7條才可跳轉。
而這是由於PendingIntent的RequestCode相同而導致的。
3.啟動多次通知,並且顯示多條,每一條通知都能跳轉至對應的活動
btn3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { count++; //從系統服務中獲得通知管理器 NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE); //定義notification Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis()); n.flags=Notification.FLAG_AUTO_CANCEL; n.number=count; //通知訊息與Intent關聯 Intent it=new Intent(MainActivity.this,Second.class); it.putExtra("name", "name:"+count); PendingIntent pi=PendingIntent.getActivity(MainActivity.this, count, it, PendingIntent.FLAG_CANCEL_CURRENT); //具體的通知內容 n.setLatestEventInfo(MainActivity.this, "標題", "啟動多次通知顯示多條,每一條通知都能跳轉到對應的活動",pi); //執行通知 nm.notify(count, n); } });
由於nm.notify(count,n)的code每次都不一樣,相當於為每一個通知關聯了一個屬於自己的intent,結果和上圖一致,只是每一個通知都可跳轉至對應活動。
4,自定義佈局
下圖中的第一條通知就是自定義的:
自定義佈局方式的通知和普通的方式唯一的區別就是載入了一個RemoteView,片段如下:
RemoteViews rv=new RemoteViews(MainActivity.this.getPackageName(),R.layout.notify); n.contentView=rv; //通知訊息與Intent關聯 Intent it=new Intent(MainActivity.this,Second.class); it.putExtra("name", "name:"+count); PendingIntent pi=PendingIntent.getActivity(MainActivity.this, count, it, 0); n.contentIntent=pi;
這個自定義通知我本來想實現定義一個按鈕,點選按鈕後取消通知。我的思路如下:
由於RemoteView並沒沒有類似findViewById的方法,所以我沒辦法找到新載入的佈局檔案上的控制元件,更沒辦法為其新增按鈕事件。
但是在關聯intent的時候,PendingIntent提供了較多的方法,其中主要有:
可以看到,可以關聯三大元件。
再者,RemoteView雖然沒有findViewById,但是他有setOnClickFillInIntent和setOnClickPendingIntent兩個方法
我先建立了一個廣播
//註冊廣播 BroadcastReceiver b=new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "button被點選了", 3000).show(); } }; IntentFilter filter=new IntentFilter(); filter.addAction("ONCLICK"); this.registerReceiver(b, filter);
然後在nm.notify後繼續設定控制元件的事件
//執行通知 nm.notify(count, n); //設定控制元件 rv.setTextViewText(R.id.tv2, "我是自定義佈局"); Intent clickIntent=new Intent("ONCLICK"); PendingIntent clickPending=PendingIntent.getBroadcast(MainActivity.this, count, clickIntent, 0); rv.setOnClickPendingIntent(R.id.cancel, clickPending);
結果並沒有執行,廣播根本沒接收到,我感覺程式碼是沒有問題的,檢視了下setOnClickPendingIntent,竟然說對LisetView等控制元件的事件不起作用,又檢視了setOnClickFillInIntent,這個貌似有用,系統還推薦了另外一個與之類似的方法,由於level級別不夠,不能使用,我也就沒有驗證,應該是可以的,不然那麼多應用好看的通知都是咋做的啊,先記下來,以後有需求的時候好好研究下。
參考程式碼:http://download.csdn.net/detail/kkkkkxiaofei/6723903
相關文章
- Android中的NotificationAndroid
- Android 《Notification》Android
- Android Dialog的7種形式實現方式Android
- Android 特殊使用者通知用法彙總 - Notification 原始碼分析Android原始碼
- Android Notification 詳解Android
- Android 通知之 NotificationAndroid
- android之Notification通知Android
- Android Intent的幾種用法全面總結AndroidIntent
- asp.net中形式的用法(原創)ASP.NET
- Android O 新特性 — NotificationAndroid
- Android通知Notification全面剖析Android
- Android Notification 通知詳解Android
- [php]建立物件的幾種形式PHP物件
- React 中的五種元件形式React元件
- Android之Notification和RemoteviewAndroidREMView
- [轉]Android 通知Notification 詳解Android
- Android 8 通知渠道(Notification Channels)Android
- android Notification 程式碼備份Android
- Android:layout_weight屬性的兩種用法Android
- 檢視日誌的幾種形式
- Android Notification 和曾經踩過的坑Android
- Android Notification通知欄的必備姿勢Android
- PostgreSQL 資料庫中 DISTINCT 關鍵字的 4 種用法SQL資料庫
- Android 深入理解 Notification 機制Android
- Android呼叫訊息欄通知(Notification)Android
- 代理定價收費的三種形式
- javascript中字串的兩種定義形式JavaScript字串
- FMDB使用的資料庫的三種形式資料庫
- struct的一種用法Struct
- Android N新特性——Notification快速回復Android
- Android Push Notification實現資訊推送功能Android
- oracle 索引和不走索引的幾種形式Oracle索引
- ton函式函式hash的兩種形式函式
- javascript 函式中的 this 的四種繫結形式JavaScript函式
- Android Toolbar的用法Android
- Python標準庫datetime中4種基本物件的用法Python物件
- android懸浮框(service形式)Android
- Android 之 Notification 必須掌握知識點Android