深入理解Activity

我们首先认识ActivityThread。

ActivityThread不是activity默认的线程类,跟线程是没有关系的,就是一个普通的java类,没有继承任何一个Thread,它本身运行在activity进程的方法当中,它启动的时候首先会调用一个main方法,在这个main方法中,它首先会创建一消息轮询对象(Looper),并创建一个自己的对象

          ActivityThread thread = new ActivityThread();

 然后它会调用自己的thread.attach(false)方法,然后它再掉用Looper轮询对象Looper.loop(),就是我们在activity中经常用到的消息队列,这个消息队列是在ActivityThreadmain方法中创建的。

     当它创建完成之后,它会通知告诉ActivityManagerService(简称AMS),因为我们启动一个应用进程之后,我们所有的activity相关的交互处理逻辑都是由统一的AMS进行管理,所以我们在创建一个应用线程后,我们需要跟AMS进行一个交互。

我们在源码中可以发现,AMS有个远程的代理对象叫做ActivityManagerNative,其实AMS是运行在一个单独的进程当中,我们要在另外一个进程中获取AMS对象,所以就用到我们的ActivityManagerNative代理接口对象,通过ActivityManagerNative.getDefault()方法就可以拿到代理对象,相当于跟AMS通信,其实在整个应用程序被打开之后,我们的ActivityThreadMain方法被运行,被运行过程中会和AMS进行一个交互,会告诉AMS我们新建的一个应用程序已经运行成功了。

       那它是如何跟AMS进行通信呢?

首先会调用:-----attachApplication()

<span style="font-size:18px;">final IActivityManager mgr = ActivityManagerNative.getDefault();
try{
    mgr.attachApplication(mAppThread);
}catch(RemoteException ex){
   //Ignore
}
</span>
这样一个方法,传入参数mAppThread这样一对象,这个对象它其实是实现Binder接口的一个类,这个mAppThread是非常核心的一个类,主要是跟AMS通信用到的,它其实就是ApplicationThread这个类。

      然后我们再回来看ActivityThread,它首先创建Looper对象,然后让Looper对象不断轮询处理消息,然后跟AMS进行交互,交互过程中就需要拿到ActivityManagerNative.getDefault()方法,因为拿到这个远程代理对象,我们可以对它进行交互,交互的时候调用了它自己的attachApplication(),传入一个mAppThread对象,这个mAppThread对象就是我们的Binder对象的具体实例。

---------------------------------我们接着学习-----------------------ApplicationThread类------

我们ApplicationThread类继承一个ApplicationThreadNative类,而ApplicationThreadNative是实现Binder的一个子类,相当于ApplicationThreadNative要跟远程端进行通信,所以要实现Binder类,其实它就是要和AMS类进行远程端通信,通信过程封装成Binder对象,从而简化客户端编程,我们只需要记住ApplicationThread它是最终的Binder的具体的实现类就可以了。

那么ActivityClientRecord是什么,其实它就是客户端的一个Activity的描述的一个类,因为这个类中主要是对activity的一个描述作为记录,这个类中定义了很多成员变量,这些成员变量都是与一个activity相关的,比如里面有成员变量Activity activity,还有ActivityInfo activityInfo,其中有个非常重要的成员变量 H mH = new H();,这个H类实际上实现一个Handler类,它的作用主要是处理我们AMS发送过来的跨进程通信的具体处理的代码,这个H类中有个handleManager(Message msg) 方法,(才感到眼熟吧大笑),这个方法会处理大量的AMS发送过来的消息,比如

       handleMessage()方法中有个case LAUNCH_ACTIVITY就是表示打开activity,具体的内容就是首先通过远程跨进程通信msg.obj拿到ActivityClientRecord对象(之前说的记录activity的描述),然后通过packageInfo查找下看能不能找到这个ActivityClientRecord,

public void handleMessage(Message msg) {
      if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
      switch (msg.what) {
           case LAUNCH_ACTIVITY: {
               Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
               final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

               r.packageInfo = getPackageInfoNoCheck(
                    r.activityInfo.applicationInfo, r.compatInfo);
                    handleLaunchActivity(r, null);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
               } break;


另外给大家介绍一个类ActivityRecord,主要是AMS当中存储Activity的一个记录。

-------------Context是什么-----------------------------Activity所依赖的环境-------

1.我们的resource资源来自context;

2.context可以用来调用getShearedpreference

Context实际上是一个接口,它的一个实现类ContextWrapper,它的子类图:

就是说,我们的activity就是Context的一个子类。

------------------------------------------------Activity生命周期分析-------------------------------------------------------------------

Activity生命周期是为了控制我们界面的整体显示,不同于其他类的是,它的生命周期对activity的控制都是由我们framework层统一控制,所以我们只需要开发具体的业务实现就可以了,

1.我们要先介绍Instrumentation,它主要是负责打开activity各种生命周期方法,比如onCreate()....,都是用这个类作为辅助类打开,还可以创建Application,Application本身是个对象,可以由 Instrumentation作为控制;还可以启动我们的Activity,比如startActiviy和startActivityForResult方法都是调用Instrumentation里的相关方法,所以说Instrumentation就是辅助管理activity的生命周期的回调并创建Application的辅助类,

2.ActivityManagerNative:通过这个类可以远程操作我们的AMS进行通信,也可以认为是辅助类,

3.H类就是继承hanlder类,处理我们AMS发送过来的具体消息,比如我们打开一个activity,具体逻辑就是在H类中handleMessage()方法中处理;

     然后我们谈activity的创建其实是通过java的反射机制去创建的,首先在创建过程中需要拿到activity的一个类,

public Activity newActivity(ClassLoader cl, String className,
            Intent intent)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        return (Activity)cl.loadClass(className).newInstance();
 }

//这里是截取的Application的创建
 Application app = r.packageInfo.makeApplication(false, mInstrumentation);
---------



---------------------------------------------未完待续----------------------









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值