2012-04-03 7 views
1

他のアプリがインテントを通じて起動できるようにするAndroidアプリがあります。仕掛けられていないAndroidの子アクティビティを処理する方法

Intent intent = new Intent("com.myapp.dosomething"); 
intent.putExtra("com.myapp.value1", "1.25"); 
intent.putExtra("com.myapp.value2", "bob"); 

startActivity(intent); 

私の活動はインテントフィルタで開始されています:

これは、呼び出し元のアプリケーションは、(APP-Aそれを呼び出す)以下のん

など他のアプリは、鉱山と相互作用して、最初の入力を提供することができます

<intent-filter> 
<action android:name="com.myapp.dosomething" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

ユーザーが私のアプリケーションの通常の流れを辿ると、すべてうまく動作します。ユーザーは物事をして、ユーザーが完了したことを知ったとき、自分のアクティビティでfinish()を呼び出します。すべてが素敵です。

しかし、私のアプリで何かをやっていると、ユーザーはタスクを終了するのではなく、ホームボタンを押すことになり、大きな問題が発生します。彼らがランチャーからApp-Aを試して再起動すると、代わりに私のアプリがポップアップします。ユーザーはアプリケーションを強制終了せずにApp-Aに戻ることはできません。さらに悪いことに、私のアプリは起動間のデータを保持しないように特別に設計されています。この方法で再起動すると、最初に渡された余分なデータがなくなるので、私のアプリはこの他のアプリがまだ私を待っています。

App-Aがアプリで待っていないように設定するにはどうすればよいですか?私のアプリが何をしているかにかかわらず、実行を続けることができるはずです。私のアプリケーションがクラッシュしたり、値を返さなかったりする場合、私は呼び出し元のアプリケーションを永遠に掛けたくはありません。

アイデア?

ありがとうございました。

+0

「ユーザーはアプリを強制終了せずにApp-Aに戻ることはできません」 - なぜBACKボタンを押すことはできませんか?それは私のために同様の状況で動作します。 – Squonk

+0

まあ、私がアプリケーションAを起動した場合、ユーザーが最後に実行したアプリケーションに関係なく、アプリケーションBが起動するとは思わない。また、様々な理由から、現在、バックボタンをブロックしています(これは間もなく変更される予定ですが、プロジェクトの開始時には設計上の決定が悪い)。しかし、関係なく、最初にapp-aを試して起動しようとすると、私たちのアプリは起動しないはずです。子アクティビティを処理するアクティビティには、いくつかのメカニズムが必要です。 – user456771

+0

OK - あなたは物事をきれいにしたいと思うが、それはAndroidがデフォルトで動作する方法です。私の場合、私のアプリはユーザーの自宅のPCに動画のリストを表示します。彼らがビデオを選択すると、私のアプリはビデオをストリーミングするためにサードパーティのビデオプレーヤーアプリを起動します。ユーザーがHOMEにアクセスしてから、後でもう一度アプリを起動すると、サードパーティのアプリでビデオの再生が再開されます。言い換えれば、私のアプリでのユーザーの最後の行動は、ビデオを開始することでした。ところで、デフォルトの振る舞いが間違っているとは思わないが、私は答えが不思議であるので、あなたの質問をアップしたのは私だった。 – Squonk

答えて

0

終了時: アプリが起動し、必要なデータが送信されなかった場合、おそらく説明したシナリオが発生した可能性があるので、すぐに終了してエラーを示します(startActivityForResultでアプリが呼び出されたと仮定した場合、エラーを示す結果コード)。あなたはもうあなたに尋ねられたことのための文脈がなく、あなたのアプリを待っているデータはとにかくデータを取得していないので、ユーザーは期待していたアプリに戻ってくるかもしれません。彼らの最後に

: 呼び出し元のアプリはフラグを追加する必要があります:ユーザーが予想される場所呼び出し元のアプリケーションが再起動される次回に到着するよう

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 

このフラグは、アクティビティスタックから呼ばれるアプリをクリアします。

基本的には、このような状況に対処するために最善を尽くすことができますが、このフラグを追加してこのシナリオを適切に処理するのは、呼び出し側のアプリです。

+0

これを処理するために、呼び出し側アプリケーションが実行する必要があるものはありますか?私はタスクのリセットフラグとそれが何か違いがないように見えるときにクリアを追加しようとしました。私のアプリケーションがfinish()を呼び出さず、呼び出し元のアプリケーションが再び起動された場合、ユーザーはまだ私のアプリケーションにプッシュバックされます。 – user456771

+0

私のテストでは、私のアプリがエラーや何かで終わっていないように、電話やその他の中断のためにユーザがタスクを放棄したと仮定しています。別のコメントで言及したように、私のアプリは、セキュリティ上の理由とアプリケーションの再開時にデータをパージするよう意図的に設計されているため、中断したところから続けることができません。ランチャー)私は余分な意図のデータを再送しないので、私が発信者に応答しているはずであることを私が知る方法はありません。 – user456771

0

これで多くの不具合が発生した後、実際には起動フラグなどが役に立たないようです。本当の唯一の解決策は、いつ私のアプリが外部から起動されたかを追跡し、この場合にアプリが中断されたときにいつも終了するようにすることでした。

常にonPauseを終了することで、呼び出し元のアプリケーションが常に何らかの応答を受け取るようにします。中断された操作の場合、単に「取り消された」結果を戻します。

関連する問題