#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 .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:
Наиболее очевидным ответом было бы сохранение ссылки где-нибудь в безопасном месте, например, в служебном классе, в виде статических переменных в определенном порядке, например, в списке, но это может быть опасно, поскольку может привести к утечке памяти, поэтому убедитесь, что вы вручную обрабатываете ее и удаляете их при необходимости.