参考作者:丿黑色丶幽默丨灬
参考链接:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contect.startservice和contect.bindserverice来启动。Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。
service的两种模式(startService()/bindService()不是完全分离的)
介绍完毕,以上为搬砖内容,下面总结个人使用例子:
一.先看生命周期
a> 使用context.startService() 启动Service是会会经历:
context.startService() ->onCreate()- >onStart()/onStartCommand()->Service running
context.stopService() | ->onDestroy() ->Service stop
如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
关于onStrat()谷歌已不赞成使用,我在测试过程中都是使用onStartCommand()。这个方法也是会多次调用的,即根据startService()每次调用都会执行。另外,在服务非正常结束(异常)时,该方法会调用,并根据设置的return 的值(START_NOT_STICKY,START_STICKY,START_REDELIVER_INTENT)来判断是否再次激活该服务。
b> 使用使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的
状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice
就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind -->
onDestory。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,
onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
二.启动service
startService:
public class TestService extends Service{
private String tag="life";
@Override
public void onCreate() {
super.onCreate();
Log.d(tag, "S----onCreate");
playMusic();
}
private void playMusic() {
Log.d(tag, "开始播放音乐");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(tag, "S----onDestroy");
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(tag, "------onStart()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(tag, "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
}
activity中只需调用以下方式管理即可:
private void doStratService() {
startService(new Intent(MainActivity.this,
TestService.class));//开启服务
}
private void doStopService() {
stopService(new Intent(MainActivity.this,
TestService.class));//关闭服务
}
bindservice:
public class TestService extends Service{
private String tag="life";
@Override
public void onCreate() {
super.onCreate();
Log.d(tag, "S----onCreate");
playMusic();
}
private void playMusic() {
Log.d(tag, "开始播放音乐");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(tag, "S----onDestroy");
}
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
private MyBinder myBinder=new MyBinder();
public class MyBinder extends Binder{
public TestService getServices()
{
return TestService.this;
}
public void getself(){
TestService.this.fromSelf();
}
}
public void fromA(){
Log.d(tag, "activity使用this");
}
public void fromSelf(){
Log.d(tag, "service使用this");
}
}
与start不同的是首先service中要实现onBinder()方法,返回IBinder实例供bind该服务的activity调用
activity中:
首先实现ServiceConnection接口用来绑定service
private TestService services;
private IBinder binder;
private boolean isBond;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
services=null;
binder=null;
Toast.makeText(MainActivity.this, "解除绑定了", 0).show();
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
services=((TestService.MyBinder)service).getServices();
binder=service;
Toast.makeText(MainActivity.this, "绑定了", 0).show();
}
};
接下来就是绑定和解绑:
protected void doUnbindService() {
if(isBond){
unbindService(connection);
}//解除绑定
}
//绑定<br style="color: rgb(75, 75, 75); line-height: 19.5px;" /><span style="color: rgb(75, 75, 75); line-height: 19.5px;"><span style="white-space:pre"> </span>//</span><span style="color: rgb(75, 75, 75); line-height: 19.5px;">第3个参数Context.BIND_AUTO_CREATE表明只要绑定存在,就自动建立 </span><span style="color: rgb(75, 75, 75); line-height: 19.5px;"><span style="white-space:pre">
</span> //Service;同时也告知Android系统,这个Service的重要程度与调用者相同, </span><br style="color: rgb(75, 75, 75); line-height: 19.5px;" /><span style="color: rgb(75, 75, 75); line-height: 19.5px;"> //除非考虑终止调用者,否则不要关闭这个Service</span>
private void doBindService() {
bindService(new Intent(this, TestService.class), connection, this.BIND_AUTO_CREATE);
isBond=true;
}
<span style="font-family:KaiTi_GB2312;font-size:18px;">((TestService.MyBinder)binder).getself();</span>