zoukankan      html  css  js  c++  java
  • [Android]启用Service时Context.bindService()和Context.startService()的区别与联系(转载)

    服务不能自己运行,需要通过调用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()方 法。
     
    服务常用生命周期回调方法如下:
    onCreate() 该方法在服务被创建 时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
    onDestroy()该方法在服务被终止时调用。
     
    与采用Context.startService()方 法启动服务有关的生命周期方法
    onStart() 只有采用Context.startService()方 法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方 法尽管不会多次创建服务,但onStart() 方法会被多次调用。
     
    与采用Context.bindService()方 法启动服务有关的生命周期方法
    onBind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
    onUnbind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用
     
    Java代码  收藏代码
    1. //采用Context.startService()方法启动服务的代码如下:  
    2. public class HelloActivity extends Activity {  
    3.     @Override  
    4.     public void onCreate(Bundle savedInstanceState) {  
    5.         ......  
    6.         Button button =(Button) this.findViewById(R.id.button);  
    7.         button.setOnClickListener(new View.OnClickListener(){  
    8.        public void onClick(View v) {  
    9.               Intent intent = new Intent(HelloActivity.this, SMSService.class);  
    10.               startService(intent);  
    11.        }});         
    12.     }  
    13. }  
    14.    
    15. //采用Context. bindService()方法启动服务的代码如下:  
    16. public class HelloActivity extends Activity {  
    17.      ServiceConnection conn = new ServiceConnection() {  
    18.               public void onServiceConnected(ComponentName name, IBinder service) {  
    19.            }  
    20.            public void onServiceDisconnected(ComponentName name) {  
    21.            }  
    22.      };  
    23.     @Override public void onCreate(Bundle savedInstanceState) {   
    24.         Button button =(Button) this.findViewById(R.id.button);  
    25.         button.setOnClickListener(new View.OnClickListener(){  
    26.                public void onClick(View v) {  
    27.                   Intent intent = new Intent(HelloActivity.this, SMSService.class);  
    28.                   bindService(intent, conn, Context.BIND_AUTO_CREATE);  
    29.                   //unbindService(conn);//解除绑定  
    30.           }});         
    31.     }  
    32. }  
     

    服务的生命周期回调方法:

    服务的生命周期跟启动服务的方法有关:
     当采用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()方法并不会导致该方法被多次调用。
    onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

    如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
    onCreate()-->onStart()-->onBind()-->onUnbind()[重载后的方法需返回true-->onRebind()

  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/yaya1943/p/3624998.html
Copyright © 2011-2022 走看看