Intereting Posts

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

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

Solutions Collecting From Web of "Как определить, является ли активность последней активностью в стеке"

Обратите внимание, что приведенное ниже решение будет работать только на 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(); } 

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

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

 <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 для синтеза нового обратного стека, указав, какой из них является соответствующим родителем для каждого вида деятельности.

Override onBackPressed as:

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

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

Вы могли бы просто использовать 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"); } 

Цитата из 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 ведет запись задачи runnings и самой верхней задачи.

  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

Используйте метод 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(); }