Почему после перезагрузки создаются два экземпляра activity?

#android #android-activity

#Android #android-activity

Вопрос:

У меня есть загрузочный приемник, который получает событие BOOT_COMPLETED и запускает действие по умолчанию для моего приложения следующим образом:

 if(MyApplication.GetCurrentActivity()==null)
{
    Intent mActivityIntent = new Intent(context, LauncherActivity.class);
    mActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(mActivityIntent);
}
  

Я настраиваю activity после его запуска. GetCurrentActivity() вернет значение null, если не запущено никаких действий или последнее запущенное действие.
Пока проблем нет.

Но если пользователь коснется значка приложения до запуска LauncherActivity, будут созданы два экземпляра одних и тех же activities, поскольку они находятся в двух разных задачах (я предполагаю). Как предотвратить это и запустить только один экземпляр activity.

Ответ №1:

Попробуйте —

 if(MyApplication.GetCurrentActivity()==null)
{
  Intent mActivityIntent = new Intent(context, LauncherActivity.class);

  mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
  Intent.FLAG_ACTIVITY_NEW_TASK);

  mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

  startActivity(mActivityIntent);

  finish();
}
  

Обновить:

Затем вы можете использовать FLAG_ACTIVITY_REORDER_TO_FRONT

Этот флаг приведет к тому, что запущенное activity будет перенесено в начало стека истории его задачи, если оно уже запущено.-

 if(MyApplication.GetCurrentActivity()==null)
    {
      Intent mActivityIntent = new Intent(context, LauncherActivity.class);

      mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

      startActivity(mActivityIntent);

      finish();
    }
  

Например —

Рассмотрим задачу, состоящую из четырех действий: A, B, C, D . Если D вызывается startActivity() с намерением, которое преобразуется в компонент activity B, то B будет перенесен в начало стека истории в следующем результирующем порядке: A, C, D, B .

Комментарии:

1. Я не хочу очищать все другие activity, которые находятся на переднем плане. Мне просто нужен только один экземпляр этой activity, и если его нет на переднем плане, пусть он будет. Я не хочу, чтобы это выводилось на передний план, если пользователь этого не хочет.

2. Какое значение здесь имеет FLAG_ACTIVITY_NO_HISTORY?

3. ФЛАГ_АКТИВНОСТИ_НО_ИСТОРИИ — если установлен, новое activity не сохраняется в стеке истории. Как только пользователь переходит от него, activity завершается.

4. Что произойдет, если пользователь попытается запустить приложение еще до завершения загрузки? Существует ли какой-либо собственный метод для обработки этого?

Ответ №2:

Вы можете использовать:

  <activity
        android:name="name"
        android:label="label"
        android:launchMode="singleTop">
 </activity>
  

При этом запускается только один экземпляр activity. Теперь вы можете реализовать onNewIntent().

Надеюсь, это поможет вам 🙂