Android ドキュメントから多くのことを学びました。
タスクとバックスタック
戻ると上へのナビゲーション
アプリケーションの構造
ここにいくつかのハイライトがあります:
タスクは、特定のジョブを実行するときにユーザーが操作するアクティビティの集まりです。アクティビティは、各アクティビティが開かれた順序でスタック (「バック スタック」) に配置されます。
現在のアクティビティが別のアクティビティを開始すると、新しいアクティビティがスタックの一番上にプッシュされ、フォーカスが移ります。前のアクティビティはスタックに残りますが、停止されます。アクティビティが停止すると、システムはユーザー インターフェイスの現在の状態を保持します。ユーザーが [戻る] ボタンを押すと、現在のアクティビティがスタックの一番上からポップされ (アクティビティが破棄され)、前のアクティビティが再開されます (その UI の前の状態が復元されます)。スタック内のアクティビティは再配置されることはなく、スタックからプッシュおよびポップされるだけです。つまり、現在のアクティビティによって開始されたときにスタックにプッシュされ、ユーザーが [戻る] ボタンを使用してスタックを離れるとポップオフされます。
これは、アプリケーションが連絡先を取得したときに、タスクのアクティビティ スタックが次のようになることを意味します。
| | 連絡先の活動 A |
| | アプリのアクティビティ B |
| | 他のアプリでのアクティビティ C|
ユーザーがホーム ボタンを押してタスクを終了すると、現在のアクティビティは停止し、そのタスクはバックグラウンドに入ります。システムは、タスク内のすべてのアクティビティの状態を保持します。ユーザーが後でタスクを開始したランチャー アイコンを選択してタスクを再開すると、タスクはフォアグラウンドに移動し、スタックの一番上でアクティビティを再開します。
ユーザーが連絡先アプリを開いているときに終了し、ランチャー メニューまたは最近のアプリ リストからアプリを再起動した場合でも、アクティビティ スタックは上記のようになります。あなたのアクティビティを別のタスクから開始させる唯一の可能性は、startActivity フラグによって新しいタスクのメイン アクティビティを開始する別のアプリ (ランチャー アプリの可能性があります) です。これはまれなケースです。このまれなケースでは、 Binder.getCallinguid()でアクティビティを開始したアプリの uid を簡単に確認して区別できます。
コメントに基づいて編集:
アクティビティがFLAG_ACTIVITY_LAUNCHED_FROM_HISTORYによって履歴から開かれたかどうかを確認できます。
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0){
}else{
}
次のことも調べることができます。
アプリを最近のアプリから開始したくない場合は、android:excludeFromRecents
android:finishOnTaskLaunch
アンドロイド:stateNotNeeded