转载地址:http://m.blog.csdn.net/blog/lgzvic/17842149
作者:镇长的博客
Service简介
Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。
Service的启动有两种方式:context.startService()和 context.bindService()
Service启动流程
context.startService() 启动流程:
context.startService() ->onCreate() -> onStartCommand() -> Service running -> context.stopService() -> onDestroy() -> Servicestop
如果Service还没有运行,则android先调用onCreate(),然后调用onStart(),android2.1以后用onStartCommand()代替onStart() ;
如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStart方法可能会重复调用多次。
如果stopService的时候会直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行,该Service的调用者再启动起来后可以通过stopService关闭Service。
所以调用startService的生命周期为:onCreate--> onStart (可多次调用) -->onDestroy
context.bindService()启动流程:
context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Servicestop
onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate--> onBind(只一次,不可多次绑定) --> onUnbind--> onDestory。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
Service生命周期
Service的生命周期并不像Activity那么复杂,它只继承了onCreate()、onStartCommand()、onDestroy()三个方法
当我们第一次启动Service时,先后调用了onCreate()、onStartCommand ()这两个方法;当停止Service时,则执行onDestroy()方法。
这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
它可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,只要调用一次stopService()方法便可以停止服务,无论调用了多少次的启动服务方法。
- 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
- 使用广播必须要有一个intent 对象必设置其action动作对象
- 使用广播必须在配置文件中显式的指明该广播对象
- 每次接收广播都会重新生成一个接收广播的对象
- 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
1、消息广播域接受:
(1)、消息发送者:将广播消息发送出去
自定义消息:想法什么就发什么;
系统消息:发送系统的一些信息(电池信息,启动信息,短信信息……)【注意:action名字:全局唯一。可以不用包名。】
消息载体:intent
消息的接受者:接收到消息后,做处理(任何处理)!【注意:实现类继承BroadcastReceiver类(内部类:实现BroadcastReceiver接口);注册:告诉系统,我有一个消息接受者,正在接受消息。静态的声明:androidManifest.xml(Reveiver节点(XML的说法))。动态声明:registerBroadCast();unregisterBroadCast();】
sendBroadcast()——》intent--onReceive()
sendBroadcast:普通广播
sendOrderedBroadcast:排序广播
sendStickBroadcast:(普通广播)
service
进程、线程的区别?
service由进程或者线程实现。
线程就是线程。
进程就是进程。
区别不是很大:服务可以干的事,进程和线程也可以干。
如果你的业务:service没有用户直接跟你的应用交互的时候,其他的应用,或者是其他的服务,跟你的交互。我的应用仅仅是在后台运行,没有前台Activity,也不需要前台的activity的时候。
线程:有用户跟你的应用交互。要得到执行的返回结果。有前台交互Activity比较适合线程。
2、registerReceiver函数用几次,发送广播的接受者就会有几个。
3、unregisterReceiver函数用一次,只会解除一个消息接受者。
4、sendOrderedBroadCast()方法,根据消息接受者的优先级,一个个的顺序调用接受者,执行处理逻辑。
5、sendBroadcast()方法,一次发出去消息后,消息接收着,同时执行