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



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

570   9  

9 ответов:

обновление (июль 2015):

С getRunningTasks() получить устаревшие, из API 21 лучше следовать raukodraugответ или Эд Бернетомодин (Я бы предпочел второе).


Есть возможность проверить текущие задачи и их стек с помощью ActivityManager.

Итак, чтобы определить, является ли действие последним один:

  • запрос android.разрешение.Разрешения только в манифесте.
  • использовать следующий код:

    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");
    }
    

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


Я собираюсь оставить комментарий @H9kDroid а самый лучший ответ здесь для людей, которые имеют подобный вопрос.

можно использовать isTaskRoot () чтобы узнать, является ли действие корнем задачи.

надеюсь, это поможет

есть простое решение для этого, вы можете использовать isTaskRoot () в вашей деятельности

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

Если вы пытаетесь сохранить данные, поместите код сохранения данных в метод onPause (). Если вы пытаетесь дать пользователю возможность изменить свое мнение о существующем приложении, вы можете перехватить ключ up/down для ключа Back и метода onBackPressed () и представьте их с "вы уверены?" проворный.

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

всякий раз, когда вы начинаете новое действие, вставьте маркер:

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);

и вы можете проверить это следующим образом:

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")

проблема с решением sandrstar с помощью ActivityManager is: вам нужно разрешение, чтобы получить задачи таким образом. Я нашел лучший способ:

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

The Activity на дне стека должен всегда получить эту категорию по умолчанию, в то время как другие действия не должны получить его.
Но даже если это не удается на некоторых устройствах, вы можете установить его при запуске Activity:

Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);

Я создал базовый класс для всех моих деятельности, расширяя 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. Это, конечно, требует, чтобы все действия расширяли этот базовый класс - что они и делают, в моем случае.

Edit: я заметил один случай, когда счетчик опускается до нуля, прежде чем приложение полностью выйдет, когда ориентация изменено и открыто только одно действие. Когда ориентация меняется, действие закрывается и создается другое, поэтому onDestroyed вызывается для последнего действия, а потом onCreate вызывается, когда одно и то же действие создается с измененной ориентацией. Такое поведение должно быть объяснено;OrientationEventListener может быть использован.

Android реализует стек активности, я предлагаю вам прочитать об этом здесь. Похоже, что все, что вы хотите сделать, это получить вызов activity:getCallingActivity(). Если текущая активность является первой активностью в вашем приложении, и приложение было запущено с главного экрана, оно должно (я предполагаю) вернуть null.

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

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

Comments

    Ничего не найдено.