zoukankan      html  css  js  c++  java
  • 深入学习Service 2015-06-28 02:28 8人阅读 评论(0) 收藏

    Service可以长时间运行在后台、不提供用户界面,其他应用app也可以启动Service,即使用户切换到其他的app,Service依然可以运行。Service可跨进程。

    一、使用service的方式

    1、startService()

       通过startService()启动Service,即使启动该Service的Activity被销毁了,Service会依然在运行。Service通常会执行一个操作不会给调用返回结果。

    2、bindService()

      其他组件通过bindService()方法绑定Service上。绑定式,可以认为:Client-Server。发送请求,获取数据,甚至可以进行进程间通信。该Service跟绑定到Service上的组件共存亡。某一时刻,可以有多个组件绑定在Service上,所有绑定在Service上的组件都解绑了,Service销毁。

      启动的Service,还允许被绑定:实现两个回调方法,onStartCommand()、onBind()。

      注意:Service运行在主线程。如果想要进行耗时、阻塞的操作,需要开线程。

    创建绑定式service的三种方式:

    1)继承Binder类

    1.创建Binder类(子类)

    a)应该有一个共有方法,让客户端调用

    b)在该公有方法中返回一个Servic的实例

    2.Binder的实例会从onBind()方法中返回

    3.在客户端的onServiceConnected()中得到Binder实例


    2)使用Messenger

    可以用在进程间通信。在Service中定义Handler,处理Message。Messenger基于Handler,Messenger可以分享一个IBinder给客户端,可以发送指定到服务端使用message对象。

    是进程间通信的最简单方式。

    Messenger是Service的接口,

    如何使用Messenger:

    1.实现Handler

    2.Handler用来创建Messenger对象

    3.Messenger创建IBinder对象,并且把IBinder对象通过onBind()方法,返回给客户端。

    4.客户端利用IBinder生成Messenger

    5.客户端利用Messenger发送消息Message对象到服务器

    6.在服务端,接收message在Handler中


    3)AIDL:

    1.把MBinder私有了

    2.把要提供出去的方法,定义在接口(外部类)中Inter

    3.把Inter 的.java文件改成.aidl文件

    4.看到gen文件夹下的包中多了一个Inter.java,该文件中,有一个静态内部类Stub,继承了Binder,实现Inter

    5.让MBinder继承Stub

    客户端:

    绑定是不变的,只不过,在onServiceConnected()方法中IBinder对象---》转换成接口Inter的对象:Stub.asInterfase(ibinser)

    只要客户端拿到Inter的对象,就可以调用Service要提供出来的方法。

    非同一个app使用/调用Service中的提供出来的方法,提供出来的方法规定在接口中。

    把Server中定义的aidl文件拿过来,放在src文件夹下包中--》包名字必须和定义接口的包一模一样

    其他代码跟同一app调用aidl服务---》一样

    二、创建service

    1、创建Service子类,重写方法,比较重要的需要重写的方法:

    onStartCommand():另外一个组件调用startService()请求启动这个Service的时候,会调用该方法。一旦该方法执行了,Service就已经开启起来了,运行在后台,独立的。一旦Service的事情做完,应该停掉Service:stopSelf()、stopService().

    onBind():另外一个组件通过调用bindService()方法想要绑定到Service上的时候,系统会调用onBind()方法。必须要返回一个接口IBinder,接口--》让绑定者跟Service交流。如果不允许其他组件绑定上来,返回null。

    onCreate():Service第一次创建执行。该方法先于onStartCommand()、onBind()。

    onDestroy():当Service不再被使用的时候,被销毁。通常情况下需要重写该方法,来清理一些东西:线程、监听……

    一旦Service开启起来之后,将会保持运行,直到Service自己stopSelf()、其他组件调用stopService()

    bindService()创建Service对象,该Service跟绑定者共存亡,所有的绑定者都解绑了,系统销毁Service

    注册:

    2、清单文件中,Application节点中添加子节点:Service---》name

    跟Activity一样,也可以声明意图过滤器,让设备上的任意一个app都可以启动该Service

    Service被声明为私有的:通过Exported属性false

    三、生命周期

    第一次startService的时候:

    onCreate()、onStartCommand()-->传值

    再次点击开启Service:

    onstartCommand();--->继续传值

    当系统内存过低的时候,系统为了恢复资源,就会强制停止Service,如果Service上绑定了一个位于界面最前面(拥有用户焦点)Activity,该Service被杀死的可能性比较小。如果Service被声明为前台Service,几乎不会被杀死。Service运行时间过长,随着时间的推移,系统杀死该Service的可能性会越来越大。系统内存资源恢复的时候,会重启Service(虽然系统会重启Service,还取决于onStartConmmand()方法)。合理设计重启操作。

    生命周期方法:

    StartService第一次:onCreate()、onStartCommand()

    startService再次:onStartCommand()

    stopService:onDestory()

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    mysql常用方法案例
    springboot整合mybatis
    mysql自定义函数统计订单状态:GET_ORDER_STATUS()
    mysql计算时间差-本例为计算分钟差然后/60计算小时保留一位小数,由于直接得小时只会取整
    mysql字段值为null时排序问题
    对象与内存(一)
    java基础提升(关于数组)
    项目的部署
    myeclipse中ssm的搭建
    ui自动化笔记 selenium_webdriver,ui自动化框架(web)
  • 原文地址:https://www.cnblogs.com/merbn/p/4638858.html
Copyright © 2011-2022 走看看