开个头


在学习activity启动模式的时候,尤其是学到清单文件里taskaffinity这个属性和从其他应用打开本应用的某个activity时,都要对当前activity所在的栈的情况进行分析。那么如果获取activity所对应的栈呢?

用ActivityManager获取RunningTask


根据ActivityManager获取当前的任务栈(按手机的任务键,显示后台正在运行的程序,这些其实都是一个个的任务栈),也就是当前在屏幕运行的程序。获取到栈之后,再获取栈顶activity,也就是当前屏幕展示的activity。这样,就可以打印出来每个正在显示的activity的栈的信息。
简单看下代码
在BaseActivity里面
protected void getActivityTaskInfo() { ActivityManager manager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.RunningTaskInfo runningTaskInfo = manager.getRunningTasks(1
).get(0); //栈内activity数量 int numActivities = runningTaskInfo.numActivities;
//taskId int id = runningTaskInfo.id; ComponentName topActivity =
runningTaskInfo.topActivity;//栈顶activity信息 String className =
topActivity.getClassName(); Log.e("activityTask", "id == " + id + "\n" +
"numActivity == " + numActivities + "\n" + "className == " + className); }
@Override protected void onResume() { super.onResume();
//在onResume()里面调用这个方法,就可以保证每当有页面跳转的时候,都可以打印出当前显示的Activity的所在栈的信息
getActivityTaskInfo(); Log.e(this.toString(),
"----------------------------------onResume---------------------------------");
}
打印信息



这种查看方式也能稍微满足需求吧,但是总是不那么地优雅。

用adb查看任务栈信息

adb大家都清楚,是android sdk自带的一个工具,而且还比较的好用。

在windows系统中,配置好path环境变量(把adb.ext的路径添加到path里面,adb.exe就在sdk的platform-tools文件夹下)就可以用adb命令使用adb工具了。
在命令提示符中输入下面的命令,就可以查看所有任务栈的信息,可谓是极其方便。
adb shell dumpsys activity activities


可以看到,我按了虚拟机的多任务键后,显示手机现在有两个任务,也就是两个任务栈。并且在前台运行的是Phone这个界面。我们接下来看在命令提示符中打印的信息。由于日志很多,我们就截取了开头和中间我们用到的地方。

可以看到,红框里面的就是当前手机所有任务栈 和任务栈里面activity的信息。并且,每个任务栈内从下往上也是栈底到栈顶的顺序,整个框从下往上
也是任务从后台到前台的顺序。
TaskRecord{a5cf24e #4 A=com.example.hxytest U=0 sz=1}
其中 #4 就是任务栈的id,这个id也和我们上面用ActivityManager打印出来的id对应。
当我们把MainActivity切换到前台,把系统的拨打电话界面 切换到后台。再看adb的log


MainActivity跑到了系统DialtactsActivity上面。
ok,adb查看任务栈的东西就分享到这里。

如有错误,欢迎指正。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信