Я хочу знать, будет ли пользователь возвращаться на главный экран, если он выйдет из текущей активности.
Как проверить, является ли действие последним в стеке действия для приложения?
Ответ 1
Существует возможность проверки текущих задач и их стека с помощью ActivityManager.
Итак, чтобы определить, является ли действие последним:
- запросить разрешения android.permission.GET_TASKS в манифесте.
-
Используйте следующий код:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE ); List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10); if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) { Log.i(TAG, "This is last activity in the stack"); }
Обратите внимание, что вышеуказанный код будет действителен только в том случае, если у вас есть одна задача. Если есть вероятность того, что количество задач будет существовать для вашего приложения - вам нужно будет проверить другие элементы taskList. Подробнее о задачах Задачи и Back Stack
ОБНОВЛЕНИЕ (июль 2015):
Так как getRunningTasks() устарел, из API 21 лучше следовать raukodraug или Ed Burnette один (я бы предпочел второй).
Ответ 2
Я собираюсь опубликовать комментарий @H9kDroid как лучший ответ здесь для людей, у которых есть аналогичный вопрос.
Вы можете использовать isTaskRoot, чтобы узнать, является ли действие корнем задачи.
Я надеюсь, что это поможет
Ответ 3
есть самое простое решение, вы можете использовать isTaskRoot() в вашей деятельности
Ответ 4
Хотя может быть способ достичь этого (см. другие ответы), я бы предположил, что вы не должны этого делать. Обычным Android-приложениям не нужно знать, будет ли отображаться главный экран.
Если вы пытаетесь сохранить данные, поместите код сохранения данных в свой метод onPause(). Если вы пытаетесь дать пользователю возможность изменить свое мнение о существующем приложении, вы можете перехватить ключ вверх/вниз для клавиши "Назад" и метода onBackPressed() и представить их с помощью "Вы уверены?". приглашение.
Ответ 5
Один из способов отслеживания этого - включить маркер при запуске нового действия и проверить, существует ли маркер.
Всякий раз, когда вы начинаете новое действие, вставьте маркер:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
И вы можете проверить его следующим образом:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Ответ 6
Проблема с решением sandrstar с использованием ActivityManager
заключается в следующем: вам нужно получить разрешение на выполнение задач таким образом.
Я нашел лучший способ:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
на дне стека все равно будет получать эту категорию по умолчанию, а другие действия не должны ее получать.
Но даже если это не удается на некоторых устройствах, вы можете установить его при запуске Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Ответ 7
Я создал базовый класс для всех своих действий, расширяя AppCompatActivity и имеющий статический счетчик:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
До сих пор это работало достаточно хорошо; и независимо от версии API. Конечно, это требует, чтобы все действия расширяли этот базовый класс - что они делают, в моем случае.
Изменить: Я заметил один экземпляр, когда счетчик опускается до нуля до того, как приложение полностью выйдет, т.е. когда ориентация изменена и открыто только одно действие. Когда ориентация изменяется, активность закрывается, а другая создается, поэтому для последнего действия вызывается onDestroyed
, а затем onCreate
вызывается, когда одна и та же активность создается с измененной ориентацией. Это должно учитываться; OrientationEventListener можно было бы использовать.
Ответ 8
Android реализует стек активности, я предлагаю вам прочитать об этом здесь. Похоже, все, что вы хотите сделать, это получение вызывающей активности: getCallingActivity()
. Если текущее действие является первым действием в вашем приложении, и приложение было запущено с главного экрана, оно должно (я предполагаю) вернуть null
.
Ответ 9
Единственное, что пропустило здесь, - это щелчок "Домашний ключ", когда он активирован, вы не можете обнаружить это из своей активности, поэтому было бы лучше управлять стеком активности программно, нажав кнопку "Назад" и переместившись на требуемой деятельности или просто делать необходимые шаги.
Кроме того, вы не можете быть уверены, что запуск вашей активности из списка "Недавняя активность" может быть обнаружен с предварительной настройкой некоторых дополнительных данных в намерение для открытия активности, поскольку в этом случае они будут повторно использоваться.