web-dev-qa-db-ja.com

Android Intent.FLAG_ACTIVITY_SINGLE_TOP AND Intent.FLAG_ACTIVITY_CLEAR_TOP

メディアプレーヤーを実行しているアプリがあり、アプリのホームアクティビティからアクティビティを再開したい。

StartActivity呼び出しに次のフラグを追加することで、これを正常に実行できます。

myIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

これを見つけるのに長い時間がかかったので、これは物事を行うのに理想的な方法ではないのではないかと心配しています。あまり使っていないように思いました。

この方法を使用することに落とし穴はありますか?

23
shaneburgess

質問が正しく理解されたことを確認するために、アクティビティスタックがA-> B-> Cのようなもので、CからスタックをクリアしてAに戻るとします。

これが必要な場合、それらのインテントフラグは正しく、 Android-developer docs のように、期待どおりに機能するはずです。

13
AgileYogi

この質問はかなり古く、問題を解決して、火星に行ったり、その年に戻ったりするかもしれませんが、ここに来て説明を求めている人たちのために、明確にするために: =

公式ドキュメントによると:

設定されている場合、履歴スタックの最上位ですでに実行されているアクティビティは起動されません。

  • A-B-C-Dのバックスタックがあり、Activity AFLAG_ACTIVITY_CLEAR_TOPを開始する別のインテントをこの時点で開始したとします。Androidは何をするかは、単にすべてをクリアすることです) Activity Aの上部のアクティビティは、BackStackが次のようになることを意味します-> A(はい、その上にあるすべてのアクティビティをクリアしたため、これで完了です)。
  • 2番目のシナリオで、同じBackStack A-B-C-Dがあり、FLAG_ACTIVITY_SINGLE_TOPを使用してインテント開始アクティビティAを起動したとすると、BackStackは次のようになります-> A-B-C-D-A(混乱していますか?
  • 3番目のシナリオでは、同じBackStack A-B-C-Dから開始し、Activity DFLAG_ACTIVITY_SINGLE_TOPからインテントを起動します。これで、BackStackは次のようになります-> A-B-C-D(はい、BackStack FLAGが現在スタックの最上位にあり、ユーザー画面に表示されている場合、同じアクティビティの起動を禁止しているため、同じ順序のままです。

  • 最後のシナリオでは、同じBackStack A-B-C-Dから開始し、インテント開始Activity Dを起動しますが、今回はFLAGSを使用しないため、BackStackは次のようになります-> A-B-C-D-D

とった? FLAG_ACTIVITY_SINGLE_TOPは、現在画面に表示されている同じアクティビティを開始していて、既存のアクティビティの新しいインスタンスの起動を禁止する場合にのみ役立ちます。

12
Shubham Soni