notification後,程式應該如何響應

weixin_33831673發表於2013-09-23

一般來講,點選一個notification後,都會開啟一個Activity做為對點選事件的響應,這個Activity是之前在PendingIntent中設定好的。

經常玩Android手機的應該都有印象,在日曆應用中,你新建一個提醒,當提醒通知收到後,你點選通知,會進入提醒的內容頁面,如果這個時候按back鍵,會直接退出應用。

但是在Gmail的應用中,如果有一封新郵件到來,那麼點選通知後,會進入到郵件的內容頁面,等你看完郵件,點選back鍵,會退到郵件列表頁面,再按back鍵,才會退出應用。

 

我們總結一下兩種情況,假設我們的應用有兩個Activity(ParentActivity、SubActivity),notification中設定開啟的Activity為SubActivity。

那麼第一種情況就是:

點選Notification ——>進入SubActivity ——> back鍵 ——> 退出應用

第二種情況:

點選Notification ——>進入SubActivity ——> back鍵 ——> 退到ParentActivity ——>back鍵 ——>退出應用

 

第一種情況比較簡單,只需要在PendingIntent中指定Activity,不需要其他設定,Android預設的就這樣。

 

Java程式碼  收藏程式碼
  1. PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);  

但是在建立PendingIntent的時候需要注意引數PendingIntent.FLAG_CANCEL_CURRENT

這個標誌位用來指示:如果當前的Activity和PendingIntent中設定的intent一樣,那麼久先取消當前的Activity,用PendingIntent中指定的Activity取代之。

另外,需要在Manifest中對指定的Activity設定屬性

 

Java程式碼  收藏程式碼
  1. <activity android:name=".SubActivityl"  
  2.         android:launchMode="singleTask"  
  3.         android:taskAffinity=""  
  4.         android:excludeFromRecents="true">  
  5. </activity>  

 

 

第二種情況稍微複雜點,因為如果只開啟一個SubActivity,程式並沒辦法知道他的上一級Activity是誰,所以需要在點選 Notification時開啟一組Activity,但是我們並不需要一個個去呼叫startActivity方法,PendingIntent提供了 個靜態方法getActivities,裡面可以設定一個Intent陣列,用來指定一系列的Activity。

所以我們首先寫一個函式建立一個Activity陣列:

 

Java程式碼  收藏程式碼
  1. Intent[] makeIntentStack(Context context) {  
  2.     Intent[] intents = new Intent[2];  
  3.     intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));  
  4.     intents[1] = new Intent(context,  com.example.notificationtest.SubActivity.class);  
  5.     return intents;  
  6. }  

 

 其中需要注意的是Intent.makeRestartActivityTask方法,這個方法用來建立activity棧的根activity

接下來,建立並顯示Notification:

 

Java程式碼  收藏程式碼
    1. void showNotification(Intent intent) {  
    2.     Notification notification = new Notification(  
    3.             R.drawable.status_icon,   
    4.             "Hello World ticker text",  
    5.             System.currentTimeMillis());  
    6.   
    7.     PendingIntent contentIntent = PendingIntent.getActivities(  
    8.             this,  
    9.             0,  
    10.             makeIntentStack(this),   
    11.             PendingIntent.FLAG_CANCEL_CURRENT);  
    12.     notification.setLatestEventInfo(  
    13.             this,   
    14.             "Title",  
    15.             "Hey, shall we have a dinner tonight",   
    16.             contentIntent);  
    17.     notification.flags |= Notification.DEFAULT_ALL;  
    18.   
    19.     mNM.notify(1, notification);  
    20. }

相關文章