如何获取活动历史记录堆栈的列表



我正在努力解决应用程序中的问题。我想提供一种方法来列出以前打开的活动的历史记录。

我认为有两种潜在的解决方案,但我不确定找到一种稳定的方式来实现其中任何一个。

  • 以某种方式使用 SDK 中的函数。我尝试使用 getPackageManager() 和 getActivityManager(),但我找不到任何合适的解决方案
  • 实现我自己的历史记录,但随后我将不得不覆盖 startActivity,我真的不想以这种方式下降,因为活动可以通过其他多种方式启动。

那么有没有办法使用 SDK 中的函数来做到这一点呢?

非常感谢。

编辑:

我有另一个想法,有点不同。是否可以使用某种接收器收听特定应用程序(我的)的"开始/结束活动"事件并跟踪堆栈历史记录?

使用 ADB 命令:

adb shell dumpsys activity activities  # displays list of activities in back stack
adb shell dumpsys activity process  # displays list process in back stack
adb shell dumpsys activity intents  # displays list of pending intents in back stack
adb shell dumpsys activity broadcast  # displays list of broadcast in back stack
adb shell dumpsys activity services  # displays list of services running in back stack

使用活动管理器:

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

那么有没有办法使用 SDK 中的函数来做到这一点呢?

不,对不起。

是否可以使用某种接收器收听特定应用程序(我的)的"开始/结束活动"事件并跟踪堆栈历史记录?

您可以在Application上使用registerActivityLifecycleCallbacks(),如果您只打算支持 API 级别 14 及更高版本(又名 Android 4.0+)。

您可以使用以下方法:

ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
int sizeStack =  am.getRunningTasks(2).size();
for(int i = 0;i < sizeStack;i++){
    ComponentName cn = am.getRunningTasks(2).get(i).topActivity;
    Log.d("", cn.getClassName());
}

获取活动堆栈的列表。

实现活动历史记录的一个非常简单的方法是使用类名

mainActivity中定义activity_history_list

public static List<String> activity_history_list;

以及您创建的每项活动的每onStart()(例如MainActivity

 @Override
    public void onStart() {
        super.onStart();
        activity_history_list.add(MainActivity.this.getClass().getSimpleName());
    }

在另一个活动中(例如SettingActivity

 @Override
        public void onStart() {
            super.onStart();
            MainActivity.activity_history_list.add(SettingActivity.this.getClass().getSimpleName());
        }

只要activity_history_list static,您可以一次打印所有历史记录,也可以通过以下方式访问历史记录中的特定活动index

最新更新