Notificationから、あるActicityを立ち上げるときに、MainActivityも一緒に立ち上げたい

1,500 views
Skip to first unread message

mun

unread,
Aug 7, 2014, 2:30:20 AM8/7/14
to android-...@googlegroups.com
手づまりになってしまったので質問させてください。

PendingIntent.getActivityメソッドを使ってNotificationから、あるActivity(仮にNotificationActicityとします)を立ち上げているのですが、
アプリが死んでいる場合はNotificationActivityが独立して立ち上がってしまします。
アプリが死んでいる場合は必ずandroid.intent.category.LAUNCHERをもつActivity(かりにMainActivityとします)を立ち上げたうえでNotificationActivityを立ち上げたいのですが、うまくいきません。

NotificationActicityを立ち上げるときのintentにintent.setFlagsでいろんなFLAGを試してみたのですがうまくいかず...
PendingIntent.getActivityの第4引数のflug指定を試してみたがうまくいかず...

どなたかご存じのかたいませんでしょうか。
よろしくお願いします。

yuka2py

unread,
Aug 7, 2014, 6:08:42 AM8/7/14
to android-...@googlegroups.com
こんにちわー。
今日はとっても暑い北神戸です。(*'-'*)

最初に、NotificationActicity ではなく、MainActivity を起動しては如何でしょうか?
その際、Intent に「NotificationActicity を立ち上げてね」という独自のフラグを持たせて、
MainActivity は起動直後に、そのフラグがあれば NotificationActicity を startActivity するような感じです。

ゆか。


2014年8月7日 15:30 mun <st57...@gmail.com>:
> --
> このメールは Google グループのグループ「Android-SDK-Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-sdk-ja...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-sdk-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Makoto Yamazaki

unread,
Aug 7, 2014, 6:09:25 AM8/7/14
to android-...@googlegroups.com
zaki です。

TaskStackBuilder で Intentの配列を作ってそれを
PendingIntent#getActivities にわたすと、notification
選択時に startActivities と同様の動作をしてActivity の
スタックを構築してくれます。スタックが構築される
だけなので、MainActivityのインスタンス生成や onCreate
の呼び出しは、 NotificationActivity が finish した後です。

2系では使えない方法なので、2系も対象にしたい場合は
通知から起動する Activity を MainActivity(CLEAR_TOP付き)
にして、MainActivity の onCreate で NotificationActivity を
startActivity するしか方法がないと思います。



--
このメールは Google グループのグループ「Android-SDK-Japan」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-sdk-ja...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-sdk-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

mun

unread,
Aug 8, 2014, 1:49:13 AM8/8/14
to android-...@googlegroups.com
ゆかさん
全国どこも厚いようですね。

コメントありがとうございます。

その方法だと解決できますね!
ですが、1つ伝え漏れていました。。。スミマセン。
実は自分が作っているものはライブラリであるため、MainActivity側で処理せずにすむ方法を模索していました
(MainActivityを開発するのはライブラリを使う開発者の方なので、できればライブラリ側で解決したい意図があります)

2014年8月7日木曜日 19時08分42秒 UTC+9 ゆぅか。:

mun

unread,
Aug 8, 2014, 1:53:14 AM8/8/14
to android-...@googlegroups.com
zakiさん
TaskStackBuilderですか。初めて聞きました。
2系は使えないのですね。。。
国内だとまだ2系は10%以上のシェアがあって捨てるのは難しい状況です(泣)
けど、調べてみます!
ありがとうございます。

2014年8月7日木曜日 19時09分25秒 UTC+9 zaki:

Makoto Yamazaki

unread,
Aug 8, 2014, 2:29:31 AM8/8/14
to android-...@googlegroups.com
zaki です。

NotificationActivity でBack を押した際に MainActivity へ戻る挙動が必要ということであれば、
NotificationActivity#finish をオーバーライドして super.finish(); だけでなく、
CLEAR_TOP フラグ付きで MainActivity を startActivity するという手もあります。
その際、画面遷移のアニメーションはexit のものではなく enter のものになってしまうので、
overridePendingTransition を呼び出してアニメーションを指定する必要があります。



mun

unread,
Aug 10, 2014, 9:02:02 PM8/10/14
to android-...@googlegroups.com
zakiさん

アドバイスありがとうございます。
なるほど。この方法なら2系OS関係なく、必ずMainActivityを立ち上げることができそうですね!
助かります。
ありがとうございます。

2014年8月8日金曜日 15時29分31秒 UTC+9 zaki:

mun

unread,
Sep 26, 2014, 7:58:09 AM9/26/14
to android-...@googlegroups.com
こんにちは。
別問題かもですが、追記したほうが分かりやすいので追記させていただきます。

zakiさんの方法(finishをオーバーライド)でNotificationActivityからMainActivityを強制的に立ち上げることができました。
が、1つ問題が出てきました。

NotificationActivityから強制起動したMainActivity(仮にMainActivity^とします)が表示されているときに、さらにPushを飛ばすと
実はNotificationActivityが表示されません。
(Logで見るとNotificationActivityのonCereateを通ってすらいません。)
平たく言うと、「Intentを飛ばしたのにActivityが起動しない」というすごく奇妙な現象です。

これは、AndroidManifestのNotificationActivityにandroid:launchMode="singleTask"を追加することで解決はします。
解決はしますが、「なぜ強制起動したMainActivityは通常の動きとは異なるのか?」という問題が残ります。

なぜこれが問題かというと、私が作っている物がライブラリであるためです(私事で申し訳ありません)
つまり、MainActivityはライブラリを利用しているアプリの開発者の作っている部分で、そのMainActivityが通常の動きとは異なっていることの理由がはっきり
しないことにはリリースできない状態になっています。

狙った動きをするようになったからと言って、この機能が本当に「ライブラリ利用者に悪い影響を及ぼさない」ことがはっきりしてないというわけです。

どなたかお力を貸していただけませんでしょうか。
どうぞよろしくお願いします。


========
*今回の問題の概要図
(タスクの図で示します)

①アプリが死んでいる状態でPush。ノーティフィケーションよりNotificationActivity起動
(Logを見るとIntent.FLAG_ACTIVITY_NEW_TASKで起動しているようです)*1
--------------------------
|NotificationActivity
--------------------------

②戻るボタンタップ(intent.setClassName(Context packageContext, String className)で起動。このときIntentのフラグは何もつけていません)
--------------------------
|MainActivity^
--------------------------

③さらにPush。ノーティフィケーションよりNotificationActivity起動*1
--------------------------
|MainActivity^ 
--------------------------

。。。この時タスクの状態は本来はこうなるべきですよね。しかし実際は③のようになります。
--------------------------------------------------
|MainActivity^ | NotificationActivity
--------------------------------------------------


*1 ログ詳細
09-26 19:08:05.440: W/ActivityManager(598): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { cmp=***略***.NotificationActivity bnds=[184,414][1016,542] }





2014年8月11日月曜日 10時02分02秒 UTC+9 mun:
Reply all
Reply to author
Forward
0 new messages