Androidのタスクとバックスタック

こんにちは トピックのタイトルから、タスクとバックスタックがAndroidでどのように配置されるかについて説明していることがわかります。 この記事は公式ソースの無料翻訳になります 。 このトピックは初心者に焦点を当てていますが、経験豊富な開発者は新しいことを学ぶことができると思います。 テーマは特定のものであり、アクティビティの動作をカスタマイズする必要はほとんどありません。



エントリー



だから。 少なくとも、各Androidアプリケーションは、システムの基本オブジェクトであるアクティビティで構成されています。 アクティビティは、独自の独立したロジックとUIを持つ独立した画面です。 アプリケーションのアクティビティの量は、1から多数まで異なります。 異なるアクティビティ間を移動する場合、ユーザーはデバイスの戻るボタンを押すことにより、常に前の閉じたアクティビティに戻ることができます。 同様のロジックは、スタック(アクティビティスタック)を使用して実装されます。 彼の組織は「後入れ先出し」です。つまり、 最後が入って、最初が出た。 新しいアクティビティを開くと、そのアクティビティが最上位になり、前のアクティビティが停止モードになります。 スタックはシャッフルできません;新しいアクティビティを先頭に追加し、先頭の電流を削除することができます。 同じアクティビティを必要な回数だけスタック上に置くことができます。

タスクはアクティビティのコレクションです。 各タスクには独自のスタックが含まれます。 標準的な状況では、各アプリケーションには独自のタスクと独自のスタックがあります。 アプリケーションを最小化すると、タスクはバックグラウンドになりますが、死ぬことはありません。 スタック全体が保存され、次にマネージャーまたはランチャーを介してアプリケーションを開くときに、既存のタスクが復元され、引き続き動作します。



以下に、スタックの仕組みの写真を示します。


画像



戻るボタンを押し続けると、メインルートが残るまでスタックはアクティビティを削除します。 ユーザーが再度クリックすると、アプリケーションが閉じてタスクが終了します。 ちなみに、たとえば、アプリケーションを最小化して新しいアプリケーションを起動すると、タスクは単にバックグラウンドになり、呼び出すまで待機するという事実について話しました。 実際には1つの「しかし」があります。 バックグラウンドで多くのタスクがある場合、または単にデバイスの負荷が高い場合、システムリソースの不足によりタスクが停止する可能性はありません。 もちろんこれは戦争ではありませんが、現在のデータをすべて失い、スタックがクリアされるという事実は確かです。 ところで、そのような場合のデータ損失を避けるために、 SavingActivityStateについて読む必要があります。



少ない合計



上記で説明したことはすべて、Androidアプリケーションの標準的な動作です。 ほとんどの場合、これは本来あるべき姿です。 しかし、まだ何かを変更したい場合は、この機会があります。 これらについてはさらに説明しますが、現時点では、すでに説明した内容の小さな結果です。



タスク管理



タスクの標準編成を変更するには2つの方法があります。 各アクティビティのマニフェストに特別な属性を設定できます。 startActivity()を使用して新しいアクティビティを開始するIntentに特別なフラグを設定することもできます。 マニフェストの属性とインテントのフラグが競合する場合があることに注意してください。 この場合、インテントフラグが優先されます。



LaunchMode属性



マニフェスト内のアクティビティごとに、launchMode属性を指定できます。 いくつかの意味があります。



実際、新しいアクティビティがどのタスクで開いているかは関係ありません。 [戻る]ボタンをクリックしても、前のタスクと前のアクティビティに戻ります。 考慮すべき唯一のものはsingleTaskパラメーターです。 そのようなアクティビティを開いたときに別のバックグラウンドタスクから取得した場合、そのアクティビティとそのスタックに完全に切り替えます。 下の図に示されています。

画像





前述のように、新しいアクティビティを起動するIntentに特別なフラグを設定できます。 フラグはlaunchModeよりも優先されます。 いくつかのフラグがあります:





親和性



デフォルトでは、アプリケーションのすべてのアクティビティは1つのタスクで動作します。 この動作を自由に変更して、1つのアプリケーションでアクティビティが異なるタスクで動作するように指定したり、異なるアプリケーションのアクティビティを1つで動作するように指定したりできます。 これを行うには、taskAffinityパラメーターを使用して各アクティビティのマニフェストにタスク名を指定します。 これは、名前パッケージと一致しない文字列値です。 標準アプリケーションタスクは、パッケージとまったく同じように呼び出されます。 一般に、このパラメーターは、アクティビティが独自の個別のタスクで開くことが保証されることを示します。 このパラメーターは、フラグFLAG_ACTIVITY_NEW_TASKを指定するか、アクティビティの属性allowTaskReparenting = "true"を設定する場合に関連します。 この属性は、アクティビティの1つがアクティブになった場合、そのアクティビティを起動したタスクとtaskAffinityで指定されたタスクの間でアクティビティが移動できることを示します。



スタッククリーニング



タスクが長時間バックグラウンドにある場合、システム自体がスタックをクリーンアップし、ルートアクティビティのみを残します。 この動作は、ユーザーがアプリケーションで以前何をしていたかを忘れることができ、別の目的でアプリケーションに再度アクセスした可能性が高いためです。 このロジックは、マニフェストのいくつかの属性を使用して変更することもできます。





これがこのトピックのすべてです。 この記事は即興ではありませんが、実際には公式文書の無料翻訳です。 簡単な例を収集し、フラグと属性を試すことをお勧めします。 個人的には、いくつかのポイントは予想外に興味深いものでした。 HPのエラーと欠点を考慮します。 ありがとう



All Articles