èšäºã®æåã®éšåã§åæããããã«ãããã§ã¯ãã¢ã¯ãã£ããã£ã¹ã¿ãã¯ã®æšæºçãªåäœãå€æŽããããã®ããŒã«ãæ€èšããŸãã
ä»æ¥ã®ãããã¯ã«é¢ããçè«å
šäœã¯ã
developer.android.com /guide/topics/manifest/activity-element.htmlã«ãããŸããããã€ãã®å Žæã§ãããåç
§ããå®éã«ã©ã®ããã«æ©èœããããç解ããã©ã®ãããªç¶æ³ã§ãããèŠã€ããããšããŸãå®éã«äœ¿çšã§ããŸãã
AndroidManifestãšã³ãŒãå
ã®Intentãã©ã°ã®äž¡æ¹ã§ãããã€ãã®ãã©ã¡ãŒã¿ãŒãè¿œå ã§ããŸãã
intent.setFlags(Intent.FLAG_ACTIVITY_*);
androidïŒlaunchMode
ãã©ã¡ãŒã¿ã¯ãç¹å®ã®ã¢ã¯ãã£ããã£ãžã®åŒã³åºãã§æ°ããã€ã³ãã³ããã¢ã¯ãã£ãã«ãããšãã«äœãèµ·ãããã決å®ããŸãã
ãã®äŸã§ã¯ãActivityAã«é©çšãããŸãã
ãæšæºãããã³ãã·ã³ã°ã«ããããïŒFLAG_ACTIVITY_SINGLE_TOPïŒ
"standard"
ãããã©ã«ãã®åäœã§ãã ã·ã¹ãã ã¯åžžã«æ°ããã¢ã¯ãã£ããã£ãäœæããã¹ã¿ãã¯ã®äžçªäžã«è¿œå ããŸãã
ActivityAãå€æŽããŠãActivityBã«åãæ¿ããã®ã§ã¯ãªããèªåçã«èµ·åããããã«ããŸãã
ïŒ "æšæº"ïŒ
A-> A->æ»ã->æ»ãïŒ *** *** INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 28371 INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=28410 uid=10060 gids={1028} DEBUG/ActivityA(28410): onCreate() DEBUG/ActivityA(28410): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +2s64ms *** ActivityA *** INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 28410 DEBUG/ActivityA(28410): onCreate() DEBUG/ActivityA(28410): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +739ms DEBUG/ActivityA(28410): onStop() *** back *** DEBUG/ActivityA(28410): onStart() DEBUG/ActivityA(28410): onStop() DEBUG/ActivityA(28410): onDestroy() *** back *** DEBUG/ActivityA(28410): onStop() DEBUG/ActivityA(28410): onDestroy() *** Home screen***
ã¹ã¿ãã¯ã«ã¯2ã€ã®åäžã®ã¢ã¯ãã£ããã£ãããã2åã®ããã¯ã¯ãªãã¯åŸã«ããã»ã¹ãçµäºããããšãããããŸãã
"singleTop"
ã¯ãå床åŒã³åºããããšãã«ã¹ã¿ãã¯ã®æäžéšã«ããã¢ã¯ãã£ããã£ã®éè€ãé²ããŸãã
ïŒ "SingleTop"ïŒ
A-> A->æ»ãïŒ *** *** INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 31016 INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=31070 uid=10060 gids={1028} DEBUG/ActivityA(31070): onCreate() DEBUG/ActivityA(31070): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s296ms *** ActivityA *** INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 31070 DEBUG/ActivityA(31070): onNewIntent() *** back *** DEBUG/ActivityA(31070): onStop() DEBUG/ActivityA(31070): onDestroy() *** Home screen***
æ°ããã¢ã¯ãã£ããã£ã¯äœæãããã代ããã«
onNewIntent()
åŒã³åºãããããŸããã æåã®ããã¯ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãé¢ããŸããã
ãSingleTaskãããã³ãsingleInstanceã
"singleTask"
ããã³
"singleInstance"
ã¯ãåãã¢ã¯ãã£ããã£ã®è€æ°ã®ãšã³ãã£ãã£ãèš±å¯ããŸããã ãããã¯ãã¿ã¹ã¯ã§ä»ã®ã¢ã¯ãã£ããã£ã䜿çšããèœåãç°ãªããŸãã
ïŒ "SingleTask"ïŒ
A-> B-> C-> A->æ»ãïŒ *** *** INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 1496 INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=1529 uid=10060 gids={1028} DEBUG/ActivityA(1529): onCreate() DEBUG/ActivityA(1529): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s769ms *** ActivityB *** INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 1529 DEBUG/ActivityB(1529): onCreate() DEBUG/ActivityB(1529): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +524ms DEBUG/ActivityA(1529): onStop() *** ActivityC *** INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 1529 DEBUG/ActivityC(1529): onCreate() DEBUG/ActivityC(1529): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +267ms DEBUG/ActivityB(1529): onStop() *** ActivityA *** DEBUG/ActivityB(1529): onDestroy() DEBUG/ActivityA(1529): onNewIntent() DEBUG/ActivityA(1529): onStart() DEBUG/ActivityC(1529): onStop() DEBUG/ActivityC(1529): onDestroy() *** back *** 11-13 00:08:00.039: DEBUG/ActivityA(1529): onStop() 11-13 00:08:00.039: DEBUG/ActivityA(1529): onDestroy() *** Home screen***
åã³ActivityAã«åãæ¿ãããšãã·ã¹ãã ã¯ã¹ã¿ãã¯å
ã§ãã®äžã«ãã£ããã¹ãŠã®ã¢ã¯ãã£ããã£ãç Žæ£ããŸããã æŒããšããŒã ç»é¢ã«æ»ããŸãã
ïŒ "SingleInstance"ïŒ
A-> B-> C-> A-> back-> back-> backïŒ *** *** 11-13 00:12:27.132: INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 2418 11-13 00:12:27.859: INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=2438 uid=10060 gids={1028} 11-13 00:12:28.332: DEBUG/ActivityA(2438): onCreate() 11-13 00:12:28.457: DEBUG/ActivityA(2438): onStart() 11-13 00:12:29.254: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s606ms *** ActivityB *** 11-13 00:12:32.195: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 2438 11-13 00:12:32.679: DEBUG/ActivityB(2438): onCreate() 11-13 00:12:32.824: DEBUG/ActivityB(2438): onStart() 11-13 00:12:33.394: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +897ms 11-13 00:12:33.547: DEBUG/ActivityA(2438): onStop() *** ActivityC *** 11-13 00:12:36.257: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 2438 11-13 00:12:36.507: DEBUG/ActivityC(2438): onCreate() 11-13 00:12:36.582: DEBUG/ActivityC(2438): onStart() 11-13 00:12:37.343: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +989ms 11-13 00:12:37.695: DEBUG/ActivityB(2438): onStop() *** ActivityA *** 11-13 00:12:38.660: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 2438 11-13 00:12:38.734: DEBUG/ActivityA(2438): onNewIntent() 11-13 00:12:38.734: DEBUG/ActivityA(2438): onStart() 11-13 00:12:39.789: DEBUG/ActivityC(2438): onStop() *** back *** 11-13 00:12:41.425: DEBUG/ActivityC(2438): onStart() 11-13 00:12:42.250: DEBUG/ActivityA(2438): onStop() 11-13 00:12:42.250: DEBUG/ActivityA(2438): onDestroy() *** back *** 11-13 00:12:52.332: DEBUG/ActivityB(2438): onStart() 11-13 00:12:52.894: DEBUG/ActivityC(2438): onStop() 11-13 00:12:52.898: DEBUG/ActivityC(2438): onDestroy() *** back *** 11-13 00:12:55.617: DEBUG/ActivityB(2438): onStop() 11-13 00:12:55.617: DEBUG/ActivityB(2438): onDestroy() *** Home screen***
ActivityAã«åãæ¿ããŠããã§ãŒã³ãªã¢ã¯ã·ã§ã³ã¯ããªã¬ãŒãããŸããã§ãããã1ã€ã®ActivityAã§å¥ã®ã¿ã¹ã¯ãéãããŸããã æ»ãã®æåã®ãã¬ã¹ã§å®æããŸããã ããã«2åã¯ãªãã¯ããã ãã§ãããŒã ç»é¢ã«å
¥ãããšãã§ããŸãã å¯äžã®ãšã³ãã£ãã£ActivityAã¯äžã§ç Žå£ããããããžã®æ»ãã¯ãããŸããã§ããã å€éšçã«ã¯ãActivityAããActivityBãžãããã³ActivityCããActivityAãžã®ç§»è¡ïŒã€ãŸããåãããã»ã¹å
ã®ç°ãªãã¿ã¹ã¯éã®ç§»è¡ïŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®å€æŽãã€ãŸã 1ã€ã®ã¢ã¯ãã£ããã£ãæãããã¿ãããã¹ã ãŒãºãªé·ç§»ã§ã¯ãªããæ°ããã¢ã¯ãã£ããã£ããé£ã³åºããŸãã
androidïŒnoHistoryïŒFLAG_ACTIVITY_NO_HISTORYïŒ
ããã©ã«ãå€ã¯
false
ã§ãã
true
å Žåãåæ¢ããã¢ã¯ãã£ããã£ã«æ»ãããšã¯ã§ããŸããã
ãã©ã¡ãŒã¿ãŒã¯ãå€
true
ActivityAã«é©çšãã
true
ã
<activity android:name=".ActivityA" android:noHistory="true">
A-> B->æ»ãïŒ *** *** INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 4875 INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=4915 uid=10060 gids={1028} DEBUG/ActivityA(4915): onCreate() DEBUG/ActivityA(4915): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s383ms *** ActivityB *** INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 4915 DEBUG/ActivityB(4915): onCreate() DEBUG/ActivityB(4915): onStart() INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +877ms DEBUG/ActivityA(4915): onStop() *** back *** DEBUG/ActivityA(4915): onDestroy() DEBUG/ActivityB(4915): onStop() DEBUG/ActivityB(4915): onDestroy() *** Home screen***
onDestroy()
ActivityAã§èµ·åãããç¬éããå€æãããšãActivityAãåŒã³åºãããåŸã§ãã¡ã¢ãªã«æ®ã£ãŠããŸããã
onStop()
ããã ããããã«æ»ãããšã¯ã§ããªããªããŸããã
ãã®ãã©ã¡ãŒã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ããŽã衚瀺ããå¿
èŠãããããã®ããŽã«æ»ããªãå Žåã«äœ¿çšãããšäŸ¿å©ã§ãã
androidïŒclearTaskOnLaunch and androidïŒfinishOnTaskLaunch
clearTaskOnLaunch
ãã©ã¡ãŒã¿ãŒ
clearTaskOnLaunch
ã
true
å Žåãã¢ããªã±ãŒã·ã§ã³ã®åèµ·åæã«ãã¹ã¿ãã¯ïŒãŸãã¯ç¹å®ã®ã¿ã¹ã¯ïŒäžã®ãã¹ãŠã®éã«ãŒãã¢ã¯ãã£ããã£ãç Žæ£ããããã·ã¹ãã ã«
clearTaskOnLaunch
ãŸãã ã«ãŒãã¢ã¯ãã£ããã£ã®ã¿ã«é©çšããã®ã¯çã«ããªã£ãŠããããããã°ã®ååŸå
ã®äŸã§ã¯ãActivityAã«è¿œå ããŸããã
<activity android:name=".ActivityA" android:clearTaskOnLaunch="true">
ã¢ããªã®éå§-> A-> B-> C->ããŒã ->ã¢ããªã®éå§ïŒ *** *** INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476 DEBUG/ActivityA(3412): onCreate() DEBUG/ActivityA(3412): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +295ms *** ActivityB *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 3412 DEBUG/ActivityB(3412): onCreate() DEBUG/ActivityB(3412): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +140ms DEBUG/ActivityA(3412): onStop() *** ActivityC *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 3412 DEBUG/ActivityC(3412): onCreate() DEBUG/ActivityC(3412): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +131ms DEBUG/ActivityB(3412): onStop() *** Home *** INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher u=0} from pid 250 DEBUG/ActivityC(3412): onStop() *** *** INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476 DEBUG/ActivityC(3412): onDestroy() DEBUG/ActivityB(3412): onDestroy() DEBUG/ActivityA(3412): onStart()
ã¢ããªã±ãŒã·ã§ã³ãåèµ·åãããšãAndroidãåActivityBãšActivityCãã¡ã¢ãªããç Žå£ããããšãããããŸãã ãŸããRecentsã¡ãã¥ãŒïŒããŒã ãã¿ã³ãé·æŒãïŒããã¢ããªã±ãŒã·ã§ã³ã«æ»ã£ãŠãIntent LAUNCHERãéå§ãããªããããActivityCã«æ»ãããšã«ãªããŸãã
finishTaskOnLaunch
ãã©ã¡ãŒã¿ãŒã䜿çšããŠã
finishTaskOnLaunch
åãåäœãå®çŸã§ããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®å€ã
true
ã§ããã¢ããªã±ãŒã·ã§ã³ãåèµ·åãããšãAndroidã¯ãããã®ã¢ã¯ãã£ããã£ãç Žæ£ã
true
ã ã€ãŸã ãã®äŸã§ã¯ãåããã°ã衚瀺ããã«ã¯ãActivityBãšActivityCã«ç»é²ããã ãã§ååã§ãã
<activity android:name=".ActivityB" android:finishOnTaskLaunch="true"/> <activity android:name=".ActivityC" android:finishOnTaskLaunch="true"/>
ããã©ã«ãã§ã¯ãäž¡æ¹ã®ãã©ã¡ãŒã¿ãŒã¯
false
ã§ãã
èãããã䜿çšäŸã®1ã€ã¯ã
excludeFromRecents
ãã©ã¡ãŒã¿ãŒïŒRecentsã¡ãã¥ãŒã«Activityãå«ãŸãªãïŒãšçµã¿åãããŠãåæ¢ããActivityã«æ»ããªãããšãå®çŸããããšã§ãã ãããããã£ãšå
·äœçãªããŸãã¯éã«åçŽãªã±ãŒã¹ããããšæããŸãã
androidïŒparentActivityName
ãã®ãã©ã¡ãŒã¿ãŒã䜿çšãããšãç¹å®ã®ã¢ã¯ãã£ããã£ã®èŠªãå¿
èŠã«å¿ããŠäœæã§ããŸãã ãã ããæ»ããã¿ã³ã§ã¯ãªããããã²ãŒã·ã§ã³ã¢ããïŒhttp://developer.android.com/training/implementing-navigation/ancestral.htmlïŒã«ãã£ãŠãããšãã°ã¢ã¯ã·ã§ã³ããŒã®ããã«ãããã«æ»ãããšã«æ³šæããŠãã ããã ã ããããæ°ã«ããªãããã«ãActivityCã§
onBackPressed()
ãåå®çŸ©ããActivityAãActivityCã®èŠªã«ããŸãã
äŸïŒ
@Override public void onBackPressed() { onNavigateUp(); }
<activity android:name=".ActivityC" android:parentActivityName=".ActivityA"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".ActivityA" /> </activity>
A-> B-> C->æ»ãïŒ *** *** INFO/ActivityManager(250): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 6620 INFO/ActivityManager(250): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=6634 uid=10060 gids={1028} DEBUG/ActivityA(6634): onCreate() DEBUG/ActivityA(6634): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +895ms *** ActivityB *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 6634 DEBUG/ActivityB(6634): onCreate() DEBUG/ActivityB(6634): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +179ms DEBUG/ActivityA(6634): onStop() *** ActivityC *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 6634 DEBUG/ActivityC(6634): onCreate() DEBUG/ActivityC(6634): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +144ms DEBUG/ActivityB(6634): onStop() *** back *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 6634 DEBUG/ActivityB(6634): onDestroy() DEBUG/ActivityA(6634): onDestroy() DEBUG/ActivityA(6634): onCreate() DEBUG/ActivityA(6634): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +182ms DEBUG/ActivityC(6634): onStop() DEBUG/ActivityC(6634): onDestroy()
ã¯ãªãã¯ããŠæ»ããšãäºæ³ä»¥äžã®ããšãèµ·ãã£ãããšãããããŸãã ç Žå£ãããã®ã¯èŠªã®äžã«ãã£ãã¢ã¯ãã£ããã£ã ãã§ã¯ãªãã圌女èªèº«ãåçŸãããŸããã ãã ããå
šäœçã«ã¯åäœãäºæ³ãããŸãã
ãŠãŒã¶ãŒããããšãã°æ»ããã¿ã³ã«äœåºŠãæ»ãããšãªãåã¢ã¯ãã£ããã£ã«ã€ããŠé·ãéããŸããæ©ããåŸãã¡ã€ã³ã¡ãã¥ãŒã«æ»ãããšãã§ããããã«ããããã«äœ¿çšããã®ãåççã§ãïŒäºæ³ã©ãããã¢ã¯ã·ã§ã³ããŒã§å®è£
ããå ŽåïŒã
androidïŒallowTaskReparenting and androidïŒtaskAffinity
allowTaskReparenting
ãã©ã¡ãŒã¿ãŒã
allowTaskReparenting
ãšãã¿ã¹ã¯ïŒ2ã§ä»¥åã«äœæãããïŒã€ãŸããããã«é¢é£ä»ããããŠããïŒã¿ã¹ã¯ïŒ1ããåŒã³åºãããã¢ã¯ãã£ããã£ãã¿ã¹ã¯ïŒ1ã«ãã€ã³ã
allowTaskReparenting
ã
æºåïŒ
<activity android:name=".ActivityA" android:launchMode="singleInstance" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ActivityB" android:launchMode="singleTask" /> <activity android:name=".ActivityC" android:launchMode="singleTask" android:allowTaskReparenting="true" android:taskAffinity=".ActivityA" />
ActivityCãéå§ãããã¿ã³ãActivityAãã©ãŒã ã«ãã1ã€è¿œå ããŸãã
ãããã§ã¹ããã¡ã€ã«ã§ã¯ãActivityAã芪ã§ãããšäž»åŒµããå ŽåãActivityCã芪ãå€æŽããããšãèš±å¯ããŸããã
ã¢ããªã®éå§-> A-> B-> C->ããŒã ->ã¢ããªã®éå§-> A-> C->æ»ãïŒ *** *** INFO/ActivityManager(250): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 10495 INFO/ActivityManager(250): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=10524 uid=10060 gids={1028} DEBUG/ActivityA(10524): onCreate() DEBUG/ActivityA(10524): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +761ms *** ActivityB *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 10524 DEBUG/ActivityB(10524): onCreate() DEBUG/ActivityB(10524): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +225ms DEBUG/ActivityA(10524): onStop() *** ActivityC *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 10524 DEBUG/ActivityC(10524): onCreate() DEBUG/ActivityC(10524): onStart() INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +204ms DEBUG/ActivityB(10524): onStop() *** Home*** INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher u=0} from pid 250 DEBUG/ActivityC(10524): onStop() *** *** INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476 DEBUG/ActivityA(10524): onNewIntent() DEBUG/ActivityA(10524): onStart() *** ActivityC *** INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 10524 DEBUG/ActivityC(10524): onNewIntent() DEBUG/ActivityC(10524): onStart() DEBUG/ActivityA(10524): onStop() *** back *** DEBUG/ActivityA(10524): onStart() DEBUG/ActivityC(10524): onStop() DEBUG/ActivityC(10524): onDestroy()
HomeãæŒãåã«ãTask1 [A]ãTask2 [BãC]ãšãã2ã€ã®ãšã³ãã£ãã£ããããŸããã ã¢ããªã±ãŒã·ã§ã³ãåèµ·åããåŸãActivityAããActivityCãã€ãŸã ããã«ã
allowTaskReparenting
ãš
taskAffinity
ããªã
allowTaskReparenting
ã
taskAffinity
å¥ã®ã¢ããªã±ãŒã·ã§ã³ãšããŠåäœããæŒãæ»ããšã«ãŒãActivityBã«æ»ããŸãã ãªãã·ã§ã³ã®ãããã§ãæ»ããã¿ã³ã¯Task1ã«æ»ããŸããã
å®éã«ã¯ããã®ãããªè€éãªäœæ¥ã¹ããŒã ã1ã€ã®ã¢ããªã±ãŒã·ã§ã³å
ã«æ§ç¯ããå¿
èŠã¯ãã£ãã«ãããŸããããããã£ãŠãã¿ã¹ã¯1ãšã¿ã¹ã¯2ã®ãµã€ãã«å¥ã
ã®ã¢ããªã±ãŒã·ã§ã³ã衚瀺ããäžæ¹ãä»æ¹ã®ã¢ã¯ãã£ããã£ãåŒã³åºããŠçãã¿ã¹ã¯ãå®è¡ããæŒãæ»ããŠããããã€ã¹ç»é¢ãå¶åŸ¡ããŸãã
androidïŒalwaysRetainTaskState
ããã©ã«ãã§ã¯ããŠãŒã¶ãŒãã¢ã¯ã»ã¹ããŠããªãå Žåãã·ã¹ãã ã¯äžå®æéïŒã30åããªã©ïŒÂ©developer.android.comã®åŸãã¢ã¯ãã£ããã£ãšãšãã«ã¿ã¹ã¯ãç Žæ£ããŸãã Activityãã©ã¡ãŒã¿ãŒ
alwaysRetainTaskState
ã
true
èšå®ããããšã«ããããããã¯æ°žä¹
ã«åç¶ãããããšãã§ããŸãïŒã¡ã¢ãªãŒäžè¶³ã®å Žåãé€ãïŒã ããã¯çè«çã«èª¬æãããŠãããããã§ãã£ãããæ³åããã®ã¯é£ããã®ã§ããã¹ãã¯è¡ããŸããã§ããã
è¿œå ïŒãŸã åé¡ãããããšãå€æãã
ãara89ã®
ã³ã¡ã³ãã«æè¬ã Android 4.0ïŒAPIã¬ãã«14ïŒä»¥éãã¢ã¯ãã£ããã£ã®ç Žæ£ãåæ¢ãããã®ãã©ã¡ãŒã¿ãŒã¯äœ¿çšã§ããªããªããŸããã ããã§2.3.7ãš4.0.1ã®å·®åã確èªã§ã
ãŸã ïŒ
ACTIVITY_INACTIVE_RESET_TIME
ãã£ãŒã«ãã«æ³šæããŠãã ããïŒã ãã ããAndroidãã©ãã«ãŒã§ããã«å¯ŸããŠ
ãã°ãäœæãããŸãããããŸã æ°ããã¹ããŒã¿ã¹ã§ãããææè
ã¯ããŸããã
ã¢ã¯ãã£ããã£ã¹ã¿ãã¯ã®ã©ã€ããµã€ã¯ã«ïŒããŒã1ïŒ