四大组件的工作原理《Android开发艺术探索》笔记

Activity的总结与工作原理

Activity的总结

类型:是一个展示型组件。
作用:展示一个界面并与用户交互。
使用:

  • 需要在AndroidManifest注册
  • 需要借助Intent启动:
    显示启动:Intent intent= new Intent(this,Activity2.class),startActivity(intent)注意传入的是class而不是Acitivity
    隐式启动Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);intent会匹配可以响应Action与Category的Acitivity并启动该Acitivity。

四种启动模式
1.Standard:普通模式。每次启动一个Activity就会创建一个新的实例

2.SingleTop:栈顶复用模式。当栈顶为当前要启动的Acitivity,则不会启动Acitivity,直接调用onNewIntent方法;

3.SingleTask:栈内复用模式,当所启动的Activity在当前的栈内,则不会启动Activity,直接调用onNewIntent方法;如果没有找到则会先去判断是否存在当前栈,如果不存在则会创建当前寻找的栈,并将Activity放入其中,否则直接将Activity放入当前栈中。

4.singleInstance:单例模式。具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例

使用finish方法可以结束一个Activity。

Activity的工作原理

首先调用startActivity(intent)方法,这个方法最终会调用startActivityForResult()方法,同时requestCode为-1以区分正常调用该方法的情况。

之后会调用AMS(ActivityMangerService)的startActivity方法,AMS是一个实现了binder的类。通过IPC机制会继续调用AppllactionThread(ActivityThrea内部类)的scheduleLaunchAcitivity方法,在该方法中会通过sendMessage与Handler通信

Handler H会首先调用handleLaunchActivity方法,之后会调用performLaunchActivity方法。在performLaunchActivity中会完成对Activity的创建与启动。

performLaunchActivity方法一共完成了如下工作

(1)从AcitivityClientRecord中获取Activity的组件信息;
(2)通过Instrumentation来创建Activity,使用类加载器的方式(ClassLoader.loadClass);
在这里插入图片描述
(3)调用了makeApllication方法,尝试创建Application(只会有一个Application),内部也是通过Instumentation以类加载器的方式创建的;
(4)创建ContextImpl对象,并通过Acitivity的attach方法来完成一些重要参数的初始化。(通过attach方法建立了ContextImpl与Activity的关系);
(5)调用Activity的onCreate方法。
在这里插入图片描述

总结

1.Activity的AMS和ActivityThread都是Binder;

2.Activity和Applaction的创建都是通过Instumentation创建的,类加载模式(loadClass方法)

3.AMS的startActivity方法会通过IPC方式调用Applaction的scheduleLaunchActivity,并在其中使用sendMessage方法,进而使用HandlerH

4.HandlerH对消息的处理是通过HandlerH的handleLaunchActivity与performLaunchActivity完成的,并最终创建和启动Activity

Service的总结与工作原理

类型:计算型组件。
作用:执行一些需要长期运行的程序。
使用:

  • 需要在AndroidManifest注册
  • 需要借助Intent开启
    Intent intent = new Intent(this, xxx.class); startService(intent);

两种开启方法:
1.startService(intent)开启服务;
2.bindService(intent,Serviceconnection,flag)绑定服务,unbind(ServiceConnection)取消绑定服务。

不可以被用户看见;
通过stopServiceunbind完成停止一个服务。

工作原理

Service的启动

首先调用startService()方法,之后调用ContextImpl的startService方法,进而调用startServiceCommon方法。接下来会调用AMS的startService方法。

AMS的startService会调用ActiveService的方法,ActiveService是一个辅助AMS进行管理的类,包括Service的启动绑定和停止。最终会调用ActiveService的realStartServiceLocked()方法

在realStartServiceLocked首先会调用ApplicationThread的scheduleCreateService进行创建服务并调用其onCreate方法,调用SendServiceArgs来回调Service的onStartCommand方法。上述两个方法都是跨进程方法。

**scheudleCreateService方法的逻辑与ScheudleLaunchActivity相似,都是调用sendMessage,使用Handler来执行操作。**而sendServiceArgsLock,则会去调用Handler的handleServiceArgs方法。

Handler会调用handleCreateService。handleCreateService一共做了四件事:(1)会通过类加载的方式创建Service的实例,(2)创建Applaction并调用OnCreate方法。(3)创建ContextImpl并通过Service的attach方法建立与Service的连接。(4)调用Service的onCreate方法并将Service存储在ActivityThread的一个ArrayMap中;

handleServiceArgs方法会调用Service中的onStartCommand方法。

其中ActivityServices应该是ActiveService
在这里插入图片描述

Service的绑定

与启动相类似,首先调用ConextWrapper的bindService方法,之后调用ContextImpl的bindService方法(进而调用bindServiceCommon方法)。

在bindServiceCommon方法中主要是将ServiceConnection对象转化为Binder对象(因为可能会跨进程,将ServiceConnection转换为ServiceDisapcther.InnerConnection)

之后类似地,调用AMS的bindService方法;AMS会调用realStartSeriviceLocked方法完成服务的创建与上面相同,不同的是会调用requestServceBindingLocked方法进行绑定

调用requestServceBindingLocked方法会调用ApplicationThread的shceduleBindService,通过sendMessage发送消息给Handler H,并调用handleBindService方法。

在handleBindService方法中,首先通过onBind获取Binder对象,之后调用AMS中的publishService方法,去通知客户端结果。

publishService会继续调用ActiveServices的publishServiceLocked方法,核心调用是核心代码c.conn.connected(r.name, service); 其中c.conn是ServiceDispatcher.InnerConnection,Service就是Service的onBind返回的Binder对象。这个connected方法就会去调用ServiceConnection的onServiceConnected方法。

整个过程结束。
在这里插入图片描述

总结

1.ContextImpl是Context的实现,可以通过Actvity的attach方法与其建立连接。Activity.attach()中还会完成Window的创建并和Activity&Window的关联,由此事件可传递给Window。

2.ActiveServices是一个辅助AMS的类,在该类中可以进行服务的创建(realStartedServiceLocked)与绑定(requestServceBindingLocked)。同时其中的方法后缀都是Locked

3.与Activity类似的,Service的创建与绑定最终都会回到ActivityThread类下的handleCreateServicehandleBindService。同时handleServiceArgs是用于回调Service中的其他方法。注意绑定同时要告知客户端,所以要调用AMS的publishService方法。(ActivityThread下的方法都是handlexxxx,因为都是Handler H的方法)

BroadCast工作原理与总结(留着之后学)

总结

1.Activity的启动过程:

(1)startActivity->startActivityForResult(requestcode=-1)->ActivityMangagerService(Binder对象)的startActivity;

(2)通过IPC的方式,调用ApllicationThread的scheduleLaunchActivity,在该方法中会通过sendMessage来发送消息;

(3)之后HanlderH会接收到消息,并分别调用handleLaunchActivity->performLaunchActivity来完成Activity的创建与启动。

performLaunchActivity一共完成了以下几个工作:(1)通过ActivityClientRecord获取要启动的Activity的组件信息;(2)通过Instrumentation的newActivity方法来创建Activity,使用的是类加载的方式(loadClass);(3)使用LoadedAPKmakeApplication来尝试创建Application,内部调用Instrumentation来创建Apllication,也是类加载的方式;(4)创建ContextImpl,同时使用Activity的attach,与ContextImpl 建立联系,并进行初始化操作。(5)调用Activity的onCreate函数。

2.Service的启动与绑定过程

Service的启动过程

(1)调用startService(intent)->ContextImpl的startServiceCommon->AMS的startService;
(2)AMS会调用ActiveService的方法,ActiveService是一个辅助AMS的服务,最终会调用它的realStartServiceLocked来开启服务。
(3)realStartServiceLocked方法之后会调用ApplicationThread的scheduleCreateService,通过sendMessage与Handler H通信,并调用hadnleCreateService。完成对Service的创建和启动。
(4)realStartServiceLocked也会调用SendServiceArgs来调用handleServiceArgs,并最终回调用Service的onStartCommand方法。

HandleCreateService主要做到了:(1)完成对Service的创建(类加载模式);(2)创建Application并调用onCreate方法(3)创建ContextImpl并通过Service的attach方法建立两者联系;(4)调用Service的onCreate方法并将Service对象存储在ActivityThread的一个ArrayMap中。

Service的绑定过程

bindService(intent,serviceConnection,flag)->ContextImpl的bindServiceCommon,在该函数中需要将ServiceConnection对象转换为一个Binder对象,以便跨进程通信,转换为ServiceDispatcher.InnerConnection。

之后会调用AMS的bindService,进而调用ActiveService的方法,调用realStartServiceLocked和Service开启相似;调用requestServiceBindingLocked实现绑定功能

之后会调用Application的scheduleBindService,来通知Hanlder H,Handler H会调用handleBindService来绑定,

在该函数中首先通过onBind方法获取服务端的Binder对象,然后需要通知客户端绑定结果。因此调用AMS的publishService方法,该方法会最终回调ServiceConnection对象的onServiceConnected。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章