Android Service与Activity之间的通信(bindService启动方式)
程序员文章站
2022-05-14 08:06:21
...
步骤:
1.在服务文件中提供Binder 下文中onBind()方法里return的对象
2.在Activity文件中实现ServiceConnection,重写两个回调方法
3.在Activity文件中调用bindService(),传递ServiceConnection
4.系统调用onServiceConnected()的回调方法时,可使用接口定义的方法开始调用服务
5.在Activity文件中断开与服务的连接-------->调用unBindService()
onBind方法是Service与Activity之间建立通信的桥梁(中间人),修改后的Service如下
public class BasisService extends Service {
@Nullable
public static final String TAG = "BasisService";
private BasisBind basisBind;
@Override
public void onCreate() {
Log.d(TAG, "------>onCreate()");
basisBind = new BasisBind();
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "------>onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG, "------>onDestroy()");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "------>onBind()");
return basisBind;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "------>onUnBind()");
return super.onUnbind(intent);
}
public void show() {
Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
}
public class BasisBind extends Binder {
public void realize() {
show();
}
}
}
相对于上文Android Service的基本用法添加了一个 onUnbind方法,以及一些操作
下面开始介绍下bindService启动方式
可以看到其中有三个参数,第二个参数如下
Java文件如下
public class StartSevice extends AppCompatActivity implements View.OnClickListener {
private Button btn_start;
private MyConn conn;
private BasisService.BasisBind basisBind;
private Button btn_stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_sevice);
conn = new MyConn();
initView();
}
private void initView() {
btn_start = (Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(this);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
//绑定的方式启动
Intent bindIntent = new Intent(this, BasisService.class);
bindService(bindIntent, conn, BIND_AUTO_CREATE);
break;
case R.id.btn_stop:
//建议写在onDestroy()方法中,这里只为显示效果
unbindService(conn);
break;
}
}
public void verify() {
//脱离了service的体系,不能用new对象来调用服务的方法
BasisService service = new BasisService();
service.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除绑定
unbindService(conn);
}
//ServiceConnection 服务连接
private class MyConn implements ServiceConnection {
//当服务连接时,如果绑定的服务onBind()没有返回值,则不执行该方法
//第三个参数iBinder:可以转化成在服务里写的自定义IBinder
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//拿到中间人
basisBind = (BasisService.BasisBind) iBinder;
basisBind.realize();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
}
下面运行通过看日志了解一下其生命周期
1.绑定服务
2.多次绑定,没有日志
3.解绑服务
由此可以发现这种启动方式的生命周期与startService启动方式生命周期是不同的
上一篇: RPC服务及与HTTP服务对比