日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

am.java_6.3.1 从am说起

發(fā)布時間:2024/10/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 am.java_6.3.1 从am说起 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ù)有很多,主要是用于設置Intent的各項參數(shù)。

假設已知某個Activity的ComponentName(package名和Activity的Class名),啟動這個Activity的相應命令如下:

~~~

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

~~~

其中,-W選項表示am將會等目標Activity啟動后才返回,-n表示后面的參數(shù)用于設置Intent的Component。就本例而言,com.dfp.test為Package名,.TestActivity為該Package下對應的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選項,即先停止對應的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。