四大组件的工作过程

1、四大组件的运行状态                                          

Android的四大组件中除了BroadcastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadcastReceiver来说,既可以在AndroidManifest中注册也可以通过代码来注册。

在调用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent。

Activity组件的主要作用是展示一个界面并和用户交互,扮演的是一种前台界面的角色。

在实际开发中通过Activity的finish方法来结束一个Activity组件的运行。

Activity组件只有一种运行模式,即Activity处于启动状态。

Service是一种计算型组件,用于在后台执行一系列计算任务。

Service组件有两种状态:启动状态和绑定状态。

当Service处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。但是耗时的后台计算仍然需要在单独的线程中去完成。

当Service处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时外界可以很方便地和Service组件进行通信

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。

静态广播:指在AndroidManifest中注册广播,这种广播在应用安装时会被系统解析,此种形式的广播不需要应用启动就可以收到相应的广播。

动态广播:需要通过Context.registerReceiver()来实现,并且不需要的时候要通过Context.unRegisterReceiver()来解除广播。广播不适合执行耗时操作。BroadcastReceiver组件一般来说不需要停止,也没有停止的概念。

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。

2、Activity的工作过程                                          

Activity的启动过程。

Activity的startActivity方法有好几种重载方式,但它们最终会调用startActivityForResult方法。

ApplicationThread是ActivityThread的一个内部类。

启动Activity真正的实现由ActivityManagerNative.getDefault()的startActivity方法来实现。

ActivityManagerService继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS是一个Binder,它是IActivityManager的具体实现。

performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

 

performLaunchActivity这个方法主要完成了以下5件事:

a、从ActivityClientRecord中获取待启动的Activity的组件信息;

b、通过Instrumentation的newActivity方法使用类加载器创建Activity对象;

c、通过LoadedApk的makeApplication方法来尝试创建Application对象。

d、创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;

e、调用Activity的onCreate方法。

3、Service的工作过程                                          

启动状态:主要用于执行后台计算;

绑定状态:主要用于其他组件和Service的交互。

这两种状态可以共存。

 

通过Context的startService方法可以启动一个Service:

Intent intentService = new Intent(this,MyService.class);

startService(intentService);

 

通过Context的bindService方法即可以绑定的方式启动一个Service:

Intent intentService = new Intent(this,MyService.class);

bindService(intentService,mServiceConnection,BIND_AUTO_CREATE);

Service的启动过程从ContextWrapper的startService开始。

Service的绑定过程从ContextWrapper的bindService开始。

4、BroadcastReceiver的工作过程                      

动态注册的广播需要在合适的时机进行解注册,采用unregisterReceiver方法。

广播的静态注册由PMS(packageManagerService)来完成整个注册过程。

动态注册过程是从ContextWrapper的registerReceiver方法开始的,和Activity和Service一样。

 

广播的发送有几种类型:普通广播、有序广播和粘性广播。

广播的发送开始于ContextWrapper的sendBroadcast方法,由ContextImpl去处理,ComtextImpl直接向AMS发起一个异步请求用于发送广播。

 

5、ContentProvider的工作过程                           

ContentProvider的onCreate方法要先于Application的onCreate方法执行。

当一个应用启动时,入口方法是ActivityThread的main方法,main方法是一个静态方法,在main方法中创建ActivityThread的实例并创建主线程的消息队列,然后再ActivityThread的attach方法中远程调用AMS的attachApplication方法并将ActivityThread对象提供给AMS。

ActivityThread是一个Binder对象,它的Binder接口是IApplicationThread,主要用于ActivityThread和AMS之间的通信。

posted @ 2017-09-07 10:02  fankongkong  阅读(195)  评论(0编辑  收藏  举报