【问题标题】:How to find back stack activities in an android application?如何在 Android 应用程序中查找回栈活动?
【发布时间】:2011-12-21 00:14:39
【问题描述】:

我有一个带有活动回栈 A -> B -> C -> D -> E 的应用程序。现在在活动 E 中,我想知道我从中导航的回栈活动。我怎么找到这个??

【问题讨论】:

    标签: android back-stack activity-stack


    【解决方案1】:

    下面的代码可以用来提取所有的tasks以及back stack中每个task里面的top activity

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

    【讨论】:

    • 这与后退栈不同——后退栈可以在同一个任务中涉及多个活动。我认为没有办法按照 OP 的要求去做。
    • 这也需要 GET_TASK 权限
    • 从 LOLLIPOP (sdk 21+) 开始,由于安全原因,此功能已被弃用,并且仅返回以前版本中提供的信息的一小部分
    • @for3st 是否返回当前应用的信息?
    【解决方案2】:

    可以使用“adb shell dumpsys activity activities”命令

    供参考http://www.onsandroid.com/2015/01/find-back-stack-activities-in-android.html

    【讨论】:

    • 我现在得到了堆栈中的活动列表,我怎么能杀死?假设堆栈中的第三个活动
    【解决方案3】:

    我认为你可以通过 registerActivityLifecycleCallbacks 的这个 API 监听活动的变化来做到这一点:

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

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

    这将帮助您将自己的类添加到堆栈中,并根据需要查看完整状态。

    【讨论】:

      【解决方案4】:

      我不确定我能不能搞定...你想回到上一个活动吗?如果是这样,请完成当前活动,您将回到上一个活动。

      【讨论】:

      • 我想在活动 E 中找到,我已经从 A、B、C、D 导航到类似这样的地方
      • 好吧,Rajdeep Dua 给出了答案。 :P
      【解决方案5】:

      实际上,您可以使用 getRunningTasks 从 runningtaskinfo 中获取任务 id 然后,通过比较任务 id 使用 getRecentTasks 获取最近的任务信息。 现在您可以使用 startactivity 重新启动该活动,并在最近的任务信息中使用 baseintent。

      【讨论】:

        【解决方案6】:

        由于getRunningTasks(..) 已被弃用,或者如果您不想为您的应用添加特殊权限,如果所有活动都是您的,这里是一个替代解决方案:您可以标记一个标识符(不是活动本身,它可能在需要被垃圾收集)在单例StackLinkedListLinkedHashSet:在onPause() 中将标识符添加到堆栈并在onResume() 中删除它。

        您可以检查该堆栈的内容以了解是否有任何活动以及它们已创建的顺序。

        如果您的所有 Activity 都源自您应用的通用基础 Activity,您可以清理代码而忘记手动清理。

        【讨论】:

          【解决方案7】:

          我建议您使用startActivityForResult 而不是startActivity,然后为了检索origin/source 活动-调用getCallingActivity().getClassName()

          A 怎么知道它来自家里? 使用getIntent()

          getAction() -&gt; android.intent.action.MAIN

          getCategories() -&gt; android.intent.category.LAUNCHER

          【讨论】:

            猜你喜欢
            • 2017-12-16
            • 2012-08-10
            • 1970-01-01
            • 2011-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多