Service是android系统中的四大组件之一,它跟anctivity的级别相似,但是没有自己的界面,只能在后台运行。可以和其他组建进行交互。
Context.startService() started模式
这种方法调用者和Service之间没有关联,即使调用者退出了,服务仍然运行。
Context.bindService() Bound模式
这种方法调用者和Service绑定在了一起,调用者退出,服务也就终止。
对于Service的不同启动方式,有着不同的生命周期
Context.startService()
context.startService()
-->onCreate()
-->onStart()
-->Service running
-->context.stopService()
-->onDestroy()
-->Service stop
如果Service还没有运行,则会运行onCreate()然后调用onStart()
如果Service已经运行,则只调用onStart。onStart可能被调用多次
可以通过stopService()停止Service
Context.bindService()
context.bindService()
-->onCreate()
-->onBind()
-->Service running
-->onUnbind()
-->onDestroy()
-->Service stop
如果在服务未被创建时,系统会先调用onCreate()方法,接着调用onBind()方法。这个时候调用者和服务会绑定在一起,调用者退出了,系统就会先调用onUnbind()方法,接着调用onDestroy()方法。如果bindService()方法前服务已经被绑定,多次调用bindService()方法不会导致多次创建服务以及绑定。如果调用unbindService()方法,也会导致系统调用服务的onUnbind()和onDestroy()方法。
onBind()会返回给客户端一个IBind接口实例,IBind允许客户端回调Service的方法,比如得到Service的实例、运行状态等。这个时候把调用者会和Service绑定到一起,Context退出了,Service就会调用onUnbind–>onDestroy相应退出。
onBind()只有一次,不可以多次绑定

Service.stopSelf()
只要调用一次stopService就可以停止Service,无论start多少次
Service.stopSelfResult()
被多次bind的Service如何关闭?
有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定。具体的启动情况有下:
1.当启动时,单独调用bindService方法,再unbindService后,会执行service的onUnbind,在执行onDestroy方法。
2.当启动时,先调用startService,再调用bindService方法后,再unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService.
3. 先调用startService,再调用stopService,会执行service的onDestroy方法。
<service
android:enabled="true"
android:name=".service.Service">
<intent-filter>
<action android:name="com.action.service" />
intent-filter>
service>
顺便提下怎样查看一项服务是否在运行的方法:
private String isRunning(Context context) {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> list = am.getRunningServices(30);
for (RunningServiceInfo info : list) {
if ((info.service.getClassName()).equals("com.fred.app.MyService")) {
return "running......";
}
}
return "stopped......";
}