解开Android应用程序组件Activity的“singleTask”之谜(2)

这样,原材料就准备好了,接下来就要编译了。有关如何单独编译Android源代码工程的模块,以及如何打包system.img,请参考如何单独编译Android源代码中的模块一文。

执行以下命令进行编译和打包:

USER-NAME@MACHINE-NAME:~/Android$ mmm packages/experimental/Task       USER-NAME@MACHINE-NAME:~/Android$ make snod     

这样,打包好的Android系统镜像文件system.img就包含我们前面创建的Task应用程序了。

再接下来,就是运行模拟器来运行我们的例子了。关于如何在Android源代码工程中运行模拟器,请参考在Ubuntu上下载、编译和安装Android最新源代码一文。

执行以下命令启动模拟器:

USER-NAME@MACHINE-NAME:~/Android$ emulator  

模拟器启动起,就可以App Launcher中找到Task应用程序图标,接着把它启动起来:

解开Android应用程序组件Activity的“singleTask”之谜


点击中间的按钮,就会以"singleTask"的方式来启动SubActivity:

解开Android应用程序组件Activity的“singleTask”之谜


现在,我们如何来确认SubActivity是不是在新的任务中启动并且位于这个新任务的堆栈底部呢?Android源代码工程为我们准备了adb工具,可以查看模拟器上系统运行的状况,执行下面的命令查看;

USER-NAME@MACHINE-NAME:~/Android$ adb shell dumpsys activity  

这个命令输出的内容比较多,这里我们只关心TaskRecord部分:

Running activities (most recent first):       TaskRecord{4070d8f8 #3 A shy.luo.task}         Run #2: HistoryRecord{406a13f8 shy.luo.task/.SubActivity}         Run #1: HistoryRecord{406a0e00 shy.luo.task/.MainActivity}       TaskRecord{4067a510 #2 A com.android.launcher}         Run #0: HistoryRecord{40677518 com.android.launcher/com.android.launcher2.Launcher}  

果然,SubActivity和MainActivity都是运行在TaskRecord#3中,并且SubActivity在MainActivity的上面。这是怎么回事呢?碰到这种情况,Linus Torvalds告诫我们:Read the fucking source code;去年张麻子又说:枪在手,跟我走;我们没有枪,但是有source code,因此,我要说:跟着代码走。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgxdw.html