突然遇到个问题, 问题描述:
我按照顺序来绑定一个服务:start->bind 最后在退出activity的时候unbind一下, 现在我有这样的业务需求,就是当我再次进入该activity时需要再次bind, 我发现再调用bind方法并不能绑定服务(不知道google工程师为啥要设计成这样。)
写了一段测试代码验证一下:
Service:
package org.load.testservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyService extends Service {@Overridepublic IBinder onBind(Intent intent) {System.out.println("bind....");return null;}@Overridepublic void onCreate() {System.out.println("oncreate....");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("onstart....");return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {System.out.println("unbind....");return super.onUnbind(intent);}@Overridepublic void onDestroy() {System.out.println("destroy...");super.onDestroy();}}
activity:
package org.load.testservice;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;public class MainActivity extends Activity {private MyConn conn = new MyConn();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void startService(View view) {startService(new Intent(this, MyService.class));}public void bindService(View view) {bindService(new Intent(this, MyService.class), conn, Context.BIND_AUTO_CREATE);}public void unbindService(View view) {unbindService(conn);}private class MyConn implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {}@Overridepublic void onServiceDisconnected(ComponentName name) {}}}
但是当我再次点击“绑定服务”的时候问题出现了onBind方法没有执行!!也就是说没有成功绑定!!!
查看文档看到Service还有一个生命周期方法onRebind,好像看到希望了, 添加上再试试:
@Overridepublic void onRebind(Intent intent) {System.out.println("rebind...");super.onRebind(intent);}
怀着激动心情再次测试,logcat遗憾的告诉我还是不行!!!!
仔细查看onRebind的官方说明:
Called when new clients have connected to the service, after it had previously been notified that all had disconnected in its onUnbind
.
This will only be called if the implementation of onUnbind
was overridden to return true.
最重要的是最后一句话,意思是:这个方法只有当onUnbind返回true的时候才能被调用。
现在改写onUnbind:
@Overridepublic boolean onUnbind(Intent intent) {System.out.println("unbind....");return true;}
再次查看logcat, 别的不多说了,上图:
总结:
多次bind、unbind一个服务,只有在第一次的时候才会调用服务的onBind方法, 解除绑定后继续绑定并不会调用onBind而是调用了onRebind, 但是要想让onRebind顺利的调用还有一个条件就是onUnbind必须返回true。