四大組件的工作原理《Android開發藝術探索》筆記

Activity的總結與工作原理

Activity的總結

類型:是一個展示型組件。
作用:展示一個界面並與用戶交互。
使用:

  • 需要在AndroidManifest註冊
  • 需要藉助Intent啓動:
    顯示啓動:Intent intent= new Intent(this,Activity2.class),startActivity(intent)注意傳入的是class而不是Acitivity
    隱式啓動Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);intent會匹配可以響應Action與Category的Acitivity並啓動該Acitivity。

四種啓動模式
1.Standard:普通模式。每次啓動一個Activity就會創建一個新的實例

2.SingleTop:棧頂複用模式。當棧頂爲當前要啓動的Acitivity,則不會啓動Acitivity,直接調用onNewIntent方法;

3.SingleTask:棧內複用模式,當所啓動的Activity在當前的棧內,則不會啓動Activity,直接調用onNewIntent方法;如果沒有找到則會先去判斷是否存在當前棧,如果不存在則會創建當前尋找的棧,並將Activity放入其中,否則直接將Activity放入當前棧中。

4.singleInstance:單例模式。具有此模式的Activity只能單獨位於一個任務棧中,且此任務棧中只有唯一一個實例

使用finish方法可以結束一個Activity。

Activity的工作原理

首先調用startActivity(intent)方法,這個方法最終會調用startActivityForResult()方法,同時requestCode爲-1以區分正常調用該方法的情況。

之後會調用AMS(ActivityMangerService)的startActivity方法,AMS是一個實現了binder的類。通過IPC機制會繼續調用AppllactionThread(ActivityThrea內部類)的scheduleLaunchAcitivity方法,在該方法中會通過sendMessage與Handler通信

Handler H會首先調用handleLaunchActivity方法,之後會調用performLaunchActivity方法。在performLaunchActivity中會完成對Activity的創建與啓動。

performLaunchActivity方法一共完成了如下工作

(1)從AcitivityClientRecord中獲取Activity的組件信息;
(2)通過Instrumentation來創建Activity,使用類加載器的方式(ClassLoader.loadClass);
在這裏插入圖片描述
(3)調用了makeApllication方法,嘗試創建Application(只會有一個Application),內部也是通過Instumentation以類加載器的方式創建的;
(4)創建ContextImpl對象,並通過Acitivity的attach方法來完成一些重要參數的初始化。(通過attach方法建立了ContextImpl與Activity的關係);
(5)調用Activity的onCreate方法。
在這裏插入圖片描述

總結

1.Activity的AMS和ActivityThread都是Binder;

2.Activity和Applaction的創建都是通過Instumentation創建的,類加載模式(loadClass方法)

3.AMS的startActivity方法會通過IPC方式調用Applaction的scheduleLaunchActivity,並在其中使用sendMessage方法,進而使用HandlerH

4.HandlerH對消息的處理是通過HandlerH的handleLaunchActivity與performLaunchActivity完成的,並最終創建和啓動Activity

Service的總結與工作原理

類型:計算型組件。
作用:執行一些需要長期運行的程序。
使用:

  • 需要在AndroidManifest註冊
  • 需要藉助Intent開啓
    Intent intent = new Intent(this, xxx.class); startService(intent);

兩種開啓方法:
1.startService(intent)開啓服務;
2.bindService(intent,Serviceconnection,flag)綁定服務,unbind(ServiceConnection)取消綁定服務。

不可以被用戶看見;
通過stopServiceunbind完成停止一個服務。

工作原理

Service的啓動

首先調用startService()方法,之後調用ContextImpl的startService方法,進而調用startServiceCommon方法。接下來會調用AMS的startService方法。

AMS的startService會調用ActiveService的方法,ActiveService是一個輔助AMS進行管理的類,包括Service的啓動綁定和停止。最終會調用ActiveService的realStartServiceLocked()方法

在realStartServiceLocked首先會調用ApplicationThread的scheduleCreateService進行創建服務並調用其onCreate方法,調用SendServiceArgs來回調Service的onStartCommand方法。上述兩個方法都是跨進程方法。

**scheudleCreateService方法的邏輯與ScheudleLaunchActivity相似,都是調用sendMessage,使用Handler來執行操作。**而sendServiceArgsLock,則會去調用Handler的handleServiceArgs方法。

Handler會調用handleCreateService。handleCreateService一共做了四件事:(1)會通過類加載的方式創建Service的實例,(2)創建Applaction並調用OnCreate方法。(3)創建ContextImpl並通過Service的attach方法建立與Service的連接。(4)調用Service的onCreate方法並將Service存儲在ActivityThread的一個ArrayMap中;

handleServiceArgs方法會調用Service中的onStartCommand方法。

其中ActivityServices應該是ActiveService
在這裏插入圖片描述

Service的綁定

與啓動相類似,首先調用ConextWrapper的bindService方法,之後調用ContextImpl的bindService方法(進而調用bindServiceCommon方法)。

在bindServiceCommon方法中主要是將ServiceConnection對象轉化爲Binder對象(因爲可能會跨進程,將ServiceConnection轉換爲ServiceDisapcther.InnerConnection)

之後類似地,調用AMS的bindService方法;AMS會調用realStartSeriviceLocked方法完成服務的創建與上面相同,不同的是會調用requestServceBindingLocked方法進行綁定

調用requestServceBindingLocked方法會調用ApplicationThread的shceduleBindService,通過sendMessage發送消息給Handler H,並調用handleBindService方法。

在handleBindService方法中,首先通過onBind獲取Binder對象,之後調用AMS中的publishService方法,去通知客戶端結果。

publishService會繼續調用ActiveServices的publishServiceLocked方法,核心調用是核心代碼c.conn.connected(r.name, service); 其中c.conn是ServiceDispatcher.InnerConnection,Service就是Service的onBind返回的Binder對象。這個connected方法就會去調用ServiceConnection的onServiceConnected方法。

整個過程結束。
在這裏插入圖片描述

總結

1.ContextImpl是Context的實現,可以通過Actvity的attach方法與其建立連接。Activity.attach()中還會完成Window的創建並和Activity&Window的關聯,由此事件可傳遞給Window。

2.ActiveServices是一個輔助AMS的類,在該類中可以進行服務的創建(realStartedServiceLocked)與綁定(requestServceBindingLocked)。同時其中的方法後綴都是Locked

3.與Activity類似的,Service的創建與綁定最終都會回到ActivityThread類下的handleCreateServicehandleBindService。同時handleServiceArgs是用於回調Service中的其他方法。注意綁定同時要告知客戶端,所以要調用AMS的publishService方法。(ActivityThread下的方法都是handlexxxx,因爲都是Handler H的方法)

BroadCast工作原理與總結(留着之後學)

總結

1.Activity的啓動過程:

(1)startActivity->startActivityForResult(requestcode=-1)->ActivityMangagerService(Binder對象)的startActivity;

(2)通過IPC的方式,調用ApllicationThread的scheduleLaunchActivity,在該方法中會通過sendMessage來發送消息;

(3)之後HanlderH會接收到消息,並分別調用handleLaunchActivity->performLaunchActivity來完成Activity的創建與啓動。

performLaunchActivity一共完成了以下幾個工作:(1)通過ActivityClientRecord獲取要啓動的Activity的組件信息;(2)通過Instrumentation的newActivity方法來創建Activity,使用的是類加載的方式(loadClass);(3)使用LoadedAPKmakeApplication來嘗試創建Application,內部調用Instrumentation來創建Apllication,也是類加載的方式;(4)創建ContextImpl,同時使用Activity的attach,與ContextImpl 建立聯繫,並進行初始化操作。(5)調用Activity的onCreate函數。

2.Service的啓動與綁定過程

Service的啓動過程

(1)調用startService(intent)->ContextImpl的startServiceCommon->AMS的startService;
(2)AMS會調用ActiveService的方法,ActiveService是一個輔助AMS的服務,最終會調用它的realStartServiceLocked來開啓服務。
(3)realStartServiceLocked方法之後會調用ApplicationThread的scheduleCreateService,通過sendMessage與Handler H通信,並調用hadnleCreateService。完成對Service的創建和啓動。
(4)realStartServiceLocked也會調用SendServiceArgs來調用handleServiceArgs,並最終回調用Service的onStartCommand方法。

HandleCreateService主要做到了:(1)完成對Service的創建(類加載模式);(2)創建Application並調用onCreate方法(3)創建ContextImpl並通過Service的attach方法建立兩者聯繫;(4)調用Service的onCreate方法並將Service對象存儲在ActivityThread的一個ArrayMap中。

Service的綁定過程

bindService(intent,serviceConnection,flag)->ContextImpl的bindServiceCommon,在該函數中需要將ServiceConnection對象轉換爲一個Binder對象,以便跨進程通信,轉換爲ServiceDispatcher.InnerConnection。

之後會調用AMS的bindService,進而調用ActiveService的方法,調用realStartServiceLocked和Service開啓相似;調用requestServiceBindingLocked實現綁定功能

之後會調用Application的scheduleBindService,來通知Hanlder H,Handler H會調用handleBindService來綁定,

在該函數中首先通過onBind方法獲取服務端的Binder對象,然後需要通知客戶端綁定結果。因此調用AMS的publishService方法,該方法會最終回調ServiceConnection對象的onServiceConnected。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章