天天看點

ActivityManager

1.ActivityManager是android架構的一個重要部分,它負責一新ActivityThread程序建立,Activity生命周期的維護,本blog就是着手對ActivityManager架構作一個整體的了解

        上圖很清楚地描述了ActivityManager架構的幾個主要類之間的關系,我們做應用開發接觸很多的其實就是ActivityManager類,該類也在SDK中公布,應用可以直接通路,它提供了我們管理Activity的一些基本的方法

如下:

        public void testgetRecentTasks()

                //擷取最近的應用,最後啟動的排前

        public void testgetRunningTasks()

                //擷取目前運作的Activity應用

        public void testgetRunningServices()

                //擷取目前運作的service應用

        public void testgetRunningAppProcesses()

                //擷取所用系統運作的程序

        而這些操作都依賴于ActivityManagerProxy代理類的實作,IActivitManager接口定義了所有ActivityManager架構的操作,ActivityManagerProxy實作了接口IActivitManager,但并不真正實作這些方法,它隻是一個代理類,真正動作的執行為Stub類ActivityManagerService,ActivityManagerService對象隻有一個并存在于system_process程序中,ActivityManagerService繼承于ActivityManagerNative存根類。

        3.從前面分析知,ActivityManager存在于使用者程序中,由使用者程序調用擷取Activity管理的一些基本資訊,但是ActivityManager類并不真正執行這些操作,操作的真正執行在system_process程序中的ActivityManagerService,ActivityManagerService作為一個服務在system_process啟動時被加載,關于ActivityManagerService如何被加載這裡不展開讨論,後面在讨論android系統啟動時在探讨,那麼從ActivityManager到ActivityManagerService中間經過一個環節,那就是程序通信,而IActivityManager以及實作接口的代理類ActivityManagerProxy,存根類ActivityManagerNative起着負責程序通信的作用,我在前面的blog aidl實作機制淺析中有對程序通信作了較深入的分析,雖然這裡沒有使用aidl檔案定義程序通信接口IActivityManager,其實是一樣的,我們可以把它看做是自己手動編譯的aidl程序通信java類實作,ActivityManagerProxy是代理類,ActivityManagerNative是Stub類,IActivityManager是aidl接口,這樣就很容易了解了。

        4.ActivityManager提供了很少的方法,要能夠使用IActivityManager接口提供的其他方法我們可以直接使用ActivityManagerProxy對象,如何擷取?

return ActivityManagerNative.getDefault()

        不要被方法名稱所迷惑,由于我們在使用者程序調用,是不可能擷取一個ActivityManagerNative對象的(再說ActivityManagerNative是一個abstract類),我們實際擷取的是一個ActivityManagerProxy對象

        了解以上ActivityManager架構基本結構,後面深入研究它就要容易許多了

​Android FrameWork——PackageManager架構​

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;

        }

        IPackageManager pm = ActivityThread.getPackageManager();

        if (pm != null) {

            // Doesn't matter if we make more than one instance.

            return (mPackageManager = new ApplicationPackageManager(this, pm));

        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專門說一下ServiceManager