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 {@Overridepublic IBinder onBind(Intent intent) {//必须实现,Service的抽象方法return null;}@Overridepublic void onCreate() {//首次创建service的逻辑在这里写super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//所需要service做的业务逻辑在这里写return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {//回收super.onDestroy();}}
注意点:
service是Android的四大组件之一,所以也需要到AndroidManifest.xml文件中注册一下:
在application标签下:
<service android:name=\".servie.Myservice\"android:exported=\"true\"android:enabled=\"true\"/>
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();@Overridepublic IBinder onBind(Intent intent) {//必须实现,Service的抽象方法return myBinder;}class MyBinder extends Binder{//内部类,用来联系servicepublic void test(){//业务逻辑}}}
这里写了一个Binder内部类,里面有个test就是我们想在Activity中调用的servcie里面的方法。
使用这个MyService:
TestActivity.java:
private Myservice myservice;private Myservice.MyBinder binder;private ServiceConnection conn = new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//绑定服务后的回调方法//绑定完服务才能回调拿到服务,进而使用服务里面方法binder = (Myservice.MyBinder) service;binder.test();}@Overridepublic 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两个方法都调用一次。