ActivityManager講解

1.ActivityManagerandroid框架的一個重要部分,它負責一新ActivityThread進程建立,Activity生命週期的維護,本blog就是着手對ActivityManager框架做一個總體的瞭解
        2.
先看一個靜態類結構圖:html

ActivityManager講解

        上圖很清楚地描述了ActivityManager框架的幾個主要類之間的關係,咱們作應用開發接觸不少的其實就是ActivityManager類,該類也在SDK中公佈,應用能夠直接訪問,它提供了咱們管理Activity的一些基本的方法
以下:
        public void testgetRecentTasks()
                //
獲取最近的應用,最後啓動的排前
        public void testgetRunningTasks()
                //
獲取當前運行的Activity應用
        public void testgetRunningServices()
                //
獲取當前運行的service應用
        public void testgetRunningAppProcesses()
                //
獲取所用系統運行的進程
       
 而這些操做都依賴於ActivityManagerProxy代理類的實現,IActivitManager接口定義了全部ActivityManager框架的操做,ActivityManagerProxy實現了接口IActivitManager,但並不真正實現這些方法,它只是一個代理類,真正動做的執行爲StubActivityManagerService,ActivityManagerService對象只有一個並存在於system_process進程中,ActivityManagerService繼承於ActivityManagerNative存根類。
        3.
從前面分析知,ActivityManager存在於用戶進程中,由用戶進程調用獲取Activity管理的一些基本信息,可是ActivityManager類並不真正執行這些操做,操做的真正執行在system_process進程中的ActivityManagerService,ActivityManagerService做爲一個服務在system_process啓動時被加載,關於ActivityManagerService如何被加載這裏不展開討論,後面在討論android系統啓動時在探討,那麼從ActivityManagerActivityManagerService中間通過一個環節,那就是進程通訊,而IActivityManager以及實現接口的代理類ActivityManagerProxy,存根類ActivityManagerNative起着負責進程通訊的做用,我在前面的blog aidl實現機制淺析中有對進程通訊做了較深刻的分析,雖然這裏沒有使用aidl文件定義進程通訊接口IActivityManager,實際上是同樣的,咱們能夠把它看作是本身手動編譯的aidl進程通訊java類實現,ActivityManagerProxy是代理類,ActivityManagerNativeStub類,IActivityManageraidl接口,這樣就很容易理解了。
        4.ActivityManager
提供了不多的方法,要可以使用IActivityManager接口提供的其餘方法咱們能夠直接使用ActivityManagerProxy對象,如何獲取?
return ActivityManagerNative.getDefault()
       
 不要被方法名稱所迷惑,因爲咱們在用戶進程調用,是不可能獲取一個ActivityManagerNative對象的(再說ActivityManagerNative是一個abstract),咱們實際獲取的是一個ActivityManagerProxy對象
       
 理解以上ActivityManager框架基本結構,後面深刻研究它就要容易許多了java

 

 

Android FrameWork——PackageManager框架android

 

1.接着前面講的ActivityManager框架,繼續說一下系統另外一個重要的框架,PackagerManager
一樣先看一下靜態類結構圖:框架

 

大部分狀況咱們是在Activity中使用getPackageManager方法獲取一個ApplicationPackageManager的對象,ApplicationPackageManager其實是包裝了一個IPackageManager.Stub.Proxy的對象
IPackageManager.Stub.Proxy代理執行PackageManager相關操做,IPackageManager.Stub.Proxy實際代理的是PackageManagerService,
2.
看了前面說的,可能你有點暈,咱們再來從新理一下:
       
 首先是IPackageManager是經過IPackageManager.aidl文件生成,同時生成了存根類IPackageManager.Stub,代理類:IPackageManager.Stub.Proxy
這個是packageManager進程通訊的基本框架,我前面blog有說,很少加說明了
       
 而後PackageManagerService,它繼承了IPackageManager.Stub,它做爲PackageManager動做的實際執行者,在system_process中存在
       
 再是咱們用戶應用程序中的ApplicationPackageManager,先看它如何被獲取的:
ContextImpl.java
中有一個方法:
    public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }
this

        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }
url

        return null;
    }
ApplicationPackageManager
其實是包裝了一個IPackageManager對象(IPackageManager.Stub.Proxy),當咱們調用queryIntentActivities時,實際經過代理對象去執行:
    public List<ResolveInfo> queryIntentActivities(Intent intent,
                int flags) {
            try {
                return mPM.queryIntentActivities(//mPM
IPackageManager.Stub.Proxy對象
                    intent,
                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
                    flags);
            } catch (RemoteException e) {
                throw new RuntimeException("Package manager has died", e);
            }
        }
進過進程通訊,在PackageManagerService執行對應操做:
3.PackageManagerService
的構建與獲取
--PackageManagerService
的構建:在system_process進程加載時,PackageManagerService被構建,在SystemServer.ServerThread.run中有以下一段代碼,它就是加載  PackageManagerService的:
            Slog.i(TAG, "Package Manager");
            pm = PackageManagerService.main(context,
                    factoryTest != SystemServer.FACTORY_TEST_OFF);//
啓動PackageManagerService
///////////////////////PackageManagerService///////////////////////////////////////////////////////////////////////////
    public static final IPackageManager main(Context context, boolean factoryTest) {
        PackageManagerService m = new PackageManagerService(context, factoryTest);
        ServiceManager.addService("package", m);
        return m;
    }
    --PackageManagerService
獲取:      
   
 先看前面在ContextImpl.java->getPackagerManager中:   
       IPackageManager pm = ActivityThread.getPackageManager();
/////////////////////ActivityThread////////////////
        public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        //Slog.v("PackageManager", "default service binder = " + b);
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //Slog.v("PackageManager", "default service = " + sPackageManager);
        return sPackageManager;
    }
    
 ServiceManager中獲取的服務pakager,該服務在.PackageManagerService的構建時被註冊到ServiceManager中的,ServiceManager機制暫時沒有深刻了解,後面再發blog專門說一下ServiceManagerspa

相關文章
相關標籤/搜索