-
ApplicationTHread是Thread的具体类查看全部
-
ActivityThread不同于HandlerThread,它并不是一个线程,而只是一个普通的方法查看全部
-
(接上一笔记) 2.handleDestroyActivity() ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); //回调自己的onDestory()方法 WindowManager wm = r.activity.getWindowManager();//通过activity.getWindowManager()获得WindowManager对象,该对象是ViewManagerImpl的具体实现。 wm.removeViewImmediate(v); //删掉activity的view,实现在WindowManagerImpl类中 …… Context c = r.activity.getBaseContext(); //activity创建时的context ((ContextImpl) c).scheduleFinalCleanup(r.activity.getClass().getName(), "Activity"); //在这里清除掉context if (finishing) { try { ActivityManagerNative.getDefault().activityDestroyed(token); //获取AMS的代码对象,然后通知AMS该activity将要销毁 } 注意: (1)WindowManager的实现是在windowManagerImpl中 public final class WindowManagerImpl implements WindowManager (2)从handleDestroyActivity()最后可以看到,这里只是获取AMS代理对象告诉AMS该activity已经销毁,但最终的销毁动作还要由AMS去执行查看全部
-
一、Activity\Window\WindowManager 1.Activity 负责整体的生命周期的管理,并接收WindowManagerService发送过来的事件(键盘、back键)进行处理。 2.Window 就是PhoneWindow,控制界面的显示和界面的添加,界面的管理要依靠WindowManager对象。 3.WindowManager 界面的管理,与远程的WindowManagerService交互,它是代理处理对象。 二、onStop\onDestory 1.handleStopActivity performStopActivityInner(r, info, show, true);//对activity自己回调onStop()方法 updateVisibility(r, show); //真正使activity处于不可见的状态 在updateVisibility()中执行不可见操作的代码: if (r.activity.mVisibleFromServer) { r.activity.mVisibleFromServer = false; mNumVisibleActivities--; v.setVisibility(View.INVISIBLE); //设置为不可见 } 2.handleDestroyActivity() ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); //回调自己的onDestory()方法 WindowManager wm = r.activity.getWindowManager();//通过activity.getWindowManager()获得WindowManager对象,该对象是ViewManagerImpl的具体实现。 Context c = r.activity.getBaseContext(); //activity创建时的context ((ContextImpl) c).scheduleFinalCleanup(r.activity.getClass().getName(), "Activity"); //在这里清除掉context查看全部
-
onResume()的分析——onResume是activity用来显示它的内容的。查看全部
-
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()将会创建一个mWindow对象,将activity和windowManagerService关联起来。 (7)mInstrumentation.callActivityOnCreate(activity, r.state) 这个就是回调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()中创建的,这个mWindow是和activity相关联的。 注意setContentView()的具体实现是在PhoneWindow.java中。查看全部
-
6.Activity生命周期是什么时候回调的 (3)onCreate()的回调会调用handleLaunchActivity(),然后调用performLaunchActivity() activity.attatch()将创建的activity与WindowsManagerService向关联,进而控制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来创建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()函数也是使用classLoader来创建Application对象的 (5)makeApplication() java.lang.ClassLoader cl = getClassLoader(); app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext); … mActivityThread.mAllApplications.add(app); … instrumentation.callApplicationOnCreate(app); //这里调用application自己的onCreate()查看全部
-
6.Activity生命周期是什么时候回调的 (1)Instrumentation是辅助的管理activity生命周期回调以及创建Application类的辅助类。 (2)H类继承于Handler,它负责处理AMS发送过来的跨进程间通信的message (3)接下来重点看一下一个activity是如何创建和启动的查看全部
-
4. Context(上下文)类 如getResource()、SharedPreference都是通过Context实现的。 如图,Context是一个接口类,它有个两个子实现类——ContextImpl,ContextWrapper。其中ContextWrapper还有一个重要的子实现类Activity,所以Activity就是Context的一个实现类。 ContextImpl是Context接口的具体实现类,ContextThemeWrapper是Activity的theme主题父类,所以Activity是有界面的。 5. Activity和其他类有什么区别 Activity类作为一个总体框架,控制着数据在界面的显示,但是它对activities的控制都是通过framework统一管理的,例如ActivityStack的管理,生命周期回调,进程间通信。 (1)ActivityThread作为客户端 ActivityThread有一个重要的成员类final H mH = new H(),这个H类继承于Handler类,它负责处理AMS发送过来的跨进程间通信的message,handleMessage() public void handleMessage(Message msg) { switch (msg.what) { case LAUNCH_ACTIVITY: { ActivityClientRecord r = (ActivityClientRecord)msg.obj; //获取对activity的描述,message是从远程AMS通过跨进程间通信传来的 r.packageInfo = getPackageInfoNoCheck(r.activityInfo.applicationInfo, r.compatInfo); handleLaunchActivity(r, null); //启动这个activity …查看全部
-
2)thread.attach(false)主要完成与AMS之间的交互 ActivityManagerNative.getDefault()可以获取AMS的一个远程代理接口。ActivityManagerNative是AMS的远程代理对象,AMS是运行在一个单独的进程当中的,如果想要在当前的进程使用AMS就需要调用getDedault()来获取AMS的一个代理对象,相当于和AMS进行交互。 当一个APP启动时,主线程中会调用ActivityThread的main()函数,main()中调用thread.attach()。attatch()函数中获得AMS的远程代理对象后,会执行代理对象的mgr.attachApplication(mAppThread)来告诉AMS该进程已经启动。 mgr.attachApplication(mAppThread)中的mAppThread是实现Binder接口的一个类,下面会分析mgr.attachApplication(mAppThread)这个方法。 3. ApplicationThread、ActivityClientRecord、ActivityRecord (1)ApplicationThread,ApplicationThread继承于ApplicationThreadNative public abstract class ApplicationThreadNative extends Binder implements IApplicationThread { 可以看到ApplicationThread实现了远程Binder类,它就是负责和AMS进行通信的Binder实现类。ApplicationThread类在ActivityThread中创建。 (2)ActivityClientRecord和ActivityRecord 前者描述了客户端Activity的一些属性,后者是ActivityManagerService中描述activity属性的类。查看全部
-
1. ActivityThread (1)ActivityThread不是一个线程类,只是一个普通的java类 public final class ActivityThread { 2. ActivityThread是如何被启动的 (1)ActivityThread是在app启动时运行在该app主线程的一个类,只是在主线程中运行而已。 ActivityThread启动时main()是入口,执行如下操作: Looper.prepareMainLooper();//准备一个消息轮询对象 ActivityThread thread = new ActivityThread(); thread.attach(false); Looper.loop();//开始轮询消息队列 注意:这一点和handler是相似的。 (2)当启动一个APP时,该APP进程有一个主线程,在主线程中就会调用ActivityThread的main方法。 1)Looper.prepareMainLooper()会先调用prepare() private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { //先判断是否本地thread中有Looper对象,如果没有会创建一个looper throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); //默认情况下主线程第一次创建时不会有个looper对象,会创建一个 } 2)thread.attach(false)主要完成与AMS之间的交互 ActivityManagerNative.getDefault()可以获取AMS的一个远程代理接口 (下一笔记)查看全部
-
Android插件开发—首先需要充分理解Android四大组件的执行流程,生命周期查看全部
-
好好查看全部
-
非常好查看全部
-
调用Activity的OnDestory()方法之后,并没有将这个Activity对象置为null,它还是会在内存中的查看全部
举报
0/150
提交
取消