摘要:談?wù)勎⑿攀窃趺磳?shí)現(xiàn)在任務(wù)列表中顯示"小程序"的.
今天被小程序刷屏了^^ 我也來(lái)湊湊熱鬧.
談?wù)勎⑿攀窃趺磳?shí)現(xiàn)在任務(wù)列表中顯示"小程序"的.
效果
微信中打開了"滴滴(小程序)"后,
可以看到,任務(wù)列表不僅顯示了"微信", 還顯示了"滴滴(小程序)"的人口.
通過(guò)這個(gè)入口,就可以很方面的切換小程序了, 體驗(yàn)和原生程序也一樣一樣的.
分析
下面簡(jiǎn)單分析一下他的實(shí)現(xiàn).
1.Android系統(tǒng)中,顯示最近程序列表的View是RecentsPanelView.
他通過(guò)refreshRecentTasksList()加載程序列表,我們來(lái)看看代碼:
可以看到RecentTasksLoader mRecentTasksLoader負(fù)責(zé)真正處理數(shù)據(jù)加載.
RecentsPanelView.java
privateRecentTasksLoader mRecentTasksLoader;? * * *privatevoidrefreshRecentTasksList(? ? ArrayList recentTasksList,booleanfirstScreenful){if(mRecentTaskDescriptions ==null&& recentTasksList !=null){? ? ? onTasksLoaded(recentTasksList, firstScreenful);? ? }else{//加載最近的列表mRecentTasksLoader.loadTasksInBackground();? ? }? }
2.順著看看RecentTasksLoader的實(shí)現(xiàn):
這里可以清楚看到,加載的數(shù)據(jù)是ActivityManager.getRecentTasks().
也就是說(shuō)顯示的是Task列表.
RecentTasksLoader.java
ArrayList? getRecentTasks() {? ? ? cancelLoadingThumbnails();? ? ? ArrayList tasks =newArrayList();finalPackageManager pm = mContext.getPackageManager();finalActivityManager am = (ActivityManager)? ? ? ? ? ? ? mContext.getSystemService(Context.ACTIVITY_SERVICE);//獲取最近的TaskfinalList recentTasks =? ? ? ? ? ? ? am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);? ? ? * * *returntasks;? }
到這里,已經(jīng)很清楚了. 要顯示"小程序"入口, 只需要新建一個(gè)Task啟動(dòng)就好了~
是不是很簡(jiǎn)單啊.
來(lái)來(lái)來(lái)驗(yàn)證一下我們的想法.
這里使用adb shell dumpsys activity activities查看一下Task狀態(tài)
1. 只開啟微信
2. 開啟小程序
如下圖所示, 微信新開啟了一個(gè).AppBrandUI的task棧
實(shí)現(xiàn)
知道原理,實(shí)現(xiàn)就很簡(jiǎn)單了.
假設(shè)小程序的Activity是 TaskTestActivity,整個(gè)實(shí)現(xiàn)分兩步:
1. AndroidManifest.xml中為Activity設(shè)置taskAffinity
2. 以NEW_TASK方式啟動(dòng)Activity
//以Intent.FLAG_ACTIVITY_NEW_TASK方式啟動(dòng)ActivityIntentintent= newIntent(this, TaskTestActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);? ? startActivity(intent);
為什么要設(shè)置taskAffinity呢,
這和FLAG_ACTIVITY_NEW_TASK的特性有關(guān):
FLAG_ACTIVITY_NEW_TASK:設(shè)置此狀態(tài)冈绊,首先會(huì)查找是否存在和被啟動(dòng)的Activity具有相同的taskAffinity的task(注意同一個(gè)應(yīng)用程序中默認(rèn)所有activity 的taskAffinity是一樣的),如果有,剛直接把這個(gè)棧整體移動(dòng)到前臺(tái),并保持棧中的狀態(tài)不變,即棧中的activity順序不變袜腥,如果沒有,則新建一個(gè)棧來(lái)存放被啟動(dòng)的activity.
也就是說(shuō),如果App已經(jīng)啟動(dòng),即使用FLAG_ACTIVITY_NEW_TASK新起Activity, 因?yàn)閠askAffinity相同,也會(huì)被壓到一個(gè)task中, 自然recent panel 就看不到兩個(gè)入口了.
所以我們需要為小程序設(shè)置一個(gè)新的taskAffinity
下面是demo效果
拓展
讓自己的程序不顯示在任務(wù)列表中
有時(shí)候我們做一個(gè)工具, 或者后臺(tái)界面, 不希望顯示在程序列表中.
也很簡(jiǎn)單,只要設(shè)置task的屬性就好了
方法1:
在AndroidManifest.xml設(shè)置Activity的android:excludeFromRecents為true
方法2:
在啟動(dòng)Activity的時(shí)候加上Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSFLAG
//Activity不顯示在recent列表中.Intentintent= newIntent(this, TaskTestActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);startActivity(intent);
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載即寒,如需轉(zhuǎn)載請(qǐng)發(fā)送郵件至yqeditor@list.alibaba-inc.com;如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:yqgroup@service.aliyun.com 進(jìn)行舉報(bào)母赵,并提供相關(guān)證據(jù)逸爵,一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容凹嘲。