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之间的通信!