Как найти действия обратного стека в приложении для Android?

#android #back-stack #activity-stack

#Android #обратный стек #активность-стек

Вопрос:

У меня есть приложение с задним стеком действий A -> B -> C -> D -> E. Теперь в действии E я хочу узнать действия обратного стека, из которых я перешел. Как мне это найти??

Ответ №1:

Приведенный ниже код можно использовать для извлечения всех задач и верхней активности в каждой задаче в обратном стеке

 ActivityManager m = (ActivityManager) ctx.getSystemService( ctx.ACTIVITY_SERVICE );
List<RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(10);
Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator();
while(itr.hasNext()){
    RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next();
    int id = runningTaskInfo.id;
    CharSequence desc= runningTaskInfo.description;
    int numOfActivities = runningTaskInfo.numActivities;
    String topActivity = runningTaskInfo.topActivity.getShortClassName();
}
  

Комментарии:

1. Это не то же самое, что обратный стек — задний стек может включать несколько действий в рамках одной задачи. Я не думаю, что есть способ сделать то, что просит OP.

2. Также для этого требуется разрешение GET_TASK

3. Начиная с версии LOLLIPOP (sdk 21 ), это устарело и возвращает только очень небольшое подмножество информации, предоставленной в предыдущих версиях из соображений безопасности

4. @for3st возвращает ли он информацию о текущем приложении?

Ответ №2:

Вы можете использовать команду «действия adb shell dumpsys activity activities»

для справки http://www.onsandroid.com/2015/01/find-back-stack-activities-in-android.html

Комментарии:

1. Теперь я получил список действий в стеке, как я могу убить? пусть предположим, что 3-я активность в стеке

Ответ №3:

Поскольку getRunningTasks(..) оно устарело или если вы не хотите добавлять специальные разрешения в свое приложение, вот альтернативное решение, если все действия принадлежат вам: вы можете пометить идентификатор (не само действие, возможно, его нужно собирать в мусор) в одноэлементном Stack , LinkedList или LinkedHashSet : в onPause() добавить идентификатор встек и удалите его onResume() .

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

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

Ответ №4:

Я думаю, вы можете сделать это, прослушивая изменения действий с помощью этого API registerActivityLifecycleCallbacks :

https://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)

https://developer.android.com/reference/android/app/Application .ActivityLifecycleCallbacks.html

Это поможет вам добавлять в стек свои собственные классы и просматривать полное состояние по своему усмотрению.

Ответ №5:

Я рекомендую вам использовать startActivityForResult вместо startActivity , затем, чтобы получить origin/source вызов activity getCallingActivity().getClassName() .

Как А узнает, что оно пришло из дома? Используйте getIntent() его

getAction() -> android.intent.action.MAIN

и

getCategories() -> android.intent.category.LAUNCHER

Ответ №6:

Я не уверен, что хорошо понимаю…Вы хотите вернуться к предыдущему действию? Если это так, завершите текущее действие, и вы вернетесь к предыдущему.

Комментарии:

1. я хочу найти, что при выполнении действия E я перешел из A, B, C, D примерно так

2. Хорошо, тогда у Rajdeep Dua есть ответ. : P

Ответ №7:

на самом деле, вы можете получить идентификатор задачи из runningtaskinfo с помощью getRunningTasks, а затем получить recenttaskinfo с помощью getRecentTasks, сравнив идентификатор задачи. теперь вы можете перезапустить это действие, используя startactivity, с baseintent в recenttaskinfo .

Ответ №8:

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