Android不仅可以装载众多的系统组件,还可以将它们跨进程组成ActivityTask,这个特性使得每个应用都不是孤立的。
activity task
从数据结构角度看,Task有先后之分,源码实现上采取了stack的方式。这种方式不仅符合用户的逻辑思维和使用习惯,还可以极大复用了系统的资源。

如图,contacts和SMS分属两个进程,当我们在联系人详情activity中调起了短信进程的短信编辑activity,那么这两个activity就被放到同一个task里面了。这是栈管理activity的方式。
但是ActivityTask不能算严格意义的Stack,默认情况和栈是一致的,但是Android提供了更多的操作方式。
affinity即喜好的意思,它代表这个activity希望归属的task,默认情况同一个程序有共同的affinity,<AndroidManifest.xml>中声明的Package Name。我们也可以主动在中使用taskAffinity标签属性来指定整个应用程序的Affinity。
一个activity task的affinity取决于它的根activity
在默认情况下,目标Activity将与startActivity的调用者处于同一Task中。但如果用户特别指定了FLAG_ACTIVITY_NEW_TASK,表明它希望为Activity重新开设一个Task。
这时就有两种情况:假如当前已经有一个Task,它的affinity与新Activity是一样的,那么系统会直接用此Task来完成操作,而不是另外创建一个Task;否则系统需要重启一个Task。
如果Activity指定了allowTaskReparenting,且后期程序的Task转为前台,它会被移动到和它更“亲近”的task中。
还有一种就是我们常见到的android:launchMode了,比较基础,这里就不展开了。
还有Intent的flag,具体可以查看源码或者官方文档。
Instrumentation机制
Base class for implementing application instrumentation code. When running with instrumentation turned on, this class will be instantiated for you before any of the application code, allowing you to monitor all of the interaction the system has with the application. An Instrumentation implementation is described to the system through an AndroidManifest.xml’s tag.
https://developer.android.com/reference/android/app/Instrumentation
Android系统在/system/bin下提供了很多“中介”程序让用户间接使用system server,例如pm、am等。
Instrumentation是ActivityManager的核心功能之一。
这是官方给出的Instrumentation的adb使用方法:

"-e"用于指定额外参数,这里给个使用例子:
adb shell am instrument -e class com.lxs.instrument.TestCase -w com.lxs.instrument /android.test.InstrumentationTestRunner
下面分析下它的执行"-e"和 [component]处理流程。
"am instrument"命令由runInstrument的am.java负责解析,和 [component]相关的代码如下:
//cnArg 就是Component字符串
String cnArg = nextArgRequired();
//unflatten规则就是以“/”为分隔符,前部分是package,剩余是Class。
ComponentName cn = ComponentName.unflattenFromString(cnArg);
“-e”后面所有的[name value]被保存到一个Bundle对象中,和其它参数一起传给AMS,AMS在承载它的进程进行关联后,由BindApplication的ActivityThread处理:
/*frameworks/base/core/java/android/app/ActivityThread.java*/
private void

3292

被折叠的 条评论
为什么被折叠?



