Service一直在后台运行,没有用户界面,所以绝不会到前台来。如果某个程序组件要在运行时间向用户呈现某种界面,或该程序需要与用户交互,就需要使用Activity,否则就应该考虑使用Service。
Service和Activity一样,有自己的生命周期。
开发Service只需要两个步骤:
1>定义一个继承Service的子类
2>在AndroidManifest.xml文件中配置该Service,配置Service使用<service.../>元素,配置Service时也可为<service.../>元素配置<intent-filter.../>子元素,用于说明该Service可被哪些Intent启动
Service系列生命周期方法:
IBinder onBind(Intent intent):该方法是Service子类必须实现的方法。该方法返回一个有效的IBinder对象,应用程序可通过该对象与Service组件通信
Void onCreate():当该Service第一次被创建后将立即回调该方法
Void onDestroy():当该Service被关闭之前将会回调该方法
Void onStartCommand(Intent intent,int flags,int startId):每次客户端调用startService(Intent intent)方法启动该Service时都会回调该方法
Boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该方法
Android系统中运行Service有如下两种方式:
1>通过Context的startService()方法:通过该方法启用Service,访问者与Service之间没有关联,Service和访问者之间无法进行通信、数据交换。即使访问者退出了,Service仍然运行。
2>通过Context的bindService()方法:使用该方法启用Service,访问者与Service绑定在了一起,访问者一旦退出,Service也就终止。bindService()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn,int flags),该方法的三个参数:
Service:该参数通过Intent指定要启动的Service
Conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时将回调ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法;当Service所在的宿主进程由于异常中止或其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。但如果当调用者主动通过unBindService()方法断开与Service的连接时,ServiceConnection对象的onServiceDisconnected(ComponentName name)方法并不会被调用。
Flags:指定绑定时是否自动创建Service(如果Service还未创建)。该参数可指定为0(不自动创建)或BIND_AUTO_CREATE(自动创建)。
Service生命周期还有一种特殊情形,如果Service已由某客户端通过startService()方法启动了,接下来其他客户端再调用bindService()方法来绑定该Service后,再调用unbindService()方法解除绑定,最后又调用了bindService()方法再次绑定Service,这时系统只是把Service内部IBinder对象传给Activity,并不会把该Service生命周期完全“绑定”到该Activity,因而当Activity调用unBindService()方法取消与该Service的绑定时,也只是切断该Activity与Service之间的关联,并不能停止该Service组件,更不会回调onDestroy()方法。这个过程所触发的生命周期如右:onCreate()→onStartCommand()→onBind()→onUnbind()[重写该方法时返回了true]→onRebind()。如果希望onRebind()方法被回调,除了需要该Service是由Activity的startService()方法启动之外,还需要Service子类重写onUnbind()方法时返回true