Как проверить, является ли действие последним в стеке действия для приложения?

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

Ответ 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

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

Кроме того, вы не можете быть уверены, что запуск вашей активности из списка "Недавняя активность" может быть обнаружен с предварительной настройкой некоторых дополнительных данных в намерение для открытия активности, поскольку в этом случае они будут повторно использоваться.