AndroidのTasks and Back Stack
3991 ワード
デフォルトの動作1.Activity AがActivity Bを起動すると、A stopped、システムはA状態を保存します.Back pressedの場合、A resumedは相関状態を回復する.2.Home button pressedの場合、現在activity stopped、taskはbackgroundのように進み、システムは各taskの状態を保存する.ユーザがtaskのappを開始する前に開始すると、taskはフロントに入り、taskスタックトップのActivityを復元する.3.ユーザーがBackをクリックすると、現在のActivityはtask stackからポップアップされ、destroyされ、システムもその状態をretainしなくなる.4.Activitiesは、他のtasksからも複数回インスタンス化することができる.
Saving Activity State
Activity stoppedの場合、システムはデフォルトでステータスを保存します.また、コールバック関数を使用してActivityの状態を保存することを推奨し、システムがメモリを保存しないでメモリ回収を行い、バックグラウンドに入ったtaskを破棄することを防止します.この場合、システムが再びtaskに入ると、システムはtaskチェーンを有しているが、taskスタックの上部のActivityを表示すると、resumeではなく再createとなる.したがって、アクティブにコールバック関数onSaveInstanceState()を使用してActivity Stateを保存する必要があります.
Managing Tasks
Principal < activity > attributs
Principal intent flags:
Define launch modesマニフェスト指定、task を使用 Intent Flags を使用
AでBを起動すると、AはBを起動するFlagを指定し、BもManifestで異なるtaskを指定します.この場合、Intentで指定されたFlagsは、Manifestで指定されたtaskを上書きします.
また、一部のlaunchmodeはflagにありますが、Manifestにはありません.同様に、Manifestにあり、flagにあります.マニフェストFile を使用
activityのlaunchModeプロパティを指定します.
Android BrowserはsingleTaskモードを使用したアプリケーションです.さらに、back stackの場合、Activityが新しいtaskに起動されても、そのActivityが存在するtask stackに起動されても、back buttonは前のActivityに戻ることができます.また、singleTaskモードを使用したActivityを起動する場合、システムはまずそれ自体のモードで起動し、その後、Activityが存在するtask stack全体を起動するback stackに移行する.図に示すように、 Intent Flags を使用
startActivityで指定できるflagは、次のとおりです.
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TOP
singTaskプロパティと同じ
singleTopと同じ
起動するActivityがtaskスタックにすでに存在する場合、システムはActivity要素をtaskスタックの上部にあるすべてのActivityにclearをドロップし、onNewIntent()を介してスタックの上部にあるActivityにIntentを渡します.このflagは通常FLAG_とACTIVITY_NEW_TASKと一緒に使います.
Handling affinities
affinity属性はActivityが加わる傾向のあるtaskを示唆している.デフォルトでは、同じアプリケーションのActivityは同じtaskにある傾向があります.activity要素のtaskAffinityプロパティを変更できます.このプロパティの値は文字列で、デフォルトはパッケージ名です.したがって、異なるtaskで起動する傾向がある場合は、パッケージ名とは異なる文字列を指定します.
Affinityを使用する2つのケース-FLAG_を使用するACTIVITY_NEW_TASK
AがBを起動すると、FLAG_が指定されるACTIVITY_NEW_TASKでは、まずこの新しいBを搭載する傾向のあるtaskを探します.Bと同じAffinityを持つtaskがある場合は、それをtaskに起動し、そうでない場合は新しいtaskを起動します.例えばInCallScreenでは、ユーザーがホームを押してActivityを離れると、どのようにActivityに戻るかは、launchで起動する以外に(launchModeがmainの場合)、notification barで表示することもできます.-Activity要素の属性allowTaskReparentingはtrueで、本AppliancationのActivity Aは他のApplicationのActivity Bと同じaffinityを持つことを意味します.では、AでBを起動すると、BはAに属するtaskを、Bが属するApplicationが起動すると、BはAが属するtaskからReparentingを介してBが属するApplicationに適用される.
Clearing the back stack
ユーザーがtaskから長い間離れると、システムはtaskをクリーンアップし、task stackのroot activtiだけを残します.ユーザがtaskに戻るとrestore root Activityのみが表示されます.しかし、いくつかのActivityはこのような動作を修正することができます. alwaysRetainTaskStateこのプロパティがroot activity of a taskに設定されている場合、デフォルトの動作は発生しません. clearTaskOnLaunch root activity of a taskのこの属性をtrueに設定すると、ユーザーがtaskを離れるにしても再アクセスするにしてもroot activity以外のactivitiesはクリアされます.alwaysRetainTaskStateとは正反対です. finishOnTaskLaunchは単一Activityにのみ作用し、状態を保存せず、離れると破棄する.1つのtaskにある場合、離れた後、activityは破棄され、task stackスタックからポップアップされ、taskに入ると、taskの前のactivityがフロントに表示されます.root activity of taskにも作用します.例えばInCallScreenは使い終わったら破棄できます.
Saving Activity State
Activity stoppedの場合、システムはデフォルトでステータスを保存します.また、コールバック関数を使用してActivityの状態を保存することを推奨し、システムがメモリを保存しないでメモリ回収を行い、バックグラウンドに入ったtaskを破棄することを防止します.この場合、システムが再びtaskに入ると、システムはtaskチェーンを有しているが、taskスタックの上部のActivityを表示すると、resumeではなく再createとなる.したがって、アクティブにコールバック関数onSaveInstanceState()を使用してActivity Stateを保存する必要があります.
Managing Tasks
Principal < activity > attributs
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
Principal intent flags:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
Define launch modes
AでBを起動すると、AはBを起動するFlagを指定し、BもManifestで異なるtaskを指定します.この場合、Intentで指定されたFlagsは、Manifestで指定されたtaskを上書きします.
また、一部のlaunchmodeはflagにありますが、Manifestにはありません.同様に、Manifestにあり、flagにあります.
activityのlaunchModeプロパティを指定します.
|standard|singleTop|singleTask|singleInstance|
|--- | | | |
| , , task, task| Activity , , Activity Intent onNewIntent() Activity , 。 Activity , 。 : ,back button onNewIntent , task back stack 。| task, Activity task 。 task stack Activity , task , task Activity, task stack Activity, , Intent onNewIntent Activity。 ,Activity 。| singleTask,Activity , task , Activity task 。
Android BrowserはsingleTaskモードを使用したアプリケーションです.さらに、back stackの場合、Activityが新しいtaskに起動されても、そのActivityが存在するtask stackに起動されても、back buttonは前のActivityに戻ることができます.また、singleTaskモードを使用したActivityを起動する場合、システムはまずそれ自体のモードで起動し、その後、Activityが存在するtask stack全体を起動するback stackに移行する.図に示すように、
startActivityで指定できるflagは、次のとおりです.
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TOP
singTaskプロパティと同じ
singleTopと同じ
起動するActivityがtaskスタックにすでに存在する場合、システムはActivity要素をtaskスタックの上部にあるすべてのActivityにclearをドロップし、onNewIntent()を介してスタックの上部にあるActivityにIntentを渡します.このflagは通常FLAG_とACTIVITY_NEW_TASKと一緒に使います.
Handling affinities
affinity属性はActivityが加わる傾向のあるtaskを示唆している.デフォルトでは、同じアプリケーションのActivityは同じtaskにある傾向があります.activity要素のtaskAffinityプロパティを変更できます.このプロパティの値は文字列で、デフォルトはパッケージ名です.したがって、異なるtaskで起動する傾向がある場合は、パッケージ名とは異なる文字列を指定します.
Affinityを使用する2つのケース-FLAG_を使用するACTIVITY_NEW_TASK
AがBを起動すると、FLAG_が指定されるACTIVITY_NEW_TASKでは、まずこの新しいBを搭載する傾向のあるtaskを探します.Bと同じAffinityを持つtaskがある場合は、それをtaskに起動し、そうでない場合は新しいtaskを起動します.例えばInCallScreenでは、ユーザーがホームを押してActivityを離れると、どのようにActivityに戻るかは、launchで起動する以外に(launchModeがmainの場合)、notification barで表示することもできます.-Activity要素の属性allowTaskReparentingはtrueで、本AppliancationのActivity Aは他のApplicationのActivity Bと同じaffinityを持つことを意味します.では、AでBを起動すると、BはAに属するtaskを、Bが属するApplicationが起動すると、BはAが属するtaskからReparentingを介してBが属するApplicationに適用される.
Clearing the back stack
ユーザーがtaskから長い間離れると、システムはtaskをクリーンアップし、task stackのroot activtiだけを残します.ユーザがtaskに戻るとrestore root Activityのみが表示されます.しかし、いくつかのActivityはこのような動作を修正することができます.