• Android Studio四大组件之Service


    Service在Android运行在后台,它没有可视化界面,只是默默运行在后台。我们以一个后台定时器的例子清晰的说明Service的运行流程。
    一、创建Service类
    项目右键->New->Service新建一个名为Time人Service的Service。将自动在AndroidMainfest中声明Service。

    二、Service生命周期

    • 打开刚刚新建的TimerService,实现了一个onBind的方法。我们可以重写Service的一些方法,深刻分析Service的生命周期。

    • 生命周期:
      ①onCreate->onStartCommand->onDestory。
      onCreate只有在服务创建的时候才会被调用,如果Service已经在运行中,这个方法将不会再被调用。
      过程:创建服务之后就会执行服务,onStartCommand中的执行代码可以执行多次。

      ②onBind->onUnbind。

      可见onBind方法的返回类型是IBinder,这是一个接口,是一个客户端-服务器接口,可以利用该接口实现Activity与Service之间的通信。

    三、Service的启动

    • 启动方式有两种:startService和bindService。
      startService,从方法可见参数是一个Intent,那显而易见我们需要新建一个Intent,使得Activity与Service建立起联系。
      使用该方法调用Service的话直接就是调用Service的onCreate方法。那停止服务的话就是stopService。


      bindService,如下截图可见参数,分别是Intent,ServiceConnection和int类型的三个参数。根据感觉第一个Intent就是上面新建的Intent。第二个参数连接类就是实现Activity与Service之间的通信部分,第三个参数使用AS已经定义好的一个整形变量。BIND_AUTO_CREEATE。

      下面具体阐述一下第二个参数,因为其还会重写一些方法。

      从函数名可预见其就是Activity与Service之间建立起联系之后和断开联系之后所进行的一些操作。onServiceConnected函数的参数IBinder就是Service类中onBind方法所返回的IBinder。
      使用该方法调用Service的话它会先执行Service的onCreate方法,然后紧接着调用onBind方法。需要注意的是onBind调用之后只能通过onUnbind方法进行解绑,直接调用onDestory销毁是不行的。
      下面我们将直接使用bindService启动Service,介绍Activity与Service之间是如何进行通信的。startService是比较简单。

    四、bindService启动服务,Activity与Service之间通信

    • 我们实现的是一个计时器服务,就是当用户浏览此页面五秒之后进行通知用户。首先我们先在onCreate或者onBind方法中实现计时服务。(使用Timer,具体比较简单,直接贴代码)。主要就是使用了Timer的一个方法,在服务开启5000ms的时候执行task中的代码。

      这里我们新建一个线程主要是服务默认会使用主线程,这样会影响正在运行的Activity的性能。

    • Activity给Service传值
      我们新建一个Binder的子类myBinder,并创建实例,使得onBind方法中返回该实例。同时在该子类中实现一些方法,这样Activity中onServiceConnected方法中的IBinder接口进行强转成我们的myBinder类,然后就可以调用myBinder中的一些方法了。例如setData方法,Activity给Service传值。
      Service端

      Activity端调用:

    • Service给Activity传值
      如果说我们只是在调用服务时传一个固定的值回来的话,我们也可以在myBinder中实现一个getData的方法,直接将值返回,但是我们是一个定时器,需要的是在五秒之后才返回,如果酱紫操作会造成message为空,因为onServiceConnected是在onBind执行时就会执行,onBind执行的时候提示语message还为空,只有在五秒时才会赋值给message。
      所以该如何操作呢?
      使用到回调机制。我们在Service中新建一个接口,该接口中定义给message赋值的抽象方法,在计时五秒之后主动暴露该接口。那Activity中就会重写该接口中的方法进行处理service送出来的提示语message。
      Service端:


      Activity端:(因为服务是在一个子线程中执行,不能在Activity主线程中贸然将值改变,使用消息队列处理机制。不然子线程可以修改主线程,酱紫很危险,也容易造成消息泄露的微危险)

    预告:我们这个实现的是在一个进程中实现Service的调用,之后将会发布在不同进程中实现服务的调用,即在两个APP中调用。同样使用的是IBinder接口。

  • 相关阅读:
    c++ 的几种强制转换的讨论
    观察者模式
    epoll实现linux进程通信
    vim 实现 go to definition的功能
    svn 的使用
    makefile文件的技术
    [转]epoll技术
    [转]poll技术
    Linux重定向的理解
    避免僵死进程的方法
  • 原文地址:https://www.cnblogs.com/21-T/p/10837441.html
Copyright © 2020-2023  润新知