7

で始まるアプリケーションがありますSplashScreenActivity。その後、 aLoginActivityが表示されるか、ユーザーがすでにログインしている場合は aMainActivityが表示されます。アプリケーションがすでに実行されている場合はSplashScreenActivity、次のコマンドで終了します

//SplashScreenActivity
 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Adding this check for following cases
    if (!isTaskRoot())
    {
        String intentAction = getIntent().getAction();
        if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;
        }

        if(getIntent().getCategories().contains(GCMIntentService.INTENT_CATEGORY_GH_NOTIFICATION)){
            finish();
            return;
        }
    }

問題発生

PlayStore などの別のアクティビティからアプリケーションを起動すると、既に実行されている場合は適切なアクティビティで再開されます。これは、Intent2番目のアプリ内で再現するために使用しています

//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);

ただし、このアクションはどういうわけかバックスタックを壊しています。の backpress でアプリケーションを閉じる代わりに、アプリケーションをMainActivity再起動します。

//MainActivity.class
@Override
public void onBackPressed() {
    if (getNavDrawerMain().isDrawerOpen()) {
        getNavDrawerMain().closeDrawer();
    } else {
        closeApp();
    }
}

protected void closeApp() {
    if (doubleBackToExitPressedOnce) {
        //super.onBackPressed();   //i tried both, but behaviour is the same
        finish();
        return;
    }
    this.doubleBackToExitPressedOnce = true;

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() 
            doubleBackToExitPressedOnce = false;
        }
    }, 500);
}

私はブレークポイントを使用し、 MainActivity:onDestroy() が呼び出されることを発見しましたが、ホームスクリーンへのアプリケーションを再開する代わりに、常に再起動し、理由がわかりません。

私は次のことを試しました: - と のような異なる起動モードを使用singleTasksingleInstanceましたが、違いはありませんでした。onNewIntentが呼び出されますが、 を呼び出すfinishHomeActivity再起動します - 以下に示すように、試してみmoveTaskToBack(true)ましたが、アクティビティも再起動しています (そして、アプリを BackStack に移動するのではなく、実際に閉じたいと考えています)

4

2 に答える 2

2

アプリを閉じるmoveTaskToBack(true);代わりに試してみてください。finish();次に、OnRestart() に移動し、次に OnStart()->OnResume() に移動します (OnCreate には移動しません)。

また、Android 設定の開発者向けオプションで「アクティビティを保持しない」がマークされていないことを確認してください (ユーザーがアクティビティを離れるとすぐにすべてのアクティビティを破棄します)。

于 2015-08-14T02:24:47.407 に答える
1

アプリを開始するインテントにこのフラグを追加しようとしています: RESET_TASK_IF_NEEDED, URL= http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

機能:

設定されていて、このアクティビティが新しいタスクで開始されているか、既存のタスクを最上位に持ってきている場合、タスクのフロント ドアとして起動されます。

以下も使用できます: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

機能:

Context.startActivity() に渡された Intent に設定されている場合、このフラグにより​​、起動されたアクティビティが既に実行されている場合、そのタスクの履歴スタックの先頭に移動されます。

どちらを使用するかは、目的の最終結果によって異なります。

誰が開始するかを制御できない場合は、モードを単一タスクまたは単一インスタンスに設定または起動する必要があります。

ここで説明します:

http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

興味深い部分:

シングルタスク

このモードは、標準および singleTop とはかなり異なります。singleTask launchMode のアクティビティは、システム内にインスタンスを 1 つだけ持つことができます (別名シングルトン)。システムに既存のアクティビティ インスタンスがある場合、インスタンスを保持するタスク全体が先頭に移動し、インテントは onNewIntent() メソッドを介して配信されます。そうしないと、新しいアクティビティが作成され、適切なタスクに配置されます。

于 2015-08-12T05:32:10.077 に答える