一、为何要用bindService去启动一个服务?java
FAQ:经过startService()和stopService()启动和关闭服务时,Service与访问者之间没法进行通讯和数据交换,而使用bindService()和unbindService()启动和关闭服务的时候就解决了这个问题;ide
二、如何使用bindService()去启动一个服务?ui
FAQ:咱们一般会使用bindService(intent, connection, Service.BIND_AUTO_CREATE);方法去启动一个服务。看下参数详解:this
intent:要启动的服务;code
connection:这是一个ServiceConnection对象,用来监听Service与访问者之间的链接状态,链接成功时回调onServiceConnected(ComponentName componentName, IBinder binder)这个方法,其中binder是回调的服务对象,从中能够获取服务相关信息,断开链接回调onServiceDisconnected(ComponentName name)方法,解除绑定的时候调用unbindService(connection)方法;component
Service.BIND_AUTO_CREATE:绑定时是否自动建立Service,这里自动建立。对象
三、如何建立一个绑定的Service?get
FAQ:下面代码实现了一个绑定的Service:it
public class BindService extends Service { private static final String TAG = "BindService"; private int count; private boolean quit; private MyBind bind = new MyBind(); @Override public IBinder onBind(Intent arg0) { Log.i(TAG, "service is binded"); return bind; } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "service is onUnbind"); return true; }; @Override public void onCreate() { super.onCreate(); Log.i(TAG, "service is onCreate"); new Thread(new Runnable() { @Override public void run() { while (!quit) { try { Thread.sleep(2000); count++; } catch (Exception e) { } } } }).start(); } @Override public void onDestroy() { super.onDestroy(); this.quit = true; Log.i(TAG, "service is onDestroy"); } class MyBind extends Binder { public int getCount() { return count; } } }
四、建立绑定的Activity:io
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private Button bindBtn, unbindBtn, getBtn; private Intent intent; MyBind bind; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindBtn = (Button) findViewById(R.id.button1); unbindBtn = (Button) findViewById(R.id.button2); getBtn = (Button) findViewById(R.id.button3); bindBtn.setOnClickListener(l); unbindBtn.setOnClickListener(l); getBtn.setOnClickListener(l); intent = new Intent(this, BindService.class); } OnClickListener l = new OnClickListener() { @Override public void onClick(View view) { if (view == bindBtn) { bindService(intent, connection, Service.BIND_AUTO_CREATE); } else if (view == unbindBtn) { unbindService(connection); } else if (view == getBtn) { Toast.makeText(MainActivity.this, "Service的count值:" + bind.getCount(), Toast.LENGTH_LONG).show(); } } }; ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected"); Toast.makeText(MainActivity.this, "onServiceDisconnected", Toast.LENGTH_LONG).show(); } @Override public void onServiceConnected(ComponentName componentName, IBinder binder) { Toast.makeText(MainActivity.this, "onServiceConnected", Toast.LENGTH_LONG).show(); Log.i(TAG, "onServiceConnected"); bind = (MyBind) binder; } }; }
五、程序说明:
当Service与Activity绑定的时候,Activity能够经过MyBind来获取Service状态,其实对于Service的onBind()返回的IBinder对象能够看做Service组件返回的回调对象,Service容许客户端经过IBinder对象来访问Service的内部数据,这样就实现了客户端与Service之间的通讯!