前面写了四大组件的Activity,稍微详细的描述了它的生命周期和启动模式。今天接着写其余的三大组件Service、BroadcastReceiver、ContentProvider.
1.Service
Service是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
Service的启动过程从ContextWrapper的startService开始。在ContextImpl中,startService方法调用startServiceCommen方法,而startServiceCommen方法会通过ActivityManagerNative.getDefault()这个对象来启动一个服务。
服务的使用,通常情况下,如果我们希望服务一旦启动就立刻去执行某个动作,就可以将逻辑写在onStartCommand()方法里。而当服务销毁时,我们应该在 onDestroy()方法中去回收那些不再使用的资源。另外需要注意,每一个服务都需要在 AndroidManifest.xml 文件中进行注册才能生效
2.BroadcastReceiver
Android 中的广播主要可以分为两种类型,标准广播和有序广播。
标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
广播的使用方法,首先要定义广播接收者,只需要继承BroadcastReceiver并重写onReceive方法就可以了。需要注意的是定义好了广播接收者还需要注册广播接收者,可以在AndroidManifest文件中静态注册,也可以通过代码动态注册。动态注册的广播需要在合适的时机采用unregisterReceiver进行解注册。
3.ContentProvider
内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是 Android 实现跨程序共享数据的标准方式。
对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助ContentResolve 类,可以通过 Context 中的 getContentResolver()方法获取到该类的实例。ContentResolver 中提供了一系列的方法用于对数据进行 CRUD 操作,其中 insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方法用于查询数据。