am.java_6.3.1 从am说起

am和pm(见4.4.2节)一样,也是一个脚本,它用来和AMS交互,如启动Activity、启动Service、发送广播等。其核心文件在Am.java中,代码如下:

**Am.java::main**

~~~

public static void main(String[] args) {

try {

(newAm()).run(args);//构造一个Am对象,并调用run函数

}......

}

~~~

am的用法很多,读者可通过adb shell登录手机,然后执行am,这样就能获取它的用法。

利用am启动一个activity的方法如下:

~~~

am start [-D] [-W] [-P ][--start-profiler ] [-S]

~~~

其中:

- 方括号中的参数为可选项,尖括号中的参数为必选项。

- 参数有很多,主要是用于设置Intent的各项参数。

假设已知某个Activity的ComponentName(package名和Activity的Class名),启动这个Activity的相应命令如下:

~~~

am start -W -n com.dfp.test/.TestActivity

~~~

其中,-W选项表示am将会等目标Activity启动后才返回,-n表示后面的参数用于设置Intent的Component。就本例而言,com.dfp.test为Package名,.TestActivity为该Package下对应的Activity类名,所以将要启动的Activity的全路径名为com.dfp.test.TestActivity。

现在就以上面的命令为例来分析Am的run函数,代码如下:

**Am.java::run**

~~~

privatevoid run(String[] args) throws Exception {

mAm =ActivityManagerNative.getDefault();

mArgs =args;

String op= args[0];

mNextArg =1;

if (op.equals("start")) runStart();//用于启动Activity

else if ......//处理其他参数

}

~~~

runStart函数用于处理Activity启动请求,其代码如下:

**Am.java::runStart**

~~~

privatevoid runStart() throws Exception {

Intentintent = makeIntent();

StringmimeType = intent.getType();

//获取mimeType,

if(mimeType == null && intent.getData() != null

&& "content".equals(intent.getData().getScheme())) {

mimeType = mAm.getProviderMimeType(intent.getData());

}

if(mStopOption) {

......//处理-S选项,即先停止对应的Activity,再启动它

}

//FLAG_ACTIVITY_NEW_TASK这个标签很重要

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ParcelFileDescriptor fd = null;

if(mProfileFile != null) {

try{......//处理-P选项,用于性能统计

fd = ParcelFileDescriptor.open(......)

}......

}

IActivityManager.WaitResult result = null;

int res;

if(mWaitOption) {//mWaitOption控制是否等待启动结果,如果有-W选项,则该值为true

//调用AMS的startActivityAndWait函数

result = mAm.startActivityAndWait(null,intent, mimeType,

null, 0, null, null, 0,false, mDebugOption,

mProfileFile, fd,mProfileAutoStop);

res= result.result;

} ......

......//打印结果

}

~~~

am最终将调用AMS的startActivityAndWait函数来处理这次启动请求。下面将深入到AMS内部去继续这次旅程。

* * * * *

**提示**:为什么选择从am来分析Activity的启动呢?如果选择从一个Activity来分析如何启动另一个Activity,则将给人一种鸡生蛋、蛋孵鸡的感觉,故此处选择从am入手。除此之外,从am来分析Activity的启动也是Activity启动分析中相对简单的一条路线。

* * * * *


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部