概述
Notification大家肯定不會陌生,并且使用方式也十分簡單明了,使用場景也相對單一,所以除了基礎(chǔ)用法外,可能不會有太深入的了解,這篇文章主要講一下通知中比較冷門卻十分有用的使用方式,TaskStackBuilder
TaskStackBuilder
那什么是TaskStackBuilder?
- 首先,TaskStackBuilder在
android.app和android.support.v4.app2個包中都有,作用都差不多,不過v4包做了一些低版本的適配,省去了自己適配的工作量。 - 其次,TaskStackBuilder從字面意思可以看出,是任務(wù)棧的創(chuàng)造者,那開發(fā)者就可以自己創(chuàng)造符合需求的任務(wù)棧。
- 然后,上面所說的任務(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.
- 最后,沒有最后了。
使用
Do not talk the talk, walk the walk.
三步走,無煩惱
- 還是要先構(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));
- 使用
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)
- 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
下載
相關(guān)閱讀
Notification之----Android5.0實(shí)現(xiàn)原理(二)
Notification之----Android5.0實(shí)現(xiàn)原理(一)
Notification之---NotificationListenerService5.0實(shí)現(xiàn)原理
Notification之----自定義樣式
Notification之----默認(rèn)樣式