android Service学习之bindService

原创
2015/01/08 11:07
阅读数 48

1、为什么要用bindService去启动一个服务?

FAQ:通过startService()和stopService()启动和关闭服务时,Service与访问者之间无法进行通信和数据交换,而使用bindService()和unbindService()启动和关闭服务的时候就解决了这个问题;

2、如何使用bindService()去启动一个服务?

FAQ:我们通常会使用bindService(intent, connection, Service.BIND_AUTO_CREATE);方法去启动一个服务。看下参数详解:

    intent:要启动的服务;

    connection:这是一个ServiceConnection对象,用来监听Service与访问者之间的连接状态,连接成功时回调onServiceConnected(ComponentName componentName, IBinder binder)这个方法,其中binder是回调的服务对象,从中可以获取服务相关信息,断开连接回调onServiceDisconnected(ComponentName name)方法,解除绑定的时候调用unbindService(connection)方法;

     Service.BIND_AUTO_CREATE:绑定时是否自动创建Service,这里自动创建。

3、如何创建一个绑定的Service?

FAQ:下面代码实现了一个绑定的Service:

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;
  }
 }
}

4、创建绑定的Activity:

 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;
  }
 };
}

5、程序说明:

当Service与Activity绑定的时候,Activity可以通过MyBind来获取Service状态,其实对于Service的onBind()返回的IBinder对象可以看作Service组件返回的回调对象,Service允许客户端通过IBinder对象来访问Service的内部数据,这样就实现了客户端与Service之间的通信!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部