www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

詳解Android Activity啟動模式

2018-05-21 15:13:27 ImaginationTech  點擊量: 評論 (0)
Android Activity啟動模式

相關的基本概念:

1、任務棧(Task)

若干個Activity的集合的棧表示一個Task。

棧不僅僅只包含自身程序的Activity,它也可以跨應用包含其他應用的Activity,這樣有利于保障用戶體驗,維護用戶操作體驗上的完整性。

例如:微信ActivityA 分享文章到QQActivityB,兩個activity是存在于不同app中的,但是被系統放在一個任務中,分享后,用戶按back鍵返回,可以返回到原來的微信Activity A中,這就確保了用戶體驗。

2、查看當前系統的任務棧

命令行中 -- > adb shell dumpsys activity

3、Activity 的相關屬性

android:taskAffinity:是否定義了該屬性,對接下來討論到的singleTask影響甚大,如果設置了Activity的taskAffinity屬性值,Activity將在TaskName為指定值的獨立Task中啟動,否則,將在原來的默認Task中。

android:allowTaskReparenting:主要作用是activity的遷移,程序A已經啟動了若干個Activity,其中包含Activity1(這個Activity1擁有該屬性),當程序B也要啟動它的時候,其可遷移到程序B內。

android:alwaysRetainTaskState:操作系統會在程序長時間不會動的時候,清除Task狀態,如果開啟這個,系統會繼續保持直到再次打開,只對根Activity生效(ABC,A是棧底,C是棧頂,只能對A即可)。例如微信在后臺,當我們再次打開應用時,系統會判斷是否已經存在以A為根Activity的棧,如果有,直接使用該棧,并顯示棧頂的Activity。

android:clearTaskOnLaunch:用來標記是否在啟動該Activity時,清除除根目錄的其他Activity

android:exported:是否支持其它應用調用當前組件。默認值:包含有intent-filter 默認值為true(); 沒有intent-filter默認值為false。

四種啟動模式:

standard:每次激活Activity時(startActivity),都創建Activity實例,并放入任務棧;

singleTop:如果該Activity位于任務棧棧頂,則不需要創建,復用實例并且會調用該實例的onNewIntent()方法將Intent對象傳遞到這個實例中,其余情況都要創建Activity實例;(singleTop模式,只在當前任務棧中生效、startActivityForResult啟動一個設置了singleTop的activity,singleTop模式將無效)

關于onNewIntent():

根據文檔知,當Activity的啟動模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP這個標記啟動新的Activity并且Activity棧頂就是待啟動的Activity的時候,會調用原Activity的這個方法;例子:QActivity為棧頂復用模式,當Qactivity位于棧頂時,再次打開,onResume() -- >onPause() -- >onNewIntent() -- >onResume() 。當Qactivity不位于棧頂時,onNewIntent-- >onRestart-- >onStart-- >onResume(也就是說只要棧頂不是Qactivity ,都會創建新的實例,是Qactivity則重用不新建)。

singleTask:使用好棧內復用模式對taskAffinity屬性的理解很重要。

存在相同taskAffinity屬性值的Task:不存在實例,則新建Activity實例。如果存在則把當前實例中復用實例, 這個 Activity 啟動并且清除頂部的 Acitivity ,通過標識 CLEAR_TOP。

taskAffinity屬性值不一樣的Task:在這個 Task 中新建這個 Activity 實例。

singleInstance:和singleTask差不多,唯一不同的是singleInstance Activity實例的Task只能存放一個該模式的Activity實例,例如Qactivity加載Wactivity都會被放入其它的Task中,如果存在與Wactivity相同affinity的Task,則在該Task內創建Wactivity。如果不存在,則重新生成新的Task并入棧。

常用Intent Flags:

FLAG_ACTIVITY_NEW_TASK:如果task中已經有了你要啟動的activity的話,當前task會被帶到前臺(不管這個activity是否在前臺,有可能activity上邊還壓有別的activity)。如果配合FLAG_ACTIVITY_NEW_MULTI_TASK,則無論什么情況都會創建新的Task,就成了類似 singleInstance 的情況了。如果配合 FLAG_ACTIVITY_CLEAR_TASK,則會先清空該棧,然后向棧中添加目標Activity,棧ID不變。

例如:Flag為FLAG_ACTIVITY_NEW_TASK,Qactivity(棧為LOL)啟動Wactivity(棧為DOTA),接著啟動Eactivity(棧為DOTA),Home回桌面。打開該應用,Qactivity啟動Wactivity,Eactvity會出現在前臺,因為它是整塊棧啟動(里面順序不變)。

FLAG_ACTIVITY_SINGLE_TOP:相當于launchMode中的singleTop。

FLAG_ACTIVITY_CLEAR_TOP:與singleTask類似,但有極大區別,它會銷毀目標Activity和它之上的所有Activity,重新創建目標Activity,并沒有執行onNewIntent()。

tips:指定啟動模式時,Flags的優先級大于launchMode,當兩者都有時,以Intent Flag有效。

注意事項:

1、當目標的啟動模式不為標準模式時,不要使用startActivityForResult去啟動目標,容易出現你意想不到的結果。

例如:(大概意思,startActivityForResult相當于白設置,會返回一個取消的結果)

2、當Activity執行了onDestroy,沒有執行finish,那么實例都還是存在棧里的。但Activity被finish掉了,則它會是新建實例重新入棧,不會按啟動模式想的那樣。

 

轉載自:http://www.cnblogs.com/wujiancheng/

大云網官方微信售電那點事兒

責任編輯:售電衡衡

免責聲明:本文僅代表作者個人觀點,與本站無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
?
主站蜘蛛池模板: 欧美黄免在线播放| 国产精品久久久久无毒| 男人的天堂在线观看免费| 久久精品国产第一区二区| 免费观看日本特色做爰视频在线| 久久99国产精一区二区三区| 久久久久性| 国产成人福利免费观看| 中文字幕成人免费高清在线 | 曰韩毛片| 亚洲欧美视频在线观看| 欧美肥婆videoxxx| 男人天堂视频在线| 国产成人精品三区| 一级一片一_级一片一| 亚洲成人中文| 久久精品久久精品久久精品| 精品午夜一区二区三区在线观看| 国产91色综合久久免费| 亚洲综合一区二区不卡| 窝窝人体色| 韩国免费a级毛片| 99re5久久在热线播放| 亚洲在线影院| 久久久久久久久久久视频国内精品视频| 久久精品中文字幕首页| 俄罗斯黄色毛片| 沈樵在线观看福利| 欧美精品亚洲精品日韩专区| 国产高清在线看| 亚洲成人在线免费| 欧美成人免费网在线观看| 国产第一页久久亚洲欧美国产| 亚洲一区二区影院| 日本高清色本在线www游戏| 国产精品99久久久久久宅男| 亚洲精品久久九九精品| 欧美一区二区三区免费| 国产tv在线| 欧美激情欧美狂野欧美精品免费| 精品一区二区三区亚洲|