am.java_6.3.1 从am说起
am和pm(見4.4.2節(jié))一樣,也是一個腳本,它用來和AMS交互,如啟動Activity、啟動Service、發(fā)送廣播等。其核心文件在Am.java中,代碼如下:
**Am.java::main**
~~~
public static void main(String[] args) {
try {
(newAm()).run(args);//構(gòu)造一個Am對象,并調(diào)用run函數(shù)
}......
}
~~~
am的用法很多,讀者可通過adb shell登錄手機,然后執(zhí)行am,這樣就能獲取它的用法。
利用am啟動一個activity的方法如下:
~~~
am start [-D] [-W] [-P ][--start-profiler ] [-S]
~~~
其中:
- 方括號中的參數(shù)為可選項,尖括號中的參數(shù)為必選項。
- 參數(shù)有很多,主要是用于設(shè)置Intent的各項參數(shù)。
假設(shè)已知某個Activity的ComponentName(package名和Activity的Class名),啟動這個Activity的相應(yīng)命令如下:
~~~
am start -W -n com.dfp.test/.TestActivity
~~~
其中,-W選項表示am將會等目標Activity啟動后才返回,-n表示后面的參數(shù)用于設(shè)置Intent的Component。就本例而言,com.dfp.test為Package名,.TestActivity為該Package下對應(yīng)的Activity類名,所以將要啟動的Activity的全路徑名為com.dfp.test.TestActivity。
現(xiàn)在就以上面的命令為例來分析Am的run函數(shù),代碼如下:
**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 ......//處理其他參數(shù)
}
~~~
runStart函數(shù)用于處理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選項,即先停止對應(yīng)的Activity,再啟動它
}
//FLAG_ACTIVITY_NEW_TASK這個標簽很重要
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ParcelFileDescriptor fd = null;
if(mProfileFile != null) {
try{......//處理-P選項,用于性能統(tǒng)計
fd = ParcelFileDescriptor.open(......)
}......
}
IActivityManager.WaitResult result = null;
int res;
if(mWaitOption) {//mWaitOption控制是否等待啟動結(jié)果,如果有-W選項,則該值為true
//調(diào)用AMS的startActivityAndWait函數(shù)
result = mAm.startActivityAndWait(null,intent, mimeType,
null, 0, null, null, 0,false, mDebugOption,
mProfileFile, fd,mProfileAutoStop);
res= result.result;
} ......
......//打印結(jié)果
}
~~~
am最終將調(diào)用AMS的startActivityAndWait函數(shù)來處理這次啟動請求。下面將深入到AMS內(nèi)部去繼續(xù)這次旅程。
* * * * *
**提示**:為什么選擇從am來分析Activity的啟動呢?如果選擇從一個Activity來分析如何啟動另一個Activity,則將給人一種雞生蛋、蛋孵雞的感覺,故此處選擇從am入手。除此之外,從am來分析Activity的啟動也是Activity啟動分析中相對簡單的一條路線。
* * * * *
總結(jié)
以上是生活随笔為你收集整理的am.java_6.3.1 从am说起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp无法解析java方法_Spring
- 下一篇: 报警器开关量无源不带电有源带电区别