关于安卓BindService 绑定问题
BindService 主要用于当用户想要将活动activity与service进行绑定,当activity结束时(调用者)service也跟着一起结束了;而startService()只能用来启动服务,当服务启动后,就与前台活动没有了关系;
当我们要从service外部获得service中的方法内容时,我们必须要Ibinder返回的service对象才能操作;所以我们必须利用bindservice的方式去绑定服务获取binder对象,利用binder的方式去获取service的方法内容;
使用bindservice的具体过程如下:
1)创建意图:Intent intent = new Intent(MainActivity.this,BindService.class);
2)创建bindservice对象:bindService(intent,conn,BIND_AUTO_CREATE);
3)创建内部类MyBinder、新建mybinder对象:
private MyBinder myBinder = new MyBinder();
class MyBinder extends Binder{
public BindService getService(){
return BindService.this;
}
}
4)onBind()返回mybinder对象:
public IBinder onBind(Intent intent) {
return myBinder;
}
5)通过serviceconnection获取Binder对象进一步来获取service对象,最后调用service中的方法:
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BindService.MyBinder binder = (BindService.MyBinder)service;
BindService bindService = binder.getService();
bindService.print();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
示例代码:
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initEvent();
}
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BindService.MyBinder binder = (BindService.MyBinder)service;
BindService bindService = binder.getService();
bindService.print();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private void initEvent() {
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,BindService.class);
bindService(intent,conn,BIND_AUTO_CREATE);
}
});
findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(conn);
}
});
}
}
BindService
public class BindService extends Service {
public void print(){
Log.d(TAG, "print: BindService");
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG, "onStart");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind:");
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) {
Log.d(TAG, "onRebind");
super.onRebind(intent);
}
private MyBinder myBinder = new MyBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
class MyBinder extends Binder{
public BindService getService(){
return BindService.this;
}
}
}