這里要注意幾點:
1. notification的各種方法及參數的應用
2. 舊版本的SDK和新版本的SDK消息推送的寫法是有些不一樣的
1. notification的各種方法及參數的應用
(1)消息提示音
/** * sound屬性是一個 Uri 對象。 可以在通知發出的時候播放一段音頻,這樣就能夠更好地告知用戶有通知到來. * 如:手機的/system/media/audio/ringtones 目錄下有一個 Basic_tone.ogg音頻文件, * 可以寫成: Uri soundUri = Uri.fromFile(new * File("/system/media/audio/ringtones/Basic_tone.ogg")); * notification.sound = soundUri; 我這里為了省事,就去了手機默認設置的鈴聲 */ Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); notification.sound = uri;
(2)LED燈閃爍
/** * 手機處於鎖屏狀態時, LED燈就會不停地閃爍, 提醒用戶去查看手機,下面是綠色的燈光一 閃一閃的效果 */ notification.ledARGB = Color.GREEN;// 控制 LED 燈的顏色,一般有紅綠藍三種顏色可選 notification.ledOnMS = 1000;// 指定 LED 燈亮起的時長,以毫秒為單位 notification.ledOffMS = 1000;// 指定 LED 燈暗去的時長,也是以毫秒為單位 notification.flags = Notification.FLAG_SHOW_LIGHTS;// 指定通知的一些行為,其中就包括顯示
(3) 手機震動
/** * vibrate屬性是一個長整型的數組,用於設置手機靜止和振動的時長,以毫秒為單位。 * 參數中下標為0的值表示手機靜止的時長,下標為1的值表示手機振動的時長, 下標為2的值又表示手機靜止的時長,以此類推。 */ long[] vibrates = { 0, 1000, 1000, 1000 }; notification.vibrate = vibrates;
(4)Pendingintent
網上描述:PendingIntent 可以看作是對intent的包裝,通常通過getActivity,getBroadcast ,getService來得到pendingintent的實例,當前activity並不能馬上啟動它所包含的intent,而是在外部執行 pendingintent時,調用intent的。正由於pendingintent中 保存有當前App的Context,使它賦予外部App一種能力,使得外部App可以如同當前App一樣的執行pendingintent里的 Intent, 就算在執行時當前App已經不存在了,也能通過存在pendingintent里的Context照樣執行Intent。另外還可以處理intent執行后的操作。常和alermanger 和notificationmanager一起使用。Intent一般是用作Activity、Sercvice、BroadcastReceiver之間傳遞數據,而Pendingintent,一般用在 Notification上,可以理解為延遲執行的intent,PendingIntent是對Intent一個包裝。
是不是看得稀里糊塗?個人理解,就是PendingIntent將創建的intent的包裝起來,並不是現在啟動,而是當你點擊消息欄的消息提示后跳轉,上面說當前App已經不存在,也能通過存在pendingintent里的context執行intent的,但當前我所舉的例子是不行的,因為當前app銷毀后,消息欄里的提示消息也會消失。
2. 舊版本的SDK和新版本的SDK消息推送的寫法是有些不一樣的
舊版本是可以通過notification.setLatestEventInfo()來寫消息通知的,但新版本這么寫會報錯。因為新版本setLatestEventInfo()方法里多了句@removed,所以這種方法是在新版本里用不了。我用的SDK版本是25,大概從23版開始就用不了該方法了吧。
下面分別用兩種方法示例:
(1)舊方法
/** * 創建通知管理類NotificationManager的實例,用來管理通知 */ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); /** * 創建通知類Notification實例(用來存儲通知所需的信息); 一共三個參數: * 1)、指定通知使用的圖標,如:R.drawable.ic_launcher ; * 2)、指定通知的ticker內容,通知被創建的時候,在狀態欄一閃而過,屬於瞬時提示信息。 * 3)、指定通知被創建的時間,以毫秒為單位,下拉狀態欄時,這個時間會顯示在相應的通知上。 */ Notification notification = new Notification( R.drawable.ic_launcher, "有通知來了", System.currentTimeMillis()); /** * 手機設置的默認提示音 */ Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); /** * sound屬性是一個 Uri 對象。 可以在通知發出的時候播放一段音頻,這樣就能夠更好地告知用戶有通知到來. * 如:手機的/system/media/audio/ringtones 目錄下有一個 Basic_tone.ogg音頻文件, * 可以寫成: Uri soundUri = Uri.fromFile(new * File("/system/media/audio/ringtones/Basic_tone.ogg")); * notification.sound = soundUri; 我這里為了省事,就去了手機默認設置的鈴聲 */ notification.sound = uri; /** * vibrate屬性是一個長整型的數組,用於設置手機靜止和振動的時長,以毫秒為單位。 * 參數中下標為0的值表示手機靜止的時長,下標為1的值表示手機振動的時長, 下標為2的值又表示手機靜止的時長,以此類推。 */ long[] vibrates = { 0, 1000, 1000, 1000 }; notification.vibrate = vibrates; /** * 手機處於鎖屏狀態時, LED燈就會不停地閃爍, 提醒用戶去查看手機,下面是綠色的燈光一 閃一閃的效果 */ notification.ledARGB = Color.GREEN;// 控制 LED 燈的顏色,一般有紅綠藍三種顏色可選 notification.ledOnMS = 1000;// 指定 LED 燈亮起的時長,以毫秒為單位 notification.ledOffMS = 1000;// 指定 LED 燈暗去的時長,也是以毫秒為單位 notification.flags = Notification.FLAG_SHOW_LIGHTS;// 指定通知的一些行為,其中就包括顯示 // LED 燈這一選項 /** * 如果不想進行那么多繁雜的設置,也可以直接使用通知的默認效果,它會根據當前手機的環境來決定播放什么鈴聲,以及如何振動 */ // notification.defaults = Notification.DEFAULT_ALL; /** * 實例化Intent,構建意圖:從當前頁面條狀到NotificationActivity頁面 */ Intent intent = new Intent(this, NotificationActivity.class); /** * 用於啟動活動、啟動服務以及發送廣播等。 根據需求來選擇是使用 * getActivity()方法、getBroadcast()方法、還是 getService() 方法。 一共四個參數: * 1)、第一個參數是 上下文Context ; 2)、 第二個參數一般用不到,通常都是傳入 0 即可 3)、第三個參數是一個 * Intent對象,我們可以通過這個對象構建出 PendingIntent 的“意圖”; 4)、第四個參數用於確定 * PendingIntent 的行為 */ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); /** * 設定通知標准的布局。四個參數: 1)、上下文對象Context; 2)、指定通知的標題內容,下拉系統狀態欄可看到; * 3)、指定通知的正文,下拉系統狀態欄可看到; 4)、用於啟動活動、啟動服務以及發送廣播 */ notification.setLatestEventInfo(this, "股票大漲", "今日萬科的股票停牌,應對惡意收購", pendingIntent); /** * 啟動通知. 兩個參數: 1)、id,保證每個通知的id唯一; 2)、Notification對象 */ manager.notify(1, notification);
(2)新方法
新的版本中官方建議用 Notification.Builder來創建 notification 實例
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(this); builder.setContentInfo("補充內容"); builder.setContentText("主內容區"); builder.setContentTitle("通知標題"); builder.setSmallIcon(R.drawable.ic_launcher); builder.setTicker("新消息"); builder.setAutoCancel(true); builder.setWhen(System.currentTimeMillis());//設置時間,設置為系統當前的時間 Intent intent = new Intent(this, NotificationActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); Notification notification = builder.build(); /** * vibrate屬性是一個長整型的數組,用於設置手機靜止和振動的時長,以毫秒為單位。 * 參數中下標為0的值表示手機靜止的時長,下標為1的值表示手機振動的時長, 下標為2的值又表示手機靜止的時長,以此類推。 */ long[] vibrates = { 0, 1000, 1000, 1000 }; notification.vibrate = vibrates; /** * 手機處於鎖屏狀態時, LED燈就會不停地閃爍, 提醒用戶去查看手機,下面是綠色的燈光一 閃一閃的效果 */ notification.ledARGB = Color.GREEN;// 控制 LED 燈的顏色,一般有紅綠藍三種顏色可選 notification.ledOnMS = 1000;// 指定 LED 燈亮起的時長,以毫秒為單位 notification.ledOffMS = 1000;// 指定 LED 燈暗去的時長,也是以毫秒為單位 notification.flags = Notification.FLAG_SHOW_LIGHTS;// 指定通知的一些行為,其中就包括顯示 // LED 燈這一選項 // Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); // notification.sound = uri; // notification.defaults = Notification.DEFAULT_ALL; manager.notify(1, notification);
源碼地址:
http://download.csdn.net/detail/u013293125/9736575
