Android: BackStack ведет себя неправильно, если приложение было запущено из другого приложения

У меня есть приложение, которое начинается с SplashScreenActivity, После этого LoginActivity или, если пользователь уже вошел в систему, MainActivity Показано. Если приложение уже запущено, 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, оно возобновляется с правильного действия, если оно уже запущено. Это Intent Я использую для воспроизведения во втором приложении

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

Тем не менее, это действие каким-то образом разбивает Backstack. Вместо закрытия приложения на 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(), но вместо возобновления приложения на HomeScreen оно всегда перезапускается, и я не знаю почему.

Я попробовал следующее: - Использовал разные режимы запуска, такие как singleTask а также singleInstance, но это не имело никакого значения. onNewIntent называется, но если я позвоню finish, HomeActivity перезапускается - как отмечено ниже, я пытался moveTaskToBack(true), но активность тоже возобновляется (и мы действительно хотим закрыть приложение, а не перемещать его в BackStack)

2 ответа

Попробуй с moveTaskToBack(true); вместо finish(); закрыть приложение. Затем он перейдет к OnRestart(), а затем OnStart()->OnResume() (и не перейдет к OnCreate).

И убедитесь, что в настройках Android в настройках Android нет пометки "Не сохранять действия" (уничтожьте все действия, как только пользователь их покинет).

Попытка добавить этот флаг в ваше намерение при запуске приложения: RESET_TASK_IF_NEEDED, URL = http://developer.android.com/reference/android/content/Intent.html

Что оно делает:

Если установлено, и это действие либо запускается в новой задаче, либо выводится на вершину существующей задачи, то оно будет запущено как входная дверь задачи.

Вы также можете использовать: http://developer.android.com/reference/android/content/Intent.html

Что оно делает:

Если этот параметр установлен в намерении, переданном в Context.startActivity(), этот флаг приведет к тому, что запущенное действие будет перенесено в начало стека истории его задачи, если оно уже выполняется.

Какой вы используете, зависит от желаемого конечного результата.

Если вы не можете контролировать, кто запускает, вам нужно установить или запустить режим для одной задачи или одного экземпляра.

Описано здесь:

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

Интересная часть:

singleTask

Этот режим сильно отличается от стандартного и одиночного. В Activity с singleTask launchMode разрешено иметь только один экземпляр в системе (он же Singleton). Если в системе существует существующий экземпляр Activity, вся удерживаемая задача будет перемещена в верхнюю часть экземпляра, а Intent будет доставлен через метод onNewIntent(). В противном случае новая активность будет создана и помещена в соответствующую задачу.

Другие вопросы по тегам