深入理解Activity——慕课网学习笔记

来源:互联网 发布:nginx配置 编辑:程序博客网 时间:2024/05/16 04:59

深入理解Activity

学习内容地址:http://www.imooc.com/learn/413

与activity的相关的framework层介绍

ActivityThread

在ActivityThread的main中:

1、创建一个调用一个Looper.prepareMainLooper(),创建一个Looper对象,这就是我们activity的主线程。

2、创建ActivityThread对象,ActivityThread就是一个普通的java类。

3、调用thread.attach方法。主要是为了和ActivityManagerService进行交互通信。在里面通过ActivityManagerService的代理对象ActivityManagerNative.getDefault()获取代理对象和ActivityManagerService通信。代理对象通过传递ApplicationThread对象mAppThread进行通信。


ApplicationThread

ApplicationThread继承自ApplicationThreadNative(一个实现binder的子类)目的是和ActivityManagerService(AMS)通信。

所以ApplicationThread仅仅是和AMS通信的一个工具类。

activityClientRecord

是对activity的相关信息记录的一个描述类。包括了activity的parent,window,config等。

activityRecord

主要是AMS中所存储的activity的记录的一个类。和activityClientRecord数据结构类似。

Context

 

 

activity是什么和其他类的区别

activity和别的类不同的是他的生命周期由frameWork层统一地进行了管理(生命周期,binder通信)。

之前的ActivityThread就是控制我们activity的生命周期的回调。通过binder跨进程和AMS通信实现的。

 

activity的生命周期的方法是什么和什么时候回调

在ActivityThread中有一个名为H的handler对象专门负责处理相应的AMS发送过来的消息。

在处理activity生命周期中,有几个很重要的对象要介绍下:

Instrumentation


辅助AMS创建Application,管理Act各种生命周期方法的调用(如方法onstart,onpause,onresume等都是以该类为辅助打开的),启动Act。

ApplicationThreadNative

是AMS远程代理的对象。

 

H类

是一个handler类,为Activity处理AMS远程发送过来的消息。

 

Activity的oncreate


1、Activity的oncreate方法是通过instromentation.handleLaunchActivity调用的。

2、该方法中首先通过存储在activityClientRecord类中该activity相关信息的通过反射创建activity对象。

3、通过activity.attach方法将activity和创建的顶层的window进行关联,同时对activity的相关内容进行初始化。

4、Appliaction对象也是在这里创建的。Application有自己的context为contextimpl。在创建的时候和activity一样,只是通过的是applicationinfo中的信息反射创建的。最后将在通过instrumentation去调用oncreat。继续activity的创建之路。

5、在activity创建的过程中,每个activity都有对应的context,在context创建之后都会相互关联起来。

6、在activity的attach方法中,主要是创建其显示的window对象,同时初始化activity的相关的一些内容。

7、在创建window的时候,会将他和windowManager进行关联,同时将activity放入一个activitys的列表里面进行统一的管理。

8、最后通过instrumentation的oncreate去开始执行oncreate方法。

9、在window创建后,回调用他的setContent,为window设置显示内容。Window通过判断其内部是否有decorView从而决定是否新建一个继承自frameLayout的decorView。

 

Activity的onresume


1、 通过activityClientRecord去获取activity,然后调用act的performResume。和oncreat一样,最后也是通过instrumentation去调用resume的

2、 在resume的时候,首先去拿到window对象,然后去拿到绑定的windowManager对象(这个类继承自ViewManager,内部只有addView,removeView和UpdateView的方法)去管理View。

3、 而这里真正实现管理的对象是WindowManagerImpl对象里面的windowManagerGlobal。去对View实现添加删除修改更新。

4、 对于每个View来说他们都是通过ViewRootImpl进行管理的,当创建出来之后他们会进行一一绑定。ViewRootImpl中有一个W对象,专门去接收Wm发送过来的消息。对于View的绘制的相关操作都是由ViewRootImpl接手的。当然判断是否是在主线程绘制也由它接手。

5、 最后将View添加到décor中,再将décor添加到window中再将décor设置为可见就,同事是发送act的显示消息给AMS。

 

activity、window、windowManager三者之间的状态

activity主要是一个控制的结构负责生命周期管理和windowManager发送过来的屏幕事件处理。

Window即phoneWindow控制界面的显示。

windowManager与windowManagerService做整体交互

 

 

Activity的ondestroy

仅仅是将View和ViewRootImpl不进行关联,并将activityClientRocord移除,却并没有对acitivy进行销毁操作。

具体过程:

1、先拿到自己的windowManager对象,对window的ViewRootImpl进行移除。

2、context在activity建立的时候会添加进来,所以activity销毁时将context也移除。

3、在执行destroy方法前先要判断activity是否处于pause状态,没有的话则将activitypause之后在做后续操作。

4、去执行我们自己写的onDestroy方法。

5、最后将token移除。


思维导图地址:https://www.processon.com/view/link/5875950ae4b0858234882d8b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


0 0