zoukankan      html  css  js  c++  java
  • [AndroidTips]startService与bindService的区别

    Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
    我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

    1 通过startService
        Service会经历 onCreate --> onStart
        stopService的时候直接onDestroy

       如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
       下次调用者再起来仍然可以stopService。

    2 通过bindService   
        Service只会运行onCreate, 这个时候 调用者和Service绑定在一起

       调用者退出了,Srevice就会调用onUnbind-->onDestroyed
       所谓绑定在一起就共存亡了。


    注意:Service的onCreate的方法只会被调用一次,
    就是你无论多少次的startService又 bindService,Service只被创建一次。
    如果先是bind了,那么start的时候就直接运行Service的onStart方法,
    如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
    只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。


    Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。

    服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
    这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,
    即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
    接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,
    但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

    如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
    接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
    接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,
    多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
    如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法.

    onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候调用者会和Service绑定在一起,但onBind只能一次,不可多次绑定。
    在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

    由于Android 中的Service使用了onBind 的方法去绑定服务,返回一个Ibinder对象进行操作,而我们要获取具体的Service方法的内容的时候,我们需要Ibinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象,这个样子的话我们才能利用bindService的方法对Service进行绑定,获取Binder对象之后获取具体的Service对象,然后才获取Service中的方法等等。

    与采用Context.startService()方法启动服务有关的生命周期方法
    onCreate() --onStart() --onDestroy()
    onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
    onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
    onDestroy()该方法在服务被终止时调用。

     与采用Context.bindService()方法启动服务有关的生命周期方法
    onCreate()-- onBind() -- onUnbind() -- onDestroy()
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/androidme/p/2393670.html
Copyright © 2011-2022 走看看