-
ApplicationTHread是Thread的具體類查看全部
-
ActivityThread不同于HandlerThread,它并不是一個線程,而只是一個普通的方法查看全部
-
(接上一筆記) 2.handleDestroyActivity() ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); //回調(diào)自己的onDestory()方法 WindowManager wm = r.activity.getWindowManager();//通過activity.getWindowManager()獲得WindowManager對象,該對象是ViewManagerImpl的具體實(shí)現(xiàn)。 wm.removeViewImmediate(v); //刪掉activity的view,實(shí)現(xiàn)在WindowManagerImpl類中 …… Context c = r.activity.getBaseContext(); //activity創(chuàng)建時的context ((ContextImpl) c).scheduleFinalCleanup(r.activity.getClass().getName(), "Activity"); //在這里清除掉context if (finishing) { try { ActivityManagerNative.getDefault().activityDestroyed(token); //獲取AMS的代碼對象,然后通知AMS該activity將要銷毀 } 注意: (1)WindowManager的實(shí)現(xiàn)是在windowManagerImpl中 public final class WindowManagerImpl implements WindowManager (2)從handleDestroyActivity()最后可以看到,這里只是獲取AMS代理對象告訴AMS該activity已經(jīng)銷毀,但最終的銷毀動作還要由AMS去執(zhí)行查看全部
-
一、Activity\Window\WindowManager 1.Activity 負(fù)責(zé)整體的生命周期的管理,并接收WindowManagerService發(fā)送過來的事件(鍵盤、back鍵)進(jìn)行處理。 2.Window 就是PhoneWindow,控制界面的顯示和界面的添加,界面的管理要依靠WindowManager對象。 3.WindowManager 界面的管理,與遠(yuǎn)程的WindowManagerService交互,它是代理處理對象。 二、onStop\onDestory 1.handleStopActivity performStopActivityInner(r, info, show, true);//對activity自己回調(diào)onStop()方法 updateVisibility(r, show); //真正使activity處于不可見的狀態(tài) 在updateVisibility()中執(zhí)行不可見操作的代碼: if (r.activity.mVisibleFromServer) { r.activity.mVisibleFromServer = false; mNumVisibleActivities--; v.setVisibility(View.INVISIBLE); //設(shè)置為不可見 } 2.handleDestroyActivity() ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); //回調(diào)自己的onDestory()方法 WindowManager wm = r.activity.getWindowManager();//通過activity.getWindowManager()獲得WindowManager對象,該對象是ViewManagerImpl的具體實(shí)現(xiàn)。 Context c = r.activity.getBaseContext(); //activity創(chuàng)建時的context ((ContextImpl) c).scheduleFinalCleanup(r.activity.getClass().getName(), "Activity"); //在這里清除掉context查看全部
-
onResume()的分析——onResume是activity用來顯示它的內(nèi)容的。查看全部
-
6.(6)activity.attach() if (activity != null) { Context appContext = createBaseContextForActivity(r, activity); CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager()); Configuration config = new Configuration(mCompatConfiguration); activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config); attach()將會創(chuàng)建一個mWindow對象,將activity和windowManagerService關(guān)聯(lián)起來。 (7)mInstrumentation.callActivityOnCreate(activity, r.state) 這個就是回調(diào)activity自己的onCreate() mActivities.put(r.token, r);//onCreate()完成之后就會添加到mActivities這個list中 7.setContentView() public void setContentView(View view, ViewGroup.LayoutParams params) { getWindow().setContentView(view, params); initActionBar(); } 這里的getWindow()獲取的mWindow就是在activity.attach()中創(chuàng)建的,這個mWindow是和activity相關(guān)聯(lián)的。 注意setContentView()的具體實(shí)現(xiàn)是在PhoneWindow.java中。查看全部
-
6.Activity生命周期是什么時候回調(diào)的 (3)onCreate()的回調(diào)會調(diào)用handleLaunchActivity(),然后調(diào)用performLaunchActivity() activity.attatch()將創(chuàng)建的activity與WindowsManagerService向關(guān)聯(lián),進(jìn)而控制activity的窗口顯示。 (4)performLaunchActivity() Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); //r是ActivityClientRecord對象,r.packageInfo是安裝包名 activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent); //通過classLoader來創(chuàng)建activity對象 StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); if (r.state != null) { r.state.setClassLoader(cl); …… Application app = r.packageInfo.makeApplication(false, mInstrumentation); //在makeApplication()函數(shù)也是使用classLoader來創(chuàng)建Application對象的 (5)makeApplication() java.lang.ClassLoader cl = getClassLoader(); app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext); … mActivityThread.mAllApplications.add(app); … instrumentation.callApplicationOnCreate(app); //這里調(diào)用application自己的onCreate()查看全部
-
6.Activity生命周期是什么時候回調(diào)的 (1)Instrumentation是輔助的管理activity生命周期回調(diào)以及創(chuàng)建Application類的輔助類。 (2)H類繼承于Handler,它負(fù)責(zé)處理AMS發(fā)送過來的跨進(jìn)程間通信的message (3)接下來重點(diǎn)看一下一個activity是如何創(chuàng)建和啟動的查看全部
-
4. Context(上下文)類 如getResource()、SharedPreference都是通過Context實(shí)現(xiàn)的。 如圖,Context是一個接口類,它有個兩個子實(shí)現(xiàn)類——ContextImpl,ContextWrapper。其中ContextWrapper還有一個重要的子實(shí)現(xiàn)類Activity,所以Activity就是Context的一個實(shí)現(xiàn)類。 ContextImpl是Context接口的具體實(shí)現(xiàn)類,ContextThemeWrapper是Activity的theme主題父類,所以Activity是有界面的。 5. Activity和其他類有什么區(qū)別 Activity類作為一個總體框架,控制著數(shù)據(jù)在界面的顯示,但是它對activities的控制都是通過framework統(tǒng)一管理的,例如ActivityStack的管理,生命周期回調(diào),進(jìn)程間通信。 (1)ActivityThread作為客戶端 ActivityThread有一個重要的成員類final H mH = new H(),這個H類繼承于Handler類,它負(fù)責(zé)處理AMS發(fā)送過來的跨進(jìn)程間通信的message,handleMessage() public void handleMessage(Message msg) { switch (msg.what) { case LAUNCH_ACTIVITY: { ActivityClientRecord r = (ActivityClientRecord)msg.obj; //獲取對activity的描述,message是從遠(yuǎn)程AMS通過跨進(jìn)程間通信傳來的 r.packageInfo = getPackageInfoNoCheck(r.activityInfo.applicationInfo, r.compatInfo); handleLaunchActivity(r, null); //啟動這個activity …查看全部
-
2)thread.attach(false)主要完成與AMS之間的交互 ActivityManagerNative.getDefault()可以獲取AMS的一個遠(yuǎn)程代理接口。ActivityManagerNative是AMS的遠(yuǎn)程代理對象,AMS是運(yùn)行在一個單獨(dú)的進(jìn)程當(dāng)中的,如果想要在當(dāng)前的進(jìn)程使用AMS就需要調(diào)用getDedault()來獲取AMS的一個代理對象,相當(dāng)于和AMS進(jìn)行交互。 當(dāng)一個APP啟動時,主線程中會調(diào)用ActivityThread的main()函數(shù),main()中調(diào)用thread.attach()。attatch()函數(shù)中獲得AMS的遠(yuǎn)程代理對象后,會執(zhí)行代理對象的mgr.attachApplication(mAppThread)來告訴AMS該進(jìn)程已經(jīng)啟動。 mgr.attachApplication(mAppThread)中的mAppThread是實(shí)現(xiàn)Binder接口的一個類,下面會分析mgr.attachApplication(mAppThread)這個方法。 3. ApplicationThread、ActivityClientRecord、ActivityRecord (1)ApplicationThread,ApplicationThread繼承于ApplicationThreadNative public abstract class ApplicationThreadNative extends Binder implements IApplicationThread { 可以看到ApplicationThread實(shí)現(xiàn)了遠(yuǎn)程Binder類,它就是負(fù)責(zé)和AMS進(jìn)行通信的Binder實(shí)現(xiàn)類。ApplicationThread類在ActivityThread中創(chuàng)建。 (2)ActivityClientRecord和ActivityRecord 前者描述了客戶端Activity的一些屬性,后者是ActivityManagerService中描述activity屬性的類。查看全部
-
1. ActivityThread (1)ActivityThread不是一個線程類,只是一個普通的java類 public final class ActivityThread { 2. ActivityThread是如何被啟動的 (1)ActivityThread是在app啟動時運(yùn)行在該app主線程的一個類,只是在主線程中運(yùn)行而已。 ActivityThread啟動時main()是入口,執(zhí)行如下操作: Looper.prepareMainLooper();//準(zhǔn)備一個消息輪詢對象 ActivityThread thread = new ActivityThread(); thread.attach(false); Looper.loop();//開始輪詢消息隊列 注意:這一點(diǎn)和handler是相似的。 (2)當(dāng)啟動一個APP時,該APP進(jìn)程有一個主線程,在主線程中就會調(diào)用ActivityThread的main方法。 1)Looper.prepareMainLooper()會先調(diào)用prepare() private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { //先判斷是否本地thread中有Looper對象,如果沒有會創(chuàng)建一個looper throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); //默認(rèn)情況下主線程第一次創(chuàng)建時不會有個looper對象,會創(chuàng)建一個 } 2)thread.attach(false)主要完成與AMS之間的交互 ActivityManagerNative.getDefault()可以獲取AMS的一個遠(yuǎn)程代理接口 (下一筆記)查看全部
-
Android插件開發(fā)—首先需要充分理解Android四大組件的執(zhí)行流程,生命周期查看全部
-
好好查看全部
-
非常好查看全部
-
調(diào)用Activity的OnDestory()方法之后,并沒有將這個Activity對象置為null,它還是會在內(nèi)存中的查看全部
舉報
0/150
提交
取消