Android service的两种使用方式bindService和startService使用方式

  • 服务与多线程的区别:

服务仍然是运行在主线程中,而Thread则是真正的开启了一个新的线程来执行先关操作。

那为什么要用服务呢,初步理解是服务是为了更好地管理线程。试想,当我们在某一个activity中启动一个新的Thread的后,我们一般会在新线程中执行一些耗时操作,甚至有时我们需要在此activity被销毁后线程任然执行。但是这时候我们就会失去线程的引用,无法再对线程进行控制。而借助服务的话,我们可以下服务中启动线程,即使activity被销毁了,只要我们能与服务建立联系,我们就能够对线程进行有效的控制。

  • bindService和startService使用方式:

项目与开发中用到了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

你可能感兴趣的:(andriod开发,Android开发技术分享)