Подтвердить что ты не робот

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

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

DeepLink Tap > Открыть желаемую активность > пользователь нажмет кнопку назад > Проверить, не было ли его последнее действие, но не на дому. Активна. Если да, перейдите на домашнюю страницу.

Пробовал следующий код:

@Override
public void onBackPressed() {
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())){
  //// This is last activity
}
else{
    //// There are more activities in stack
}

super.onBackPressed();
}

Android Studio Evalation

Я тоже пробовал isTaskRoot, но результат такой же. Это не дает правильного ответа. Пожалуйста, помогите

4b9b3361

Ответ 1

Использовать метод isTaskRoot(). (Из h9kdroid комментарий - здесь)

@Override
public void onBackPressed() {
   ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
   List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

   if(isTaskRoot()){
     //// This is last activity
   } else{
     //// There are more activities in stack
   }

   super.onBackPressed();
}

Ответ 2

Обратите внимание, что приведенное ниже решение будет работать только на API14 +.

Создайте собственный класс приложения;

public class App extends Application {

    private int created;

    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(new Callbacks());
    }

    public int getCreated() {
        return created;
    }

    private class Callbacks implements ActivityLifecycleCallbacks {

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            created++;
        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            created--;
        }
    }
}

Зарегистрируйте его в своем AndroidManifest.xml в элементе приложения;

<application name=".App"/>

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

@Override
public void onBackPressed() {
    if (((App) getApplicationContext()).getCreated() == 1) {
        // start your home activity
    }

    super.onBackPressed();
}

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

Ответ 3

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

<activity
    android:name=".DesiredActivity"
    android:parentActivityName="com.packagename.HomePage" >
    <!-- The meta-data element is needed for versions lower than 4.1 -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.packagename.HomePage" />
</activity>

С объявленной родительской активностью вы можете использовать API NavUtils для синтезировать новый задний стек путем определения того, соответствующий родитель для каждого вида деятельности.

переопределить onBackPressed как:

@Override
public void onBackPressed() {
        Intent intent = NavUtils.getParentActivityIntent(this);
        startActivity(intent);
        super.onBackPressed();
}

Сайт разработчика Android имеет очень хороший ресурс для одной и той же проблемы. См. Ссылку http://developer.android.com/training/implementing-navigation/temporal.html#SynthesizeBackStack

Ответ 4

Цитата из ActivityManager.RunningTaskInfo

Информация, которую вы можете получить о конкретной задаче, которая в настоящее время "работает" в системе. Обратите внимание, что выполняемая задача не означает, что данная задача фактически имеет процесс, в котором он активно работает; это просто означает, что пользователь пошел к нему и никогда не закрывал его, но в настоящее время система, возможно, убила свой процесс и только последнего состояния, чтобы перезапустить его, когда пользователь вернется.

                   String getLastOpenClass ;// Global 

                    ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
                    List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
                    ComponentName componentInfo = taskInfo.get(0).topActivity;
                    componentInfo.getPackageName();
                    getLastOpenClass=taskInfo.get(0).topActivity.getClassName();
                    if(getLastOpenClass.equals("Your_Class_Name"))
                    {

                    }else{

                    }

Дайте разрешение <uses-permission android:name="android.permission.GET_TASKS" />

ActivityManager ведет запись задачи выполнения и самой последней задачи.

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

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

Пожалуйста, проверьте Как получить текущее имя пакета действий переднего плана

http://developer.android.com/intl/es/reference/android/app/ActivityManager.html#getRunningTasks%28int%29

Ответ 5

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

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