Android: launchMode singleTop не работает, если приложение открыто из другого приложения

У меня есть приложение, которое ведет себя неправильно, если оно запущено из другого приложения (например, через PlayStore). Вместо возобновления к уже существующему Activity он перезапускается как новый экземпляр.

Что я имею:

  • объявлено каждое действие с launchMode="singleTop"in manifest.xml
  • Я попытался сделать то же самое с launchMode=singleTask, но он ведет себя так же.
  • использовал дополнительные intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) для каждого Intent, который запускает новый Activity
  • onNewIntent() не вызывается в уже запущенном экземпляре

Я использовал следующий код, чтобы запустить свое приложение из другого приложения (с дополнительными addFlag() и без них)

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
launchIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(launchIntent);

Моя Launcher-Activity - это SplashScreenActivity, которая запускает MainActivityif пользователь вошел в систему со следующим кодом и получает finished()

 Intent intent = null;
 intent = new Intent(SplashScreenActivity.this, HomeActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
 startActivity(intent);
 finish();

Что мне не хватает? Любые рекомендации приветствуются!


person longi    schedule 04.08.2015    source источник


Ответы (2)


После еще нескольких исследований я добавил следующий код в SplashScreenAvtivity:onCreate()

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

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

}

Это закрывает SplashScreenActivity, если приложение уже запущено. Это работает со всеми launch-modes

person longi    schedule 06.08.2015

Попробуйте использовать singleTask вместо singleTop для SplashScreenActivity. Согласно http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

«Система создает действие в корне новой задачи и направляет к нему намерение. Однако, если экземпляр действия уже существует, система направляет намерение существующему экземпляру через вызов своего метода onNewIntent(), а не чем создавать новый».

person shivam gupta    schedule 05.08.2015
comment
забыл признать, я пробовал launchMode=singleTask и singleInstance, но поведение остается прежним..... - person longi; 06.08.2015
comment
singleTask опасен, так как очищает все вышеперечисленные действия - person thecr0w; 06.12.2019