Help us understand the problem. What is going on with this article?

ウィジェットからActivityを起動した場合にActivityスタックをクリアしたい

More than 5 years have passed since last update.

1 前提

Activity A, B...などがアプリに存在。
WidgetタップでActivity Wを起動。

2 やりたいこと

A→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面

3 最初の設定

appWidgetProvider.java(NGver.)
Intent intent = new Intent(context, ActicityW.class);
PendingIntent pi = new PendingIntent(...);

4 その時の挙動

A→ホームボタン→ウィジェットタップ→W→戻るボタン→A

まあ、ある意味当然。

5 Activity W起動用のIntentのフラグをいろいろいじった

appWidgetProvider.java(OKver.)
Intent intent = new Intent(context, ActicityW.class);
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK|intent.FLAG_ACTIVITY_MULTIPLE_TASK);

(1)A→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面
(2)A→B→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面

でけた!
(2)のあと、アプリアイコンをタップすると、Bが起動されたので、元のActivityスタックに戻れる。
ちなみに、Wからホームボタンをタップすると、以下のようになった。

(3)A→B→ホームボタン→ウィジェットタップ→W→ホームボタン→ホーム画面
→アプリアイコンタップ→W

ふむふむ。
さらにそこから戻るボタンを押すと、ホーム画面に戻った。
んでアプリアイコンタップすると、Bが起動。
ちょっとこの辺は仕様によりそう。

6 別バージョン

appWidgetProvider.java(OKver.2)
Intent intent = new Intent(context, ActicityW.class);
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TASK);

FLAG_ACTIVITY_CLEAR_TASKは、API11以降で追加された模様。
これで起動したところ、Activityスタックが削除されてるような挙動。
これでいいじゃん??

これだと、最初に起動していたActivity AやBには、Wを起動した後には戻れず、アプリアイコンタップ時は必ず起動画面が表示される。
こっちのほうがシンプルかな?
履歴にWが残り続けるのがどうかなというところか・・・

7 結論

A→D→ホームボタン→W→B→C

こんな感じでウロウロした後、戻るボタンで全部戻って、アプリアイコンをタップしたとき、5の方法だといきなりDが表示されると混乱するかもしれない。
なので、今回は6を採用することにした。

le_skamba
Android/iPhoneアプリ開発者。その前はゲームプログラマをしてました。Windowsアプリも幾つか作りました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away