多重起動の制御について

879 views
Skip to first unread message

tk

unread,
Mar 24, 2011, 5:14:26 AM3/24/11
to 日本Androidの会
ランチャからもブラウザからも起動できるアプリの多重起動制御について質問があります。
説明が長くなりますが、ご容赦ください。

A,B,Cという3つの画面を持つアプリを作成しまして、

【パターン1】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.再度ランチャーからアプリ起動
6.B画面が表示される(3の状態が保持されている)

【パターン2】
1.ランチャーからアプリ起動
2.A画面が表示される
3.いったんホームに戻る
4.ブラウザを起動し、WEBページからアプリ起動
5.A画面が表示される
6.アプリの終了ボタンでアプリを終了
7.いったんホームに戻る
8.再度ランチャーからアプリ起動
9.Exception発生

【パターン3】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.ブラウザを起動し、WEBページからアプリ起動
6.A画面が表示される
7.C画面に遷移
8.いったんホームに戻る
9.再度ランチャーからアプリ起動
10.B画面が表示される(3の状態が保持されている)

まず、パターン2のExceptionは絶対に避けなければいけいないので、
いろいろ調べてみたら、どうやらアプリの起動モードが関係しているようでした。
試しに、android:launchMode="singleTask"にしてみたら、下記のようになりました。

【パターン1】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.再度ランチャーからアプリ起動
6.A画面が表示される(3の状態が保持されていない)

【パターン2】
1.ランチャーからアプリ起動
2.A画面が表示される
3.いったんホームに戻る
4.ブラウザを起動し、WEBページからアプリ起動
5.A画面が表示される
6.アプリの終了ボタンでアプリを終了
7.いったんホームに戻る
8.再度ランチャーからアプリ起動
9.A画面が表示される(Exception発生しなくなった)

【パターン3】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.ブラウザを起動し、WEBページからアプリ起動
6.A画面が表示される
7.C画面に遷移
8.いったんホームに戻る
9.再度ランチャーからアプリ起動
10.A画面が表示される(7の状態が保持されていない)

パターン2でのExceptionは解決できたのですが、
パターン1、3で直前の画面を保持できていないのです。
singleTaskの説明を読んでると、当然のような気がしますが、
出来れば、下記のような動きを実現したいです。

【パターン1】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.再度ランチャーからアプリ起動
6.B画面が表示される(3の状態が保持されている)

【パターン2】
1.ランチャーからアプリ起動
2.A画面が表示される
3.いったんホームに戻る
4.ブラウザを起動し、WEBページからアプリ起動
5.A画面が表示される
6.アプリの終了ボタンでアプリを終了
7.いったんホームに戻る
8.再度ランチャーからアプリ起動
9.A画面が表示される

【パターン3】
1.ランチャーからアプリ起動
2.A画面が表示される
3.B画面に遷移
4.いったんホームに戻る
5.ブラウザを起動し、WEBページからアプリ起動
6.A画面が表示される
7.C画面に遷移
8.いったんホームに戻る
9.再度ランチャーからアプリ起動
10.C画面が表示される(7の状態が保持されている)

実現可能でしょうか?

tk

unread,
Mar 24, 2011, 6:33:59 AM3/24/11
to 日本Androidの会
追記です。

アプリ(以下、アプリA)をブラウザから起動するのではなく、
アプリAを起動するアプリ(アプリB)を作成し、アプリBからアプリAを起動して見たところ、理想の動きになりました。
アプリAのManifest(intent-filter)は、下記のようにしています。
======================================================================
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="scheme_name" />
<data android:host="host_name" />
</intent-filter>
======================================================================


また、アプリBからアプリAを起動する場合のIntentは、下記のようにしています。
======================================================================
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setComponent(new
ComponentName("jp.test.app","jp.test.app.Main"));
intent.removeCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
======================================================================

一方、ブラウザから起動するときのタグは、下記のようにしています。
======================================================================
<a href="scheme_name://host_name">アプリA起動</a>
======================================================================

ブラウザの場合アプリ間とは違い、単純にschemeとhost指定のみです。
ブラウザからアプリを起動する場合、intentの細かい設定ができるものでしょうか?
Reply all
Reply to author
Forward
0 new messages