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()

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

  • 相关阅读:
    HDU 3951 (博弈) Coin Game
    HDU 3863 (博弈) No Gambling
    HDU 3544 (不平等博弈) Alice's Game
    POJ 3225 (线段树 区间更新) Help with Intervals
    POJ 2528 (线段树 离散化) Mayor's posters
    POJ 3468 (线段树 区间增减) A Simple Problem with Integers
    HDU 1698 (线段树 区间更新) Just a Hook
    POJ (线段树) Who Gets the Most Candies?
    POJ 2828 (线段树 单点更新) Buy Tickets
    HDU 2795 (线段树 单点更新) Billboard
  • 原文地址:https://www.cnblogs.com/merbn/p/4638858.html
Copyright © 2011-2022 走看看