四大组件的工作过程
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之间的通信。