1

これはかなり複雑なので、できるだけ明確にしようと思います。現在、私のアプリケーションは、起動時に一部のデータをリロードする必要があります。このデータをメイン アクティビティの onCreate/onRestart メソッドにロードしています。ただし、ユーザーが現在のタスクを離れない場合は、データをリロードしないように注意する必要があります。

たとえば、連絡先を選択するためにメイン アクティビティから組み込みの連絡先アプリケーションを起動する必要がある場合、新しい連絡先を選択している間、メイン アクティビティが一時停止/停止します。メイン アクティビティに戻ると、onRestart が呼び出されます。この場合、アプリケーションのタスクから離れたことがないので、データをリロードしたくありません。これは、ユーザーが連絡先アプリから離れずにすぐに戻ってきたかどうかを判断するために、いくつかのチェックをここに含める必要があることを意味します。

それ以外の場合、ユーザーが連絡先アプリを開いているときにアプリを終了し、ランチャーメニュー (または最近のアプリリストなど) からアプリを再起動した場合、連絡先アプリを閉じて、メインアクティビティの onRestart メソッドが呼ばれた。

ユーザーを脅かすパーミッション (GET_TASKS など) を使用せずにこれを行う方法はありますか。私は長い間この問題に悩まされてきたので、どんな助けでも大歓迎です:)

Tyvm、B.キャンベル

4

2 に答える 2

3

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

于 2013-02-12T05:10:20.567 に答える
1

applicationロードしているデータが特定の ではなくライフサイクルに関連している場合、activityそれをapplicationクラスにロードできるため、アプリケーション タスクが強制終了されない限り、再度ロードされることはありません。

于 2013-02-12T04:26:11.737 に答える