如何将service与activity绑定

一、

service的简单使用就不详细展开了。只做一点儿讨论以解释为什么要绑定activity。

service是不可见的,它的启动、停止和其他控制操作都是通过其他应用程序组件来实现的。

比如最简单的就是在activity中使用startService()来启动一个服务,使其在后台运行。但如果仅仅是这样的话,我们启动一个service后就只能看着它在后台运行却不能对其进行任何操作了。如果想在activity中能够操作service(调用其中的某些方法,让其完成某些动作),我们就必须先把activity和service绑定起来。

二、如何绑定activity和service?这需要我们实现service中的onBind()函数以返回service实例给activity

1、首先是创建service类和activity类。

2、在service类中   

定义一个内部类继承自Binder类:

  1. public class MyBinder extends Binder{  
  2.         public Service1 getService(){  
  3.             return Service1.this;  
  4.         }  
  5.     }  


实例化onBind()方法:

private final IBinder binder = new MyBinder();  


  1.  @Override  
  2.     public IBinder onBind(Intent intent) {  
  3.         Log.i(LOG, "onBind............");  
  4.         return binder;  
  5.     } 

3、在activity中完成绑定

  1. Intent intent = new Intent(Activity1.this,Service1.class);  
  2.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  

1)、    注意到bindService的第二个参数是一个ServiceConnection类型的参数。service和其他组件之间的连接都表示为一个ServiceConnection,要想将service和其他组件进行绑定,就需要实现一个新的ServiceConnection。

所以应该在activity中定义一个内部类

  1. public ServiceConnection conn= new ServiceConnection() {  
  2.           
  3.         @Override  
  4.         public void onServiceDisconnected(ComponentName name) {  
  5. //当连接意外断开时调用
  6.             Log.i(LOG, "onServiceDisconnected>>>>>>>>");  
  7.             myservice = null;  
  8.         }  
  9.           
  10.         @Override  
  11.         public void onServiceConnected(ComponentName name, IBinder service) {  
  12. //当建立连接时调用
  13.             Log.i(LOG, "onServiceConnected>>>>>>>>");  
  14.             myservice = ((Service1.MyBinder)service).getService();  
  15.         }  
  16.     };   

这里的myservice就是我们获取到的已经绑定的service的实例。


2)、  bindService的第三个参数是一个flag。

   可以使用的flag有:

BIND_AUTO_CREATE:绑定完成后就启动目标service

BIND_DEBUG_UNBIND:这只在debug时使用,跟unbind有关。

BIND_NOT_FOREGROUND:确保被绑定的service永远不会有运行于前台的优先级,因为默认情况下,绑定一个service会提高它的优先级

BIND_ABOVE_CLIENT:确保客户端处于前台时,绑定的service也变为前台进程

BIND_ALLOW_OOM_MANAGEMENT:允许系统在低内存等状态下删除该service(这是自己对源码中注释的理解)

BIND_WAIVE_PRIORITY:绑定service时不改变其优先级

BIND_ADJUST_WITH_ACTIVITY:系统根据service所绑定的activity的重要程度来调整这个service的优先级。


三、关于service的生命周期的讨论(转载,http://www.cnblogs.com/yydcdut/p/3961545.html)

1.    被启动的服务(startService())的生命周期。
             如果一个Service被某个Activity 调用Context.startService() 方法启动,那么不管是否有Activity使用bindService()绑定或unbindService()解除绑定到该Service,该Service都在后台运行。如果一个Service被多次执行startService(),它的onCreate()方法只会调用一次,也就是说该Service只会创建一个实例,而它的onStartCommand()将会被调用多次(对应调用startService()的次数)。该Service将会一直在后台运行,直到被调用stopService(),或自身的stopSelf方法。当然如果系统资源不足,系统也可能结束服务。
2.    被绑定的服务(bindService())的生命周期。
             如果一个Service被调用 Context.bindService ()方法绑定启动,不管调用bindService()调用几次,onCreate()方法都只会调用一次,而onStartCommand()方法始终不会被调用,这时会调用onBind()方法。当连接建立之后,Service将会一直运行,除非调用Context.unbindService() 断开连接或者之前调用bindService() 的 Context 不存在了(如该Activity被finish),系统将会自动停止Service,对应onDestroy()将被调用。
3.    被启动又被绑定的服务的生命周期。
             如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。调用unbindService()将不会停止Service,而必须调用stopService()或Service的stopSelf()方法来停止服务。
4.   当服务被停止时清除服务。
            当一个Service被终止时,Service的onDestroy()方法将会被调用,在这里应当做一些清除工作,如停止在Service中创建并运行的线程等。













  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值