Edited at

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

More than 3 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を採用することにした。