国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

APP啟動(dòng)時(shí)Activity的進(jìn)程間通訊Binder機(jī)制

2019-11-09 14:26:29
字體:
供稿:網(wǎng)友

一 . 理論基礎(chǔ)

在Android中,由于Binder通信機(jī)制的存在,進(jìn)程遷移使用的非常非常頻繁,Android四大組件都可以進(jìn)行進(jìn)程間數(shù)據(jù)通訊。

對(duì)于Binder Service端:

(1) 定義AIDL文件來公開服務(wù)的接口(比如 scheduleLauncherActivity,bindapplication,shceduleReceiver或者mic,打開camera,點(diǎn)燈等等) (2)編譯AIDL生成對(duì)應(yīng)的接口interface的java文件 (3)實(shí)現(xiàn)自定義Android系統(tǒng) Service的java類,該類要求繼承(2)步中的interface的stub子類(eg:public static abstract class Stub extends android.os.Binder implements android.os.ILedService) 這樣該自定義服務(wù)變具備的 1. 硬件操控功能(實(shí)現(xiàn)了interface) 2.進(jìn)程間通訊功能 (因?yàn)槔^承了Binder) (4).將該service添加到SystemServer ( eg:ServiceManager.addService("lcled", new LedService());)

對(duì)于Binder Client端

(1)通過ServiceManager.getService("lcled")獲取遠(yuǎn)程服務(wù)的Binder,也即是遠(yuǎn)程Stub。(如Binder Service端(3)所示這個(gè)Stub需要實(shí)現(xiàn)功能接口Ixxx,又要繼承Binder類) (注意系統(tǒng)中首先要有ILedService 1. 可以利用mmm命令自編androdid系統(tǒng)生成相應(yīng)的class.jar,然后以jar的形式導(dǎo)入android studio并在PRoject Structure設(shè)置Dependency 然后在APP中import android.os.ILedService; 2 . 可以仿造應(yīng)用層,拷貝Service第一步aidl文件來生成相應(yīng)的java接口類 ) (2)利用ILedService.Stub.asInterface(第(1)步的Binder) ;轉(zhuǎn)成了對(duì)應(yīng)硬件功能接口的代理Proxy。因?yàn)樵揚(yáng)roxy在aidl生成java接口類時(shí),作為Stub的內(nèi)部類已經(jīng)實(shí)現(xiàn)了外部 父類接口,那么便可以利用Proxy擁有的成員方法訪問遠(yuǎn)程服務(wù),這樣實(shí)現(xiàn)了ipC通訊

總結(jié): AIDL只是一個(gè)類似Webservie的功能清單接口,繼承了它的類便可以擁有對(duì)應(yīng)的服務(wù)功能。

真正實(shí)現(xiàn)夸進(jìn)程通訊的是Binder,也就是該AIDL內(nèi)部的Stub類。(類似具體的SOAP了)服務(wù)的主調(diào)方獲取該Stub,然后利用該Stub內(nèi)部的代理Proxy調(diào)用功能接口。

二. 開始分析Activity的啟動(dòng)過程

主要涉及兩個(gè)方向的IPC通訊,分別對(duì)應(yīng)不同的功能的Binder實(shí)現(xiàn)類

當(dāng)APP代碼中調(diào)用startActivity時(shí), startActivitForResult mInstrumentation.execStartActivity(this,mainThread.getApplicationThread(),x,x,x,x,x) { IApplicationThread whoThread =( IApplicationThread ) mainThread.getApplicationThread() //這里的 IApplicationThread 就是一個(gè)AIDL生成的功能接口類

ActivityMannagerNative.getDefault().startActivity(whoThread,x,x,x,x,x......) }

*Note** :至此出現(xiàn)了第一個(gè)IPC通訊,ActivityMannagerNative( ActivityManagerNative extends Binder implements IActivityManager因此這個(gè) ActivityManagerNative對(duì)應(yīng)是AIDL中的Stub)

APP端作為Binder的Client 在 ActivityMannagerNative.java的ActivityMannagerNative.getDefault()方法中

IBinder b = ServiceManager.getService("activity"); (這里獲取的是ActivityMannagerService這個(gè)Binder) if (false) { Log.v("ActivityManager", "default service binder = " + b); } IActivityManager am = asInterface(b); if (false) { Log.v("ActivityManager", "default service = " + am); } return am;我猜測這里返回了ActivityMannagerProxy,注意這個(gè)ActivityMannagerProxy肯定是ActivityMannagerNative的內(nèi)部類,并且肯定實(shí)現(xiàn)了IActivityManager,看代碼果不其然那么繼續(xù)可以猜測ActivityMannagerService肯定繼承了ActivityMannagerNative,看源碼可以得到證實(shí)。(這里的ActivityMannagerService是具體實(shí)現(xiàn)IActivityManager接口功能java類,相當(dāng)于繼承AIDL中內(nèi)部stub的Ledservice這些具體功能類,見理論基礎(chǔ)第(3)步)這樣通過IPC,代碼從APP的進(jìn)程切換到AMS進(jìn)程system_process繼續(xù)執(zhí)行

現(xiàn)在到AMS的startActivity

startActivity(IApplicationThread caller,x,x,x.....) startActivityAsUser(IApplicationThread caller,x,x,x.....) mStackSupervisor.startActivityMayWait(IApplicationThread caller,x,x,x.....) startActivityLocked startActivityUncheckedLocked resumeTopActivityLocked resumeTopActivityLockedInnerLocked startSpecificActivityLocked realStartActivityLocked { app.thread.scheduleLaunchActivity(new Intent(r.intent),x,x,x.....) }

Note: 這里的app.thread類型為 IApplicationThread,分析源碼發(fā)現(xiàn)其繼承了IInterface接口,因此也是一個(gè)Binder, 而其實(shí)app.thread就是ActivityThread.ApplicationThread,這個(gè)Binder是ActivityThread與AMS進(jìn)程通信的時(shí)候傳過去的參數(shù),也就是上面IApplicationThread whoThread 至此,第二個(gè)Binder出現(xiàn)了,只不過這次是以client binder出現(xiàn),而APP的主線程ActivityThread的內(nèi)部類ApplicationThread才是這里的stub,那么可以猜測ApplicationThread一定繼承了Binder并且是實(shí)現(xiàn)了IApplicationThread,觀察源碼在ActivtyThread中有內(nèi)部類 ApplicationThread extends ApplicationThreadNative而 public abstract class ApplicationThreadNative extends Binder implements IApplicationThread { ,//真是果不其然

總結(jié),app調(diào)用了startActivity后,先從ActivityThread主線程通過第一個(gè)Binder(ActivityMannagerService)切入系統(tǒng)system_process調(diào)用AMS功能。而后又通過第一次RPC遠(yuǎn)程調(diào)用傳過去的Binder(ApplicationThread)切換回了APP的進(jìn)程,繼續(xù)執(zhí)行。而真正啟動(dòng)Activiy的功能代碼肯定還是在主線程ActivitThread的內(nèi)部類ApplicationThread中。

最終得到應(yīng)用APP啟動(dòng)的一個(gè)過程:

系統(tǒng)得到啟動(dòng)某個(gè)APP的命令后,主動(dòng)去啟動(dòng)Action為android.intent.action.MAIN. category ="android.intent.category.LAUNCHER"的Activity接著通過Binder ActivityMannagerService 將該請(qǐng)求發(fā)給在System_process執(zhí)行一些處理后,通過 ApplicationThread 這個(gè)Binder返回APP所在進(jìn)程,然后在進(jìn)程的主線程ActivityThread中通過給主線程的Handle發(fā)消息調(diào)用其handleLanucherActivity方法,

這里會(huì) 一. (1)獲取新Activity組件信息。 (2)利用類加載器ClassLoader創(chuàng)建新Activity (3)通過LoadedApl的makeApplicaotion方法創(chuàng)建Application(已經(jīng)存在則直接返回) (4)創(chuàng)建contextimpl并attach到新的activity (5)將activity與window關(guān)聯(lián) (6)mInstrumentation.callActivityOnCreate方法調(diào)用activity的onCreate方法 二. handleResumeActivity,最終調(diào)用activity的onResume方法


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 页游| 南陵县| 满城县| 敦化市| 左贡县| 乌苏市| 家居| 武邑县| 多伦县| 佳木斯市| 醴陵市| 虞城县| 大庆市| 山东| 菏泽市| 海宁市| 思南县| 镇江市| 长顺县| 岑溪市| 三河市| 盐源县| 建平县| 阳西县| 临漳县| 铜鼓县| 德格县| 红桥区| 安达市| 望城县| 商河县| 昌图县| 武乡县| 泰州市| 冀州市| 阆中市| 肥城市| 清苑县| 东乡县| 富源县| 阳高县|