欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 12:06:41
...
  • 服务与多线程的区别:

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

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

  • bindService和startService使用方式:

项目与开发中用到了Android的service的两种使用方式,区别是使用service的对象需要与service更多的交互式使用bindService,反之如果只是需要在服务中执行一系列耗时操作,并且在此期间不需要进行频繁的交互,比如设置自定义的监听器接口,则可以使用startService来实现。

二者在生命周期上有所差异:

Android 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

相关标签: service