服务仍然是运行在主线程中,而Thread则是真正的开启了一个新的线程来执行先关操作。
那为什么要用服务呢,初步理解是服务是为了更好地管理线程。试想,当我们在某一个activity中启动一个新的Thread的后,我们一般会在新线程中执行一些耗时操作,甚至有时我们需要在此activity被销毁后线程任然执行。但是这时候我们就会失去线程的引用,无法再对线程进行控制。而借助服务的话,我们可以下服务中启动线程,即使activity被销毁了,只要我们能与服务建立联系,我们就能够对线程进行有效的控制。
项目与开发中用到了Android的service的两种使用方式,区别是使用service的对象需要与service更多的交互式使用bindService,反之如果只是需要在服务中执行一系列耗时操作,并且在此期间不需要进行频繁的交互,比如设置自定义的监听器接口,则可以使用startService来实现。
二者在生命周期上有所差异:
1、startService方式比较简单,我们只需要调用context.startService(intent)方法,即可启动服务,以这种方式启动服务会执行服务中的
@Override
public int onStartCommand(Intent intent, int flags, int startId)
当然Intent可以用来传递一些简单的数据到服务中,我们可以在这个回调中执行我们需要的一系列耗时操作。
在我们的需要执行的操作完成后我们可以执行context的stopService来结束service,或者在service中调用stopSelf()方法结束自身。
stop方法会结束服务的执行并销毁service。
2、使用bindService给context绑定服务时,执行的事service的
public IBinder onBind(Intent intent)
这个方法会返回一个IBinder对象,这个对象时我们用来与context交互的,我们可以把我们要在服务中执行的操作在此方法实现。
在我们的context中,绑定服务需要传入一个实现ServiceConnection接口的对象,这个对象可以帮助我们与service之间建立联系。
context.bindService(intent,new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
LocalBinder localBinder=(LocalBinder)iBinder;//此回调返回的iBinder就是我们在服务中返回的LocalBinder
localBinder.setServiceConnection(this);//service获取ServiceConnection自身,用于在service中解绑服务
localBinder.setOnBindcontext(mWXSDKInstance.getContext());//service获取它所绑定的context,用于在service 中解绑服务
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
});
,BIND_AUTO_CREATE);
这里的LocalBinder是一个我们定义在service中的内部类,它继承了IBinder,我们在public IBinder onBind(Intent intent)中返回的就是这个LocalBinder的对象,以LocalBinder为媒介,我们几乎可以与service进行任何交互。
public class LocalBinder extends Binder{
//直接获取服务,可以对服务进行操作
public UpdateService setServiceConnection(ServiceConnection connection){
return UpdateService.this;
}
public void setServiceConnection(ServiceConnection connection){
UpdateService.this.setServiceConnection(connection);
}
public void setOnBindcontext(Context context){
UpdateService.this.setOnBindCOntext(context);
}
}
public IBinder onBind(Intent intent) {
....一系列操作
return localBinder;
}
当我们完成服务中的操作后我们需要解绑服务,调用context的unbindSercice方法进行解绑,这个方法被调用后会执行对应的service中的 onUnbind方法,我们可以在这个回调中执行一些操作。
参考文章:Android Service两种启动方式详解(总结版)https://blog.csdn.net/imxiangzi/article/details/76039978