Service

Service

为什么需要

  • “抓住”线程

    ​ 设想当一个活动启动一个线程后finish,当再次创建该活动时,其中线程成员已经被赋予新的线程实例,已经执行的线程将变成“游离”状态,此时若想控制此线程,将是一个问题。

    ​ 将线程建立在service中,当活动需要对线程进行控制的时候,只需与service进行绑定后,调用相关方法即可。即使活动销毁再创建,只要活动在此期间不销毁不停止,活动与service进行重绑定就可对线程进行控制。

  • “共享”线程

    ​ 设想上面的活动启动了一个线程,该线程的中断需要在其他的活动中进行控制,那么传递这个线程的引用就是一件很繁琐的事情。

    ​ 将对线程的操作全部都写在service中,谁需要控制其中线程,谁就与service进行绑定即可

什么情况下使用Service

  • 执行耗时&&不需要UI&&存在“游离”情况的任务

    ​ 不存在“游离”情况时(比如一个线程的整个周期被包含在所属活动的整个周期),就使用常规的线程操作即可

    ​ 耗时既指一段较长的时间,也指一直执行至应用被后台杀死

  • 任务的执行控制需要多组件控制

    ​ 参考“为什么需要”第二点说明

使用步骤

  • 创建Service

    • 继承Service

    • 重写onBind

      ​ 在绑定时要做的一些事情,返回一个IBinder实例,绑定者就是通过这个来使用Service中的方法。

    • 创建类内IBinder公共子类

      ​ 这里面编写业务方法

    • 在Service中创建第三条中子类的成员mXxxxIBinder

    • 编写Service构造函数,目的是实例化mXxxxIBinder

    • 在onBind中返回mXxxxIBinder

  • 声明Service

    ​ 在资源文件中声明

    •   <service android:name=".services.LearnService"
                  android:enabled="true">
        </service>
      
  • 编写业务逻辑

    • 在自定义的类内IBinder公共子类中编写
    • 在onXxxx中编写
    • 只需要在IBinder中执行的业务,其所涉及的变量也定义在IBinder中
  • 绑定Service(在需要此service的活动中进行)

    • 创建刚才XxxxIBinder类成员:之后调用Service中的方法

    • 创建ServiceConnection类成员(实例化时,需要实现连接(连接成功时调用)和断开连接(后台被强制停止或异常时调用)的回调函数):绑定解绑时需要此成员

    •  Intent intent = new Intent(this, LearnService.class);
       bindService(intent,connection,BIND_AUTO_CREATE);//此时会触发onCreated
      
  • 启动Service(开启service中线程任务前必须要先启动这个服务)

    • Intent intent = new Intent(this, LearnService.class);
      startService(intent);
      
    • 如果不启动此活动就执行其中的线程,就会导致线程处于“游离”状态,可以为此时的Service不过是在常规线程外套了层壳而已,并没有起到service的真正作用

  • 解绑Service

    • 目的:节约资源,解绑后,涉及连接的资源会被释放;活动无需再执行有关service中的回调;避免不必要的交互与通信

    • unbindService(connection);
      
    • 解绑不会调用connection中断开连接的回调函数

  • 终止Service

    • 内部终止,在service需要的位置调用stopSelf();

    • 外部停止

      Intent intent = new Intent(this, LearnService.class);
      stopService(intent);
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值