资讯专栏INFORMATION COLUMN

BindService() 绑定方式开启服务

miguel.jiang / 2106人阅读

摘要:代表与服务失去连接第三个参数类型就是服务执行的模式。采用的方法绑定开启服务先一个类实现接口,这个类用于为方法的第二个是参数做准备,我理解是定义与服务的连接通道。这也是服务最常见的用法。

Bind方式开启服务

首先来看一下启动服务的两种方式startService和bindService:

startService

StartService(Intent intent)

start的方式只能简单的开启服务,并且开启之后基本不能敢于服务的运行逻辑,话句话说,开启后服务就和开启服务的线程没什么关系了。但是通常我们都是更加紧密的去联系服务,可能会获取一些运行的结果,比如执行结果,进度信息等,那就需要使用bind的方式开启服务了

bindService

bindService地方法就比较丰富,其传入三处有三个,类型分别为

Intent,ServiceConnection,Int.
其中第一个就不细说了,意图大家都明白,第二个为接口,其中包含两个必须实现的方法:
onServiceConnected(ComponentName var1, IBinder var2)
代表服务连接,第一个参数暂且不提,第二个先记住它叫Ibindr,后面会提到。
onServiceDisconnected(ComponentName var1)
代表与服务失去连接
第三个参数Int类型就是服务执行的模式。

虽然BindService参数丰富,功能强大,但是其使用逻辑也略微复杂,下面慢慢道来。

采用bind的方法绑定开启服务

a>先new一个类实现ServiceConnection接口,这个类用于为bind方法的第二个是参数做准备,我理解是定义与服务的连接通道。

   private class MyConn implements ServiceConnection{
       //通道成功连接
       @Override
       public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
           //此处IService代表在Service中提供一个调用其内部方法的接口,为接口类型
           mybinder= (IService) iBinder;
           Log.d("phone.....","3.  见到服务的代理对象:"+mybinder.toString());
       }
       //通道失去连接
       @Override
       public void onServiceDisconnected(ComponentName componentName) {
       }
   }

b>实例化出通道,然后使用执行bind方法。

   在外部类:
   private MyConn comm;
   
   内部方法:
   comm=new MyConn();
       bindService(intent,comm, Context.BIND_AUTO_CREATE);
   其中Context.BIND_AUTO_CREATE代表若服务不存在实例则创建实例
   

服务内部实现一个代理人类,这个代理继承自Ibinder,也就是上文ServiceConnection中的onServiceConnected方法的一个返回值,这个Ibinder对象就是服务中的代理在阜外外部的一个引用,通过这个引用就可以调用Ibinder实现的接口中的方法。

   private class Mybinder extends Binder implements IService{
       //由代理去调用服务内部的方法
       public void callinService(){
           Log.d("phone.....","5.  代理人执行了服务里的方法");
           @Override
           callInService();
       }
   }
   

定义IService的接口

这个接口就是上文提到的IService接口,这个接口中通常定义想要暴露给外部的方法,外部也只能看到IBinder中实现的这个接口的方法,除非你将上一节中的MyBinder这个类定义为Public。

   public interface IService {
       public void callInService();
   }

返回代理人对象

具体服务是如何将IBinder的引用返回给外部呢,就是通过Service唯一的必须实现的方法:

   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
       //当有需求时,呼叫代理人去接待
       Mybinder mybinder=new Mybinder();
       Log.d("phone.....","2.  成功绑定,返回服务的代理对象:"+mybinder.toString());
       return mybinder;
   }

实现serviceConnection接口里面的方法

现在你就可以在通道中看到Service的代理对象了:

   private class MyConn implements ServiceConnection{
   @Override
   public void onServiceConnected(ComponentName name, IBinder service) {
       myBinder = (IService) service;
       System.out.println("Activity,得到代理人对象");
   }

调用接口里面的方法

通过MyBinder这个Service的代理对象,就可以执行服务中对外开放的方法了。当然这个方法就需要你自己去定义了。

   
   mybinder.callInService();
   
   

   

最后的最后,大致说明一下两种方式开启服务的特点

startService

生命周期
oncreate()--->onstartcommand()--->onstart()--->onDestroy()

可以多次调用,不会重复创建,oncreate()只会执行一次

以start方式开启的服务也只能停止一次,多次调用stopservice()是无效的

以start方式开启的服务与UI线程失去关系,即使UI线程被销毁,服务仍然可以正常运行

不能调用服务中的方法

bindService

生命周期
oncreate() --->onbind() -->onunbind()---->ondestry();

只能成功绑定和解绑一次

与绑定的UI线程同时被销毁(一根绳上的蚂蚱^_^)

可以调用服务中的方法

混合开启服务

既然start开启的服务不能调用方法,bind方式开启的服务生命力又很弱,那么能否两种方式的有点么?答案当然是肯定的,否则服务的应用能力就太弱了。

通过startService()方式开启服务(只能通过调用stopService停止)

通过bindService进行绑定,以进行服务的方法调用(当需要的时候)

通过unbindService进行解绑(不需要调用方法了,在UI线程被销毁之前解绑)

通过stopService停止服务

这样我们就可以灵活的使用Service,当需要的时候可以随时进行调用,不要的时候又可以长期运行于后台而不用保留UI线程。这也是服务最常见的用法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12966.html

相关文章

  • Android四大组件之Service

    摘要:注意每个必须在中通过来声明。执行具体的下载任务接下来我们在中通过来绑定和解除绑定可以看到,这里我们首先创建了一个的匿名类,在里面重写了方法和方法,这两个方法分别会在与建立关联和解除关联的时候调用。 前言 Hi,大家好,上一期我们讲了如何使用BroadcastReceiver,这一期我们讲解Android四大组件之Service相关知识。每天一篇技术干货,每天我们一起进步。 耐心专注不仅...

    archieyang 评论0 收藏0
  • android 四大组件之Service

    摘要:作为的四大组件之一,其重要性可想而知。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信。然而不会停止服务。 文章参考自:1.郭神博客:http://blog.csdn.net/guolin_b...2.Android开发文档:https://developer.android.com...htt...

    yy736044583 评论0 收藏0
  • 关于Android的Service知识点,你知道吗?

    摘要:目录学习相关知识点概述生命周期的基本用法服务。主要是用来后台处理网络事务,播放音乐,执行文件操作和进行交互等。这两种服务各有各的特色。不然会出现主线程被的情况,为应用无反应。用于后台执行用户指定的操作。 目录 学习Service相关知识点: 概述; Service生命周期; Service的基本用法; 服务。 问:达叔,今日工作累吗? 答:累啊,那么问你,你知道Android中的 Se...

    Cobub 评论0 收藏0
  • Android Service用法知识点的讲解

    摘要:学习相关知识点的基础知识,生命周期,分类,运行地点本地服务,远程服务,运行类型前台服务,后台服务,功能可通信与不可通信。主要是用来后台处理网络事务,播放音乐,执行文件操作和进行交互等。 Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务),功能(...

    KunMinX 评论0 收藏0
  • 进程间通信--IPC

    摘要:前言进程间通信简称就是指进程与进程之间进行通信一般来说一个只有一个进程但是可能会有多个线程所以我们用得比较多的是多线程通信比如但是在一些特殊的情况下我们会需要多个进程或者是我们在远程服务调用时就需要跨进程通信了设置多进程设置多进程的步骤很 前言: 进程间通信(Inter-Process Communication),简称IPC,就是指进程与进程之间进行通信.一般来说,一个app只有一个...

    thursday 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<