Android Notification詳解——響應notification事件

一般來講,點擊一個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默認的就這樣。

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);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章