Android動態設置啟動模式


在《Activity四大啟動模式》 https://www.cnblogs.com/diyishijian/p/7705588.html 一文中,我們講述了Activity的四種啟動模式,並分析了每種啟動模式的特點。

在上述所有情況,都是我們在Manifest中設置的(通過launchMode屬性設置),這個被稱為靜態設置(我們寫程序寫多了會發現有靜態就有動態,而且靜態多數在xml設置,動態在java代碼設置),接下來我們來看一下如何動態設置Activity啟動模式。

 

注):如果同時有動態和靜態設置,那么動態的優先級更高。

 

1、關於動態設置與靜態設置的理解:

  靜態設置,可以理解為通知別人:就是當我被創建的時候,我告訴你我是通過這種模式啟動的。

  動態設置,可以理解為別人的要求:別人給我設一個Flag,我就以這種Flag的方式啟動。

  可能這個沒什么用哈,但是仔細想一下這種對程序的思想理解應該是正確的。

2、幾種常見的Flag:

  我們說的動態設置,其實是通過Intent。

  如果我們要設置要啟動的Activity的啟動模式的話,只需要這樣:

intent.setFlags();

  然后在里面添加對應的Flag就好,那么接下來我們介紹幾個常見的Flag(他的Flag太多了,頭皮發麻。):

2.1、_NEW_TASK

  它對應的Flag如下:

Intent.FLAG_ACTIVITY_NEW_TASK

  這個Flag跟我們的singleInstance很相似:

  在給目標Activity設立此Flag后,會根據目標Activity的affinity進行匹配:

  如果已經存在與其affinity相同的task,則將目標Activity壓入此Task。   

  反之沒有的話,則新建一個task,新建的task的affinity值與目標Activity相同。然后將目標Activity壓入此棧。

  其實簡單來說,就是先看看需不需要創建一個新的Task,依據就是有沒有相同的affinity。然后把Activity放進去。

  

  但是此情況和singleInstance有不同,有兩點注意的地方:

  1. 新的Task沒有說只能存放一個目標Activity。只是說決定是否新建一個Task。而singleInstance模式下新的Task只能放置一個目標Activity。
  2. 在同一應用下,如果Activity都是默認的affinity,那么此Flag無效。而singleInstance默認情況也會創建新的Task。

  這個東西理解起來可能有一些抽象,我們通過一個實例來證明他:

 

  首先,我們創建一個DynamicLaunchModeDemo項目,新建SecondActity、ThirdActivity,包括MainActivity在內的布局中都放置一個按鈕,MainActiivty跳轉SecondActivity,SecondActivity跳轉ThirdActivity,ThirdActivity跳轉SecondActivity。

  然后,我們需要創建一個新的App——TwoApp,這個App目前只需要一個MainActivity就夠了,我們在MainActivity放置一個button,讓他跳轉到DynamicLaunchModeDemo的SecondActivity。

 

  我們點開TwoApp,現在只有TwoApp一個進程,然后點開DynamicLaunchModeDemo的SecondActivity,但是我們發現這時還是只有一個進程,

TaskRecord{3110889 #40293 A=com.lyf.twoapp U=0 StackId=1 sz=2}
  Run #2: ActivityRecord{7b1a925 u0 com.lyf.dynamiclaunchmode/.SecondActivity t40293}
  Run #1: ActivityRecord{7c3623f u0 com.lyf.twoapp/.MainActivity t40293}

 

  現在我們在TwoApp的MainActivity跳轉到DynamicLaunchModeDemo的SecondActivity的代碼中添加_NEW_TASK的Flag。

val intent = Intent()
intent.action = "com.lyf.second"
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)

 

  與上面不同的地方在於,我們新的界面創建在了新的進程中——其實就是DynamicLaunchModeDemo被喚醒了,我們來分析一下為什么會這樣:

  首先我們會想一下我們上面所學過的一個東西,affinity:我們說這個東西在默認情況下就是App的包名packageName,而DynamicLaunchModeDemo中的SecondActivity默認的affinity就是DynamicLaunchModeDemo的包名。

  然后我們說_NEW_TASK情況下,會先查找是否有對應的affinity的task,如果有就不在創建,直接將其放入,反之新建task,所以新建的task就是我們的DynamicLaunchModeDemo的task.

  我們可以再做一個測試,我們先喚醒DynamicLaunchModeDemo,然后再讓TwoApp跳轉到DynamicLaunchModeDemo的SecondActivity(有點繞啊。。。),我們看是什么情況:

TaskRecord{68b4826 #40317 A=com.lyf.dynamiclaunchmode U=0 StackId=1 sz=4}
  Run #5: ActivityRecord{d6350a7 u0 com.lyf.dynamiclaunchmode/.SecondActivity t40317}
TaskRecord{b0812bd #40318 A=com.lyf.twoapp U=0 StackId=1 sz=1}
  Run #4: ActivityRecord{3a43927 u0 com.lyf.twoapp/.MainActivity t40318}
TaskRecord{68b4826 #40317 A=com.lyf.dynamiclaunchmode U=0 StackId=1 sz=4}
  Run #3: ActivityRecord{e3c77a8 u0 com.lyf.dynamiclaunchmode/.ThirdActivity t40317}
  Run #2: ActivityRecord{5076832 u0 com.lyf.dynamiclaunchmode/.SecondActivity t40317}
  Run #1: ActivityRecord{1f5735f u0 com.lyf.dynamiclaunchmode/.MainActivity t40317}

  

  我們發現在TwoApp中喚醒DynamicLaunchModeDemo的SecondActivity,同樣是被放入了DynamicLaunchModeDemo的默認Task中。

  此時activity的返回順序是:SecondActivity->ThirdActivity->SecondActivity->MainActivity(TwoApp)->MainActivity(DynamicLaunchModeDemo)

 

2.2、_SINGLE_TOP

  該模式比較簡單,對應Flag如下:

Intent.FLAG_ACTIVITY_SINGLE_TOP

  此Flag與靜態設置中的singleTop效果相同

 

2.3、_CLEAR_TOP

  這個模式對應的Flag如下:

Intent.FLAG_ACTIVITY_CLEAR_TOP

  

  當設置此Flag時,目標Activity會檢查Task中是否存在此實例,如果沒有則添加壓入棧,

  如果有,就將位於Task中的對應Activity其上的所有Activity彈出棧,此時有以下兩種情況:

  1. 如果同時設置Flag_ACTIVITY_SINGLE_TOP,則直接使用棧內的對應Activity,
  2. 沒有設置。。。。。。。,則將棧內的對應Activity銷毀重新創建。

  

  關於這個Flag,我們發現他和singleTask很像,准確的說,是在_CLEAR_TOP和_SINGLE_TOP同時設置的情況下,就是singleTask模式。

  而唯一不同的一點就在於:他會銷毀已存在的目標實例,再重新創建。這個我們通過打印一下生命周期就好。

 

  這次我們只用DynamicLaunchModeDemo就好了,還是1->2,2->3,3->2,這次我們將2的Flag設置為_CLEAR_TOP,看一下SecondActivity的生命周期。

  

2020-04-28 19:39:05.914 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: MainActivity taskId: 40371 hashCode: 240613018
2020-04-28 19:39:05.915 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:05.936 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: MainActivity taskId: 40371 hashCode: 240613018
2020-04-28 19:39:05.943 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: MainActivity taskId: 40371 hashCode: 240613018

2020-04-28 19:39:08.317 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: MainActivity taskId: 40371 hashCode: 240613018
2020-04-28 19:39:08.350 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: SecondActivity taskId: 40371 hashCode: 18253684
2020-04-28 19:39:08.351 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:08.359 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40371 hashCode: 18253684
2020-04-28 19:39:08.364 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40371 hashCode: 18253684
2020-04-28 19:39:08.709 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: MainActivity taskId: 40371 hashCode: 240613018

2020-04-28 19:39:14.335 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: SecondActivity taskId: 40371 hashCode: 18253684
2020-04-28 19:39:14.370 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: ThirdActivity taskId: 40371 hashCode: 152801606
2020-04-28 19:39:14.371 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:14.378 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: ThirdActivity taskId: 40371 hashCode: 152801606
2020-04-28 19:39:14.383 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: ThirdActivity taskId: 40371 hashCode: 152801606
2020-04-28 19:39:14.712 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: SecondActivity taskId: 40371 hashCode: 18253684

2020-04-28 19:39:17.524 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: ThirdActivity taskId: 40371 hashCode: 152801606
2020-04-28 19:39:17.530 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: SecondActivity taskId: 40371 hashCode: 18253684
2020-04-28 19:39:17.567 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: SecondActivity taskId: 40371 hashCode: 183077611
2020-04-28 19:39:17.568 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:17.575 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40371 hashCode: 183077611
2020-04-28 19:39:17.579 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40371 hashCode: 183077611
2020-04-28 19:39:17.953 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: ThirdActivity taskId: 40371 hashCode: 152801606
2020-04-28 19:39:17.959 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: ThirdActivity taskId: 40371 hashCode: 152801606

2020-04-28 19:39:45.142 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: SecondActivity taskId: 40371 hashCode: 183077611
2020-04-28 19:39:45.174 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: ThirdActivity taskId: 40371 hashCode: 245889006
2020-04-28 19:39:45.175 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:45.182 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: ThirdActivity taskId: 40371 hashCode: 245889006
2020-04-28 19:39:45.186 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: ThirdActivity taskId: 40371 hashCode: 245889006
2020-04-28 19:39:45.519 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: SecondActivity taskId: 40371 hashCode: 183077611

2020-04-28 19:39:52.680 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: ThirdActivity taskId: 40371 hashCode: 245889006
2020-04-28 19:39:52.686 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: SecondActivity taskId: 40371 hashCode: 183077611
2020-04-28 19:39:52.720 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: SecondActivity taskId: 40371 hashCode: 131592179
2020-04-28 19:39:52.721 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:39:52.729 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40371 hashCode: 131592179
2020-04-28 19:39:52.734 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40371 hashCode: 131592179
2020-04-28 19:39:53.103 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: ThirdActivity taskId: 40371 hashCode: 245889006
2020-04-28 19:39:53.105 28424-28424/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: ThirdActivity taskId: 40371 hashCode: 245889006

 

TaskRecord{b0aa9bb #40371 A=com.lyf.dynamiclaunchmode U=0 StackId=1 sz=2}
    Run #2: ActivityRecord{6c1182b u0 com.lyf.dynamiclaunchmode/.SecondActivity t40371}
    Run #1: ActivityRecord{3fa58be u0 com.lyf.dynamiclaunchmode/.MainActivity t40371}

  從日志可以看出3->2的時候,2先銷毀再創建,3最后也會銷毀。

 

  現在我們同時加上_SINGLE_TOP的Flag,效果相同,我們看Log

2020-04-28 19:47:45.180 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: MainActivity taskId: 40377 hashCode: 240613018
2020-04-28 19:47:45.181 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:47:45.203 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: MainActivity taskId: 40377 hashCode: 240613018
2020-04-28 19:47:45.209 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: MainActivity taskId: 40377 hashCode: 240613018

2020-04-28 19:47:47.832 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: MainActivity taskId: 40377 hashCode: 240613018
2020-04-28 19:47:47.878 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:47.878 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:47:47.886 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:47.891 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:48.240 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: MainActivity taskId: 40377 hashCode: 240613018

2020-04-28 19:47:49.903 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:49.935 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: ThirdActivity taskId: 40377 hashCode: 27622280
2020-04-28 19:47:49.936 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:47:49.943 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: ThirdActivity taskId: 40377 hashCode: 27622280
2020-04-28 19:47:49.948 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: ThirdActivity taskId: 40377 hashCode: 27622280
2020-04-28 19:47:50.275 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: SecondActivity taskId: 40377 hashCode: 18253684

2020-04-28 19:47:52.160 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: ThirdActivity taskId: 40377 hashCode: 27622280
2020-04-28 19:47:52.168 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onNewIntent: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:52.168 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:47:52.169 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onRestart: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:52.171 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:52.172 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:47:52.513 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: ThirdActivity taskId: 40377 hashCode: 27622280
2020-04-28 19:47:52.515 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: ThirdActivity taskId: 40377 hashCode: 27622280

2020-04-28 19:48:11.278 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:48:11.313 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onCrate: ThirdActivity taskId: 40377 hashCode: 255683519
2020-04-28 19:48:11.313 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:48:11.320 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: ThirdActivity taskId: 40377 hashCode: 255683519
2020-04-28 19:48:11.325 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: ThirdActivity taskId: 40377 hashCode: 255683519
2020-04-28 19:48:11.661 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: SecondActivity taskId: 40377 hashCode: 18253684

2020-04-28 19:48:13.284 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onPause: ThirdActivity taskId: 40377 hashCode: 255683519
2020-04-28 19:48:13.291 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onNewIntent: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:48:13.292 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: taskAffinity: com.lyf.dynamiclaunchmode
2020-04-28 19:48:13.293 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onRestart: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:48:13.295 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStart: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:48:13.296 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onResume: SecondActivity taskId: 40377 hashCode: 18253684
2020-04-28 19:48:13.632 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onStop: ThirdActivity taskId: 40377 hashCode: 255683519
2020-04-28 19:48:13.633 29327-29327/com.lyf.dynamiclaunchmode I/LaunchMode: onDestroy: ThirdActivity taskId: 40377 hashCode: 255683519

TaskRecord{18250ba #40377 A=com.lyf.dynamiclaunchmode U=0 StackId=1 sz=2}
    Run #2: ActivityRecord{597cf08 u0 com.lyf.dynamiclaunchmode/.SecondActivity t40377}
    Run #1: ActivityRecord{f85527f u0 com.lyf.dynamiclaunchmode/.MainActivity t40377}

 

  很明顯,在3->2的時候,TwoActivity調用了onRestart方法,也就是棧頂復用了。

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM