Service根据使用方式有两种:startService、bindService。
区别:
①启动方式:前者startService、后者bindService;
②和Activity联系:前者Acitivty销毁,service仍然继续运行,后者跟随Acitivity一起销毁;
③方法调用和数据交换:前者不可以,后者可以;
④回调的周期函数:前者是onStartCommand,后者是onBind
⑤结束方式:前者是stopService或者stopSelf,后者是unbindService。
生命周期的不同:
startService方式:调用startService方法->onCreate->onStartCommand->Servcie运行->调用stopService->Service停止->onDestroy->Service销毁;
bindService方式:调用bindServcie方法->onCreate->onBind->绑定Service->调用unbindService方法->解绑Service->onUnBind->onDestroy->Service销毁。
具体实例:
startService方式:
Myservice.java:
public class Myservice extends Service {
@Override
public IBinder onBind(Intent intent) {
//必须实现,Service的抽象方法
return null;
}
@Override
public void onCreate() {
//首次创建service的逻辑在这里写
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//所需要service做的业务逻辑在这里写
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
//回收
super.onDestroy();
}
}
注意点:
service是Android的四大组件之一,所以也需要到AndroidManifest.xml文件中注册一下:
在application标签下:
android:exported="true"代表其他的应用程序也能调用这个服务;android:enabled="true"代表这个服务可以被实例化。
使用这个MyService:
TestActivity.java:
//启动这个服务
Intent intent = new Intent(TestActivity.this,MyService.class);
startService(intent);
//关闭这个服务
Intent intent = new Intent(TestActivity.this,MyService.class);
stopService(intent);
可以看到这个activity和service并没有数据交流,纯粹就是告诉服务你可以启动了,以及你可以关闭了。
但是如果你想和service有交流,那么就需要用bindService方式了。
具体实例:
startService方式:
Myservice.java:
public class Myservice extends Service {
private MyBinder myBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
//必须实现,Service的抽象方法
return myBinder;
}
class MyBinder extends Binder{
//内部类,用来联系service
public void test(){
//业务逻辑
}
}
}
这里写了一个Binder内部类,里面有个test就是我们想在Activity中调用的servcie里面的方法。
使用这个MyService:
TestActivity.java:
private Myservice myservice;
private Myservice.MyBinder binder;
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//绑定服务后的回调方法
//绑定完服务才能回调拿到服务,进而使用服务里面方法
binder = (Myservice.MyBinder) service;
binder.test();
}
@Override
public void onServiceDisconnected(ComponentName name) {
//解除绑定服务后的回调方法
}
};
使用时要注意,在onStart周期函数里绑定,在onStop周期函数里取消绑定。代码:
//在需要绑定服务的地方
Intent intent = new Intent(MainActivity.this,Myservice.class);
bindService(intent,conn,BIND_AUTO_CREATE);
//在需要解除绑定服务的地方
unbindService(conn);
解释:
ServiceConnection相当于一个“桥”,将activity和service联系起来
bindService方法就是绑定servcie用,第三个参数是“在绑定服务时,自动创建服务”的作用。
注意点:
如果一个服务两种方式都用了,那么要想销毁这个service就需要stopService和unbindService两个方法都调用一次。