[Android]任務(wù)列表中顯示"小程序"的原理分析

摘要:談?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)容凹嘲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末师倔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子周蹭,更是在濱河造成了極大的恐慌趋艘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凶朗,死亡現(xiàn)場(chǎng)離奇詭異瓷胧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)棚愤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門搓萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宛畦,你說(shuō)我怎么就攤上這事瘸洛。” “怎么了次和?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵反肋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我踏施,道長(zhǎng)石蔗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任读规,我火速辦了婚禮抓督,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘束亏。我一直安慰自己铃在,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布碍遍。 她就那樣靜靜地躺著定铜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怕敬。 梳的紋絲不亂的頭發(fā)上揣炕,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音东跪,去河邊找鬼畸陡。 笑死鹰溜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丁恭。 我是一名探鬼主播曹动,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牲览!你這毒婦竟也來(lái)了墓陈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤第献,失蹤者是張志新(化名)和其女友劉穎贡必,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庸毫,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仔拟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飒赃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理逊。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盒揉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兑徘,我是刑警寧澤刚盈,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挂脑,受9級(jí)特大地震影響藕漱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崭闲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一肋联、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刁俭,春花似錦橄仍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至如孝,卻和暖如春宪哩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背第晰。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工锁孟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彬祖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓品抽,卻偏偏與公主長(zhǎng)得像储笑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桑包,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容