エントリー
だから。 少なくとも、各Androidアプリケーションは、システムの基本オブジェクトであるアクティビティで構成されています。 アクティビティは、独自の独立したロジックとUIを持つ独立した画面です。 アプリケーションのアクティビティの量は、1から多数まで異なります。 異なるアクティビティ間を移動する場合、ユーザーはデバイスの戻るボタンを押すことにより、常に前の閉じたアクティビティに戻ることができます。 同様のロジックは、スタック(アクティビティスタック)を使用して実装されます。 彼の組織は「後入れ先出し」です。つまり、 最後が入って、最初が出た。 新しいアクティビティを開くと、そのアクティビティが最上位になり、前のアクティビティが停止モードになります。 スタックはシャッフルできません;新しいアクティビティを先頭に追加し、先頭の電流を削除することができます。 同じアクティビティを必要な回数だけスタック上に置くことができます。
タスクはアクティビティのコレクションです。 各タスクには独自のスタックが含まれます。 標準的な状況では、各アプリケーションには独自のタスクと独自のスタックがあります。 アプリケーションを最小化すると、タスクはバックグラウンドになりますが、死ぬことはありません。 スタック全体が保存され、次にマネージャーまたはランチャーを介してアプリケーションを開くときに、既存のタスクが復元され、引き続き動作します。
以下に、スタックの仕組みの写真を示します。
戻るボタンを押し続けると、メインルートが残るまでスタックはアクティビティを削除します。 ユーザーが再度クリックすると、アプリケーションが閉じてタスクが終了します。 ちなみに、たとえば、アプリケーションを最小化して新しいアプリケーションを起動すると、タスクは単にバックグラウンドになり、呼び出すまで待機するという事実について話しました。 実際には1つの「しかし」があります。 バックグラウンドで多くのタスクがある場合、または単にデバイスの負荷が高い場合、システムリソースの不足によりタスクが停止する可能性はありません。 もちろんこれは戦争ではありませんが、現在のデータをすべて失い、スタックがクリアされるという事実は確かです。 ところで、そのような場合のデータ損失を避けるために、 SavingActivityStateについて読む必要があります。
少ない合計
上記で説明したことはすべて、Androidアプリケーションの標準的な動作です。 ほとんどの場合、これは本来あるべき姿です。 しかし、まだ何かを変更したい場合は、この機会があります。 これらについてはさらに説明しますが、現時点では、すでに説明した内容の小さな結果です。
- 起動すると、新しいアクティビティがスタックの最上部に移動し、現在の
- アプリケーションを最小化すると、タスクはバックグラウンドに移行し、その状態を保存します。 アプリケーションの次の起動後、タスクはそのスタックとともに復元されます
- 戻るをクリックすると、現在のアクティビティが完全に削除されます。 スタックの一番上は前のものです。
- 同じアクティビティは、スタック上にできるだけ多くのインスタンスを持つことができます。
タスク管理
タスクの標準編成を変更するには2つの方法があります。 各アクティビティのマニフェストに特別な属性を設定できます。 startActivity()を使用して新しいアクティビティを開始するIntentに特別なフラグを設定することもできます。 マニフェストの属性とインテントのフラグが競合する場合があることに注意してください。 この場合、インテントフラグが優先されます。
LaunchMode属性
マニフェスト内のアクティビティごとに、launchMode属性を指定できます。 いくつかの意味があります。
- 標準 -(デフォルトで)アクティビティが開始されると、新しいインスタンスがスタック上に作成されます。 アクティビティは数回積み重ねることができます
- singleTop-アクティビティはスタックに数回座ることができます。 スタックの新しいエントリは、指定されたアクティビティがスタックの最上部にない場合にのみ作成されます。 現在最上位である場合、onNewIntent()メソッドが機能しますが、再作成されません。
- singleTask-新しいタスクを作成し、そのアクティビティのルートを設定しますが、これは他のタスクにこのアクティビティのインスタンスがない場合のみです。 アクティビティが既に何らかのタスクに配置されている場合、そのインスタンスが開かれ、onNewIntent()メソッドが呼び出されます。 それがやがて主要なものになり、すべての上部標本があれば削除されます。 このようなアクティビティのインスタンスは1つだけ存在できます。
- singleInstanceはsingleTaskと同じですが、このアクティビティでは常に別のタスクが作成され、その中のルートタスクになります。 このフラグは、アクティビティがそのタスクの唯一のメンバーになることを示します。
実際、新しいアクティビティがどのタスクで開いているかは関係ありません。 [戻る]ボタンをクリックしても、前のタスクと前のアクティビティに戻ります。 考慮すべき唯一のものはsingleTaskパラメーターです。 そのようなアクティビティを開いたときに別のバックグラウンドタスクから取得した場合、そのアクティビティとそのスタックに完全に切り替えます。 下の図に示されています。
旗
前述のように、新しいアクティビティを起動するIntentに特別なフラグを設定できます。 フラグはlaunchModeよりも優先されます。 いくつかのフラグがあります:
- FLAG_ACTIVITY_NEW_TASK-新しいタスクでアクティビティを起動します。 このアクティビティのインスタンスを持つタスクが既に存在する場合、このタスクがアクティブになり、onNewIntent()メソッドがトリガーされます。
このフラグは、上記のsingleTopパラメーターに似ています。 - FLAG_ACTIVITY_SINGLE_TOP-アクティビティが開始された場合、つまり スタックの最上部にあるため、スタック上に新しいインスタンスを作成する代わりに、onNewIntent()メソッドが呼び出されます。
このフラグは、上記のsingleTopパラメーターに似ています。 - FLAG_ACTIVITY_CLEAR_TOP-このアクティビティのインスタンスがこのタスクのスタックに既に存在する場合、その上にあるすべてのアクティビティが破棄され、このインスタンスがスタックのトップになります。 onNewIntent()とも呼ばれます
親和性
デフォルトでは、アプリケーションのすべてのアクティビティは1つのタスクで動作します。 この動作を自由に変更して、1つのアプリケーションでアクティビティが異なるタスクで動作するように指定したり、異なるアプリケーションのアクティビティを1つで動作するように指定したりできます。 これを行うには、taskAffinityパラメーターを使用して各アクティビティのマニフェストにタスク名を指定します。 これは、名前パッケージと一致しない文字列値です。 標準アプリケーションタスクは、パッケージとまったく同じように呼び出されます。 一般に、このパラメーターは、アクティビティが独自の個別のタスクで開くことが保証されることを示します。 このパラメーターは、フラグFLAG_ACTIVITY_NEW_TASKを指定するか、アクティビティの属性allowTaskReparenting = "true"を設定する場合に関連します。 この属性は、アクティビティの1つがアクティブになった場合、そのアクティビティを起動したタスクとtaskAffinityで指定されたタスクの間でアクティビティが移動できることを示します。
スタッククリーニング
タスクが長時間バックグラウンドにある場合、システム自体がスタックをクリーンアップし、ルートアクティビティのみを残します。 この動作は、ユーザーがアプリケーションで以前何をしていたかを忘れることができ、別の目的でアプリケーションに再度アクセスした可能性が高いためです。 このロジックは、マニフェストのいくつかの属性を使用して変更することもできます。
- alwaysRetainTaskState-フラグがルートアクティビティに対してtrueに設定されている場合、スタックはクリーンアップされず、長時間経っても完全に復元されます
- clearTaskOnLaunch-ルートアクティビティのフラグをtrueに設定すると、ユーザーがタスクを終了するとすぐにスタックが消去されます。 alwaysRetainTaskStateの正反対
- finishOnTaskLaunch -clearTaskOnLaunchと同様に機能しますが、任意のアクティビティにインストールしてスタックから削除できます
これがこのトピックのすべてです。 この記事は即興ではありませんが、実際には公式文書の無料翻訳です。 簡単な例を収集し、フラグと属性を試すことをお勧めします。 個人的には、いくつかのポイントは予想外に興味深いものでした。 HPのエラーと欠点を考慮します。 ありがとう