8

マニフェストで singleTask または singleInstance アクティビティとして定義されていても、アクティビティが複数回作成されるという興味深い問題が発生しました。これを再現できる方法を次に示します。メイン アクティビティで次のように言います。

@Override
protected void onResume() {
    Intent i = new Intent(MainActivity.class, SingleActivity.class);
    startActivity(i);
}

私の SingleActivity には、次のものがあります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Log.i("SingleActivity", "onCreate " + System.identityHashCode(this));
    ...
}

マニフェストには、次のものがあります。

    <activity android:name=".SingleActivity"
              android:launchMode="singleInstance"
    />

ここで、アプリケーションを起動すると、問題ないように見えます。1 つのケースを期待してくださいSingleActivity。. これは、ログに別の ID ハッシュ コードが表示されているため、私が知っていることです。MainActivityMainActivity.onResume()SingleActivity

起動モードが singleTask の場合も同様です。

唯一の回避策はオーバーライドするonBackPressed()ことですが、それは醜い解決策のようです。

私は何が間違っているのだろうか

4

2 に答える 2

13

の問題ですtaskAffinity。あなたまたはあなたtaskAffinityの のマニフェストで指定していないため、これら 2 つのアクティビティには同じ (デフォルト) があります。アクティビティを開始すると、Android は開始するアクティビティの をチェックします。タスクのルート アクティビティと同じである場合、無視する(これらの起動モードでは Android がアクティビティを起動する新しいタスクを作成する必要があるため)、現在のタスクでアクティビティを開始します。MainActivitySingleActivitytaskAffinitytaskAffinitytaskAffinitylaunchMode="singleInstance"launchMode="singleTask"

残念ながら、これは十分に文書化されていませんが、taskAffinityより優先されlaunchModeます。

singleTaskorアクティビティが本当に必要な場合singleInstance(これは通常、正しいことではありません。これは、間違いを犯す可能性が高い他の厄介なことをすべて混乱させるためです)、singleInstanceorsingleTaskアクティビティにマニフェストの<activity>定義の次のとおりです。

android:taskAffinity=""

さらに詳しい情報が必要な場合は、StackOverflow または Google で「launchmode taskaffinity」を検索してください。

于 2013-02-20T22:42:51.697 に答える
5

デフォルトでは、BACKキーを押すと、現在のアクティビティが終了(破棄)され、前のアクティビティがユーザーに表示されます。

だから、これは不可能です

すでに存在するものを前面に出す代わりに

アクティビティが存在しないためです。

于 2013-02-20T18:23:03.470 に答える