BindService
关于BindService的介绍有很多,这里就不赘述了。
主要了解BindService的生命周期
1. BindService绑定多个Activity
我们知道BindService可以绑定多个组件,而只有当绑定在服务上的组件都调用unbindService解除绑定服务或者组件本身就已经被系统回收,那么服务也就会被停止回收了,才会回调onUnbind()和 onDestroy() 方法。
而当BindService绑定多个Activity时,能否成功回调 onUnbind()和 onDestroy()方法,与Activity的启动模式有着密切联系。
对于Activity启动模式不了解的可以查阅相关资料
Activity有四种自动模式,默认的模式为“standard",而在这种情况下,基本是没办法成功回调 onUnbind()和 onDestroy()方法,因为当我们在不同Activity间跳转的时候,在任务栈中会创建多个Activity实例,而这些实例与你最初绑定的实例已经不同了,现在通过采用”singleInstance"启动模式来介绍
2.代码
BindService绑定3个Activity
MyService.java
package com.example.a02bindservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
class MyBinder extends Binder {
//创建服务的代理,调用服务中的方法
public void methodInBinder() {
Log.i("lim", "执行MyBinder中的methodInBinder()方法");
method();
}
}
public void method() {
Log.i("lim", "执行MyService中的method()方法");
}
@Override
public void onCreate() {
Log.i("lim", "创建服务,执行onCreate()方法");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
Log.i("lim", "绑定服务,执行onBind()方法");
return new MyBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("lim", "解绑服务,执行onUnbind()方法");
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("lim", "call onStartCommand...");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i("lim", "call onDestroy...");
}
}
Activity1
package com.example.a02bindservice;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private MyConn myconn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("lim", "Activity1 OnCreate 任务栈号为"+ this.getTaskId());
}
public void activity1Click(View v){
Intent intent = new Intent(this, Main2Activity.class);
startActivity(intent);
Log.v("lim", "跳转到Activity2");
};
public void bindClick(View v) {
Log.i("lim", "bindClick()");
if (myconn == null) {
myconn = new MyConn(); //创建连接服务的对象
} else {
Log.i("lim", "Activity1已绑定");
}
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, myconn, BIND_AUTO_CREATE);//绑定服务
}
public void callClick(View v) {
Log.i("lim", "callClick()");
if (myconn != null) {
myconn.myBinder.methodInBinder(); //调用服务中的方法
}
}
public void unbindClick(View v) {
Log.i("lim", "unbindClick()");
if (myconn != null) {
unbindService(myconn); //解绑服务
myconn = null;
}else{ Log.i("lim", "Activity1无绑定");}
}
private class MyConn implements ServiceConnection {
//创建MyConn类,用于实现连接服务
// 当成功绑定服务时调用的方法,该方法获取MyService中的Ibinder对象
private MyService.MyBinder myBinder;
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (MyService.MyBinder) iBinder;
Log.i("lim", "Activity1服务成功绑定, 内存地址为:" + myBinder.toString());
}
//当服务失去连接时调用的方法
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.i("lim", "Activity1服务成功解绑");
}
}
Activity2 、Activity3与Activity1代码一致
Manifest
结果
依次解绑后成功回调 onUnbind()和 onDestroy()方法
全部源码地址:https://github.com/lim7t/Android/tree/master/app