Notification之----任務(wù)棧

概述

Notification大家肯定不會陌生,并且使用方式也十分簡單明了,使用場景也相對單一,所以除了基礎(chǔ)用法外,可能不會有太深入的了解,這篇文章主要講一下通知中比較冷門卻十分有用的使用方式,TaskStackBuilder

TaskStackBuilder

那什么是TaskStackBuilder?

  1. 首先,TaskStackBuilder在android.appandroid.support.v4.app2個包中都有,作用都差不多,不過v4包做了一些低版本的適配,省去了自己適配的工作量。
  2. 其次,TaskStackBuilder從字面意思可以看出,是任務(wù)棧的創(chuàng)造者,那開發(fā)者就可以自己創(chuàng)造符合需求的任務(wù)棧。
  3. 然后,上面所說的任務(wù)棧,是點(diǎn)擊Notification后,回退的任務(wù)棧。(默認(rèn)情況下,點(diǎn)擊Notification跳轉(zhuǎn)到Activity后,點(diǎn)擊back key,自動finish掉當(dāng)前Activity并且無后續(xù)動作),意思就是說,當(dāng)我們點(diǎn)擊back key后,除了finish掉當(dāng)前Activity,還能指定回退到哪個Activity.
  4. 最后,沒有最后了。

使用

Do not talk the talk, walk the walk.

三步走,無煩惱

  1. 還是要先構(gòu)造普通的Notification
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
 builder.setTicker("TaskStackNotification");
 builder.setContentTitle("TaskStackNotification");
 builder.setContentText("TaskStackNotification ContentText");
 builder.setSmallIcon(R.mipmap.ic_launcher);
 builder.setLargeIcon(BitmapFactory.decodeResource(Context.getResources(), R.mipmap.ic_launcher));
  1. 使用TaskStackBuilder來設(shè)置PendingIntent
 //實(shí)例化TaskStackBuilder 
 TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
//將ActivityA的父Activity加入棧中
 stackBuilder.addParentStack(ActivityA.class);
//將ActivityA加入棧中
 stackBuilder.addNextIntent(new Intent(mContext, ActivityA.class));
//將ActivityB加入棧中
 stackBuilder.addNextIntent(new Intent(mContext, ActivityB.class));

 PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);

棧的特點(diǎn)就是,先進(jìn)后出.
雖然你現(xiàn)在可能還不清楚addParentStack方法,沒關(guān)系,這個我們后面再講解,但是addNextIntent和它字面意思意思一樣,就是往棧中添加一個intent,這里我們可以理解為添加了一個intent對應(yīng)的Activity到棧中。
現(xiàn)在我們的棧中就有3個Activity了(1個parent,2個nextIntent)

  1. addParentStack方法的作用是,添加指定Activity的父Activity到棧中,那什么是父Activity呢?這里給出答案
  <activity android:name=".ActivityA"
       android:parentActivityName=".MainActivity">
   </activity>

在Androidmainifest.xml中,需要使用android:parentActivityName標(biāo)簽來配置父Activity指向的是哪個Activity。

那么現(xiàn)在,我們的棧中的3個Activity就是MainActivity --》ActivityA --》ActivityB,當(dāng)我們點(diǎn)擊通知的時候,會先顯示ActivityB,然后按back key的時候,就會回退到ActivityA ,然后是MainActivity

More

  • 根據(jù)上面的意思,其實(shí)主要是構(gòu)造自己的一個任務(wù)棧,如果你不想在Androidmainifest.xml中配置父Activity,也可以直接試用addNextIntent往棧里面添加Activity.
  • 當(dāng)我們使用addParentStack方法時,卻沒有配置父Activity時,是不會向棧中添加Activity的,相當(dāng)于寫了一句廢代碼.

其他方式

只有一種方式可以實(shí)現(xiàn)任務(wù)棧的需求嗎?
查看TaskStackBuilder 的源碼可以知道,TaskStackBuilder 的getPendingIntent方法,就是對

PendingIntent.getActivities

方法的封裝,注意這里是**getActivities **,而不是getActivity,所以我們直接試用PendingIntent的getActivities方法,不使用TaskStackBuilder 也能實(shí)現(xiàn)任務(wù)棧,這里直接給出代碼

    Intent[] in = new Intent[2];
    in[0] = new Intent(mContext, ActivityA.class);
    in[1] = new Intent(mContext, ActivityB.class);
    PendingIntent pendingIntent =
                      PendingIntent.getActivities(mContext, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pendingIntent);

這樣的,點(diǎn)擊通知后,會先跳轉(zhuǎn)到ActivityB,點(diǎn)擊back key后就回退到了ActivityA

下載

github

相關(guān)閱讀

Notification之----Android5.0實(shí)現(xiàn)原理(二)
Notification之----Android5.0實(shí)現(xiàn)原理(一)
Notification之---NotificationListenerService5.0實(shí)現(xiàn)原理
Notification之----自定義樣式
Notification之----默認(rèn)樣式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容