Activity 與普通類 有什么區別?
Activity生命周期本質
Activity在AMS中的處理邏輯(Activity Manager Service)
ActivityThread是什么?
ActivityThread 是運行在 Activity主線程中的一個普通的java類.本身不是一個線程
在主線程方法中運行---->調用ActivityThread main()方法
(消息隊列準備, 啟動)
ActivityThread 源碼分析
main()
Looper.prepareMainLooper();//準備消息隊列
public static void prepareMainLooper(){
prepare(false);
:
:
:
.......
}
private static void prepare(boolean quitAllowed){
if(sThreadLocal.get()!=null){
throw new RuntimeException("Only one Looper may be created per Thread");
sThreadLocal.set(new Looper(quitAllowed);//創建一個消息隊列
}
}
//可以看出這一步主要是創建一個消息隊列
Looper.loop()
開始循環處理消息
Thread.attach
主要處理和AMS的交互,通信
private void attach(boolean system){
//ActivityManagerNative是AMS的遠程代理對象,因為AMS在一個單獨的線程當中 代理模式?
final IActivityManger mgr= ActivityManagerNative.getDefault();
try{
mgr.attachApplication(mAppThread);//ApplictionThread類 調用遠程binder文件 傳輸數據
}catch(){}
}
ApplicationThread
private class ApplicationThread extends ApplicationThreadNative{
//往下看下繼承的類
}
public abstract class ApplicationThreadNative extends Binder implements IApplication
//和AMS 通信的一個 Binder的具體實現類
處理具體的邏輯,在ActivityThread中初始化
ActivityClientRecord
定義Activity的描述的記錄,配置信息,Window等等等等..
Context是什么 --環境 相關資源
本身是一個接口.
Paste_Image.png
Activity extends ContextThemeWrapper //Activity是Context的一個實現類
public abstract class Context{
//定義了一些 Acitity所需資源/方法
}
ContextWrapper extends Context{ //具體實現
Context mBase;
public ContextWrapper(Context base){//傳進來mbase
mbase = base;
}
//for example
@override
public Resources getResources(){
return mBase.getResources();
}
}
//mbase 是Context的具體實現類
class ContextImp extends Context{
}
Activity與其他類有什么不同
控制界面的顯示,由FrameWork統一處理和管理. 本質與其他類相同同
Activity 生命周期
ActivityThread 控制Activity生命周期一些方法回調,具體回調由AMS跨線程通信回調(結合前文理解)
ActivityThread中的一個成員變量H
Paste_Image.png
處理AMS跨線程通信的具體邏輯
Activity生命周期具體回調
Instrumentation
本質:負責打開Activity的生命周期方法/創建Application對象 /啟動Activity
for example:
startActivity();
startActivityForResult();最終都是調用此類
本質:輔助AMS管理Activity生命周期
ActivityManagerNative
本質:輔助AMS與客戶端跨線程交互(結合前文理解)
H類 H extends Handler
本質:處理AMS發送過來的具體消息 (看圖片)
框架層學習筆記,僅供參考,代碼為手打,錯誤之處煩請指正,歡迎交流 qq:11417998