アプリとブラウザの連携について質問

2,379 views
Skip to first unread message

tk

unread,
Mar 15, 2011, 4:01:32 AM3/15/11
to 日本Androidの会
Android初心者です。長文失礼します。
アプリとブラウザの連携について、下記のような事をやりたいのですが、
分かる方がおられましたら、教えてください。

【概要】
・ランチャーからアプリAを起動(TOP画面が表示されます)
・TOPからブラウザ起動画面に遷移(「ブラウザ起動」というボタンを設けています)
・ブラウザ起動ボタンが押下されたら、ブラウザを起動(アプリ起動ページが表示されます)
 (ここで戻るキーを押されたらアプリAのブラウザ起動画面に戻ります)
・アプリ起動ページにはリンクがあり、クリックされたら再びアプリAを起動

【問題点】
ブラウザからアプリAを起動した場合、アプリは再起動されているように見える(TOPが表示される)のですが、
そこでいったんホームに戻って、ランチャーからアプリAを起動すると、直前の画面(ブラウザ起動画面)が表示されてしまいます。
また、ページから起動されたアプリAを終了(System.exit(0))させると、裏にいたブラウザがアクティブになりますが、
ここで戻るキーを押すと、下記の例外が出ます。

E/AndroidRuntime( 2411): FATAL EXCEPTION: main
E/AndroidRuntime( 2411): java.lang.RuntimeException: Unable to start
activity ComponentInfo...

「戻ろうとするアプリAがない」と言う事だと思います。
ブラウザで戻るキーが押されても、アプリに戻らなくてもいいので、
アプリとブラウザは、完全に単独で動作して欲しいのですが、方法が分かりません。
(その場合、ブラウザを起動したときに、アプリを終了させられればいいのですが)
intent関連の情報を調べてみても、上記のような使い方に関する説明がないので、
実現は不可能なのでしょうか?

ご存知の方おられましたら、ぜひご教授ください。



【補足】
・アプリAの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="appli_a" />
<data android:host="test" />
</intent-filter>


・起動ページのリンクは下記のようにしています
<a href="appli_a://test">アプリを起動</a>


よろしくお願いします。

tk

unread,
Mar 21, 2011, 11:45:35 PM3/21/11
to 日本Androidの会
追記です。
ごちゃごちゃと書きまして判りづらくなって申し訳ありません。
単純に、「アプリからブラウザを起動、その際アプリは終了させる」
ということが出来ればいいです(intentを使う必要がないかも?)。
どなたか、ご教授いただけると幸いです。

led

unread,
Mar 22, 2011, 8:58:32 AM3/22/11
to 日本Androidの会
私も情報が欲しくて先ほど登録したばかりの者です。
本件について最善解かはわかりませんが、
私は dispatchKeyEvent で戻るボタン(KEYCODE_BACK)をフックして
当該Activityにfinishをかけていました。


On 3月15日, 午後5:01, tk <kid.cyclone....@gmail.com> wrote:

tk

unread,
Mar 23, 2011, 9:30:11 PM3/23/11
to 日本Androidの会
未だ悪戦苦闘中です。

「アプリからブラウザを起動、その際にアプリ自身を終了させる」
これに関して、惜しいところまで行ったのですが、若干の問題が残っています。
アプリを起動し、ボタン押下でブラウザを起動することはできました。
その際、アプリを終了することはできました(ブラウザが起動した時点でタスクマネージャで確認)が、
どうやら完全に終りきっていない感じです。

具体的には、ブラウザが起動した後、ホームに戻って再びランチャからアプリを起動しようとすると、
反応なし(一瞬起動しようとしてる?ランチャ押しても、すぐアプリ一覧に戻ってくる)となります。
このとき、logcatを見て見ると、「Process xxxxxxx has died」と表示されています。
「さっき(最初に)立ち上がってたアプリを再開しようとしたけど、もう死んでるよ」
と言うことだと思います。もう一度ランチャを押すと、正常に起動します。
どうやら、ブラウザ起動時にアプリは終了したけど、ランチャがそれを認識していないように見えます。
推測ですが、ブラウザが起動した時点で、アプリがサスペンド状態になり、
終了処理が中途半端なところで止まっているのではないか?という感じです。

アプリからブラウザを起動する方法がダメなのか、ブラウザ起動後にアプリを終了する方法がダメなのか、
良く分からないのですが、試しにブラウザ起動のコードをコメントアウトすると、アプリはちゃんと終了しますし、
再びランチャから起動しても問題ありませんので、恐らくブラウザの起動方法が良くないのかなと思います。

ブラウザ起動のコードは、下記のようにしています。

Intent intent = new Intent(Intent.ACTION_VIEW, "http://xxxx");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


どなたか、ご教授お願いいたします。



On 3月15日, 午後5:01, tk <kid.cyclone....@gmail.com> wrote:

ayako horiuchi

unread,
Mar 23, 2011, 10:14:47 PM3/23/11
to android-g...@googlegroups.com
こんにちは。堀内です。

試してないのですが、こちら関係あるのではないかと思いました。
https://groups.google.com/group/android-group-japan/browse_thread/thread/e26ea7dd1931294c?hl=ja&pli=1


2011年3月24日10:30 tk <kid.cyc...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

ayako horiuchi

unread,
Mar 23, 2011, 10:41:15 PM3/23/11
to android-g...@googlegroups.com
こんにちは。堀内です。

ごめんなさい
間違えました><

お詫びに
android:clearTaskOnLaunch=ture
は試してみましたしょうか?
https://sites.google.com/a/techdoctranslator.com/jp/android/guide/manifest/activity-element#clear


2011年3月24日11:14 ayako horiuchi <hori...@gmail.com>:

Hiroshi Matsunaga

unread,
Mar 24, 2011, 12:36:16 AM3/24/11
to android-g...@googlegroups.com
松永と申します。

自作のアプリのActivityで
import android.os.Process;
のようにProcessをインポートして、

int pid = Process.myPid();
Process.killProcess(pid);
を実行してみてはいかがでしょうか?
私は、onPause()で、

public void onPause() {
Log.v(TAG, "Enter onPause");
super.onPause();
this.finish();
int pid = Process.myPid();
Process.killProcess(pid);
Log.v(TAG, "Exit onPause");
}

のようにしてみましたが、
ブラウザを立ち上げた後に、
自作のアプリのプロセスは死にました。

以上です。

2011年3月24日10:30 tk <kid.cyc...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
Hiroshi Matsunaga
email: hiroshi.82...@gmail.com

led

unread,
Mar 24, 2011, 1:17:08 AM3/24/11
to 日本Androidの会
ledです。

ごめんなさい、自環境で再現しません。
ボタン押下でブラウザキックするテストコード書いておきます。

どうやって自アプリ終わらせてますか?
また、onPause()やonStop()で変な処理してませんか?


public class Test_app_main extends Activity implements OnClickListener
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);

Button btnShowBrowser =
(Button)findViewById(R.id.btnshowbrowser);
btnShowBrowser.setOnClickListener(this);
}

@Override
public void onClick(View view_) {
// TODO 自動生成されたメソッド・スタブ

switch( view_.getId())
{
case R.id.btnshowbrowser:
Uri uri = Uri.parse("http://google.co.jp/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
break;

tk

unread,
Mar 24, 2011, 1:19:25 AM3/24/11
to 日本Androidの会
堀内さん、松永さん

ご指南ありがとうございます。
両方とも試してみたのですが、事象は変わらずです・・・。
ProcessMonitorアプリで見る限り、プロセスは確実に死んでいるようなのですが、
やはり、ランチャから起動しようとすると、一度アプリ一覧に戻ってしまいます。
Androidマーケットから落としたあるゲームアプリでは、上手くできているので、出来ないことはないんでしょうが。
何とも手詰まりです。。。

tk

unread,
Mar 24, 2011, 2:18:23 AM3/24/11
to 日本Androidの会
皆様

その後の調査で、なんとなく原因が掴めてきました。
現在、アプリを終了する際は、System.exit(0)とやっています。
何故だかわからないのですが、finish()では終了できなかったので、強制的に終らせていました。

ここからは推測でしかないのですが、強制的に終らせたせいで、プロセス自体は死ぬものの、
Android OSが終了を検知できず、システムが管理しているタスク情報が残っているのではないかと思います。
そのため、ランチャから再起動しようとすると、タスクが残ってると判断され、
そのタスクを再開しようとするものの、「もうなくなってるよ」という状態になっている、
原因は恐らくそんなところだろうと思います。

finish()の根本解決が先のようですね。もう少し調べて見ます。
Reply all
Reply to author
Forward
0 new messages