web-dev-qa-db-ja.com

AndroidウィジェットまたはアプリケーションでsingleTop launchModeを使用する必要があるのはいつですか?

ウィジェットに火傷したばかりです。問題の原因を確認することはできましたが、その理由や解決策を特定することはできませんでした。私のウィジェットは検索(SearchManager)を発行し、アクティビティは検索ダイアログを起動しましたが、ウィジェットにコールバックすると、ウィジェットへの別の参照が作成されました(つまり、スレッドIDは同じでしたが、ウィジェットID 65から0に変更されました)。

これにより、新しいインスタンスが作成されていると思い、問題に適用される設定をドキュメントで検索しました。最終的に、私はAndroid:launchMode="singleTop"そして、AndroidManifestに設定するとすぐに、ビオラ!ウィジェットが機能しました。

これにより、デバッグに2日の大部分がかかりました。

他の状況はありますか、または私の問題に対するより技術的に正しい答えはありますか?

27
mobibob

Android Docs-私は生涯彼らのドキュメントを読んで、私の頭を壊す新しい微妙な詳細を見つけることができました:)これは私が予期していなかった複数のインスタンスを説明します、ただし、発生するように構成しました。

AndroidManifest.xmlのアクティビティ定義に関するAndroidドキュメント

「標準」モードと「シングルトップ」モードは、1つの点で互いに異なります。「標準」アクティビティの新しいインテントがあるたびに、そのインテントに応答するためにクラスの新しいインスタンスが作成されます。各インスタンスは単一のインテントを処理します。同様に、「singleTop」アクティビティの新しいインスタンスを作成して、新しいインテントを処理することもできます。ただし、ターゲットタスクのスタックの最上位にアクティビティの既存のインスタンスが既にある場合、そのインスタンスは新しいインテントを(onNewIntent()呼び出しで)受け取ります。新しいインスタンスは作成されません。その他の状況-たとえば、「singleTop」アクティビティの既存のインスタンスがターゲットタスクにあるがスタックの最上部にない場合、またはスタックの最上部にあるがターゲットタスクにはない場合-新しいインスタンスが作成され、スタックにプッシュされます。

38
mobibob