1

アプリケーションに GCM を実装しました。サーバーから受信したペイロードに従って、Activity(B) というアクティビティを開始しています。

私の要件は、アプリケーションの使用中にサーバーからその特定のペイロードを受信し、アクティビティ (A) にいると仮定すると、その時点で (A) が閉じ、アクティビティ (B) のみがそのアプリケーションのインスタンスにある必要があります。アクティビティ B が GCM の GCMIntentService クラスから開始されるとすぐに閉じる必要があります。

私が試したことはうまくいきませんでした。

Intent myIntent=new Intent(myContext,ActivityB.class);
myIntent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);
myContext.startActivity(myIntent);

フラグも試してみた

Intent.FLAG_ACTIVITY_NEW_TASK

すべての組み合わせで。

マニフェストファイルでlaunchModeなどの特別なパラメーターを使用していないアクティビティを宣言しているときに、マニフェストのどこかで間違っている可能性があるかどうか教えてください。

4

1 に答える 1

1

次のコードを使用して、アプリケーションのルート アクティビティ (つまり、マニフェストにACTION=MAINとがあるアクティビティ) を起動する必要があります。CATEGORY=LAUNCHER

Intent intent = new Intent(context, RootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("launchActivityB", true);

これにより、既存のタスクからすべてのアクティビティがクリアされ、 の新しいインスタンスが開始されますRootActivity。次RootActivity.onCreate()のコードを追加します ( への呼び出しの後にsuper.onCreate():

if (getIntent().hasExtra("launchActivityB")) {
    // We have been started so that we can launch ActivityB, finish and do that now
    finish(); // End this activity right now
    Intent intent = new Intent(this, ActivityB.class);
    startActivity(intent);
    return; // do no further processing in this activity
}

注: で起動しようとしても意図したとおりに動作ActivityBFLAG_ACTIVITY_CLEAR_TOPない理由は、FLAG_ACTIVITY_CLEAR_TOP動作方法が原因です。起動しようとしているアクティビティの既存のインスタンス (この場合ActivityB)の上 (前) にある既存のタスクからすべてのアクティビティをクリアします。タスクにの既存のインスタンスがなかったためActivityB、このフラグは何もしませんでした。

于 2013-06-18T21:42:35.327 に答える