Android Notification詳解——響應notification事件

上一篇講了如何建立並顯示一個notification,這一篇就總結下點擊notification後,程序應該如何響應。java

 

通常來說,點擊一個notification後,都會打開一個Activity作爲對點擊事件的響應,這個Activity是以前在PendingIntent中設置好的。android

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

可是在Gmail的應用中,若是有一封新郵件到來,那麼點擊通知後,會進入到郵件的內容頁面,等你看完郵件,點擊back鍵,會退到郵件列表頁面,再按back鍵,纔會退出應用。函數

 

咱們總結一下兩種狀況,假設咱們的應用有兩個Activity(ParentActivity、SubActivity),notification中設置打開的Activity爲SubActivity。this

那麼第一種狀況就是:spa

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

第二種狀況:orm

點擊Notification ——>進入SubActivity ——> back鍵 ——> 退到ParentActivity ——>back鍵 ——>退出應用事件

 

第一種狀況比較簡單,只須要在PendingIntent中指定Activity,不須要其餘設置,Android默認的就這樣。get

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);

可是在建立PendingIntent的時候須要注意參數PendingIntent.FLAG_CANCEL_CURRENT

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

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

<activity android:name=".SubActivityl"  
        android:launchMode="singleTask"  
        android:taskAffinity=""  
        android:excludeFromRecents="true">  
</activity>

第二種狀況稍微複雜點,由於若是隻打開一個SubActivity,程序並沒辦法知道他的上一級Activity是誰,因此須要在點擊Notification時打開一組Activity,可是咱們並不須要一個個去調用startActivity方法,PendingIntent提供了個靜態方法getActivities,裏面能夠設置一個Intent數組,用來指定一系列的Activity。

因此咱們首先寫一個函數建立一個Activity數組:

Intent[] makeIntentStack(Context context) {  
    Intent[] intents = new Intent[2];  
    intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));  
    intents[1] = new Intent(context,  com.example.notificationtest.SubActivity.class);  
    return intents;  
}

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

接下來,建立並顯示Notification:

void showNotification(Intent intent) {  
    Notification notification = new Notification(  
            R.drawable.status_icon,   
            "Hello World ticker text",  
            System.currentTimeMillis());  
  
    PendingIntent contentIntent = PendingIntent.getActivities(  
            this,  
            0,  
            makeIntentStack(this),   
            PendingIntent.FLAG_CANCEL_CURRENT);  
    notification.setLatestEventInfo(  
            this,   
            "Title",  
            "Hey, shall we have a dinner tonight",   
            contentIntent);  
    notification.flags |= Notification.DEFAULT_ALL;  
  
    mNM.notify(1, notification);  
}
相關文章
相關標籤/搜索