Android 09 服务 使用服务进行本地进程通信
Posted 今晚看星星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 09 服务 使用服务进行本地进程通信相关的知识,希望对你有一定的参考价值。
1 使用启动式服务-无法进行本地通信
- 当程序使用
startService()
方式启动服务时,无法与调用者进行通信,服务只是在后台进行了执行 - 如果程序需要与调用者进行数据交互时,应该使用
bindService()
绑定式服务启动方式
2 绑定式服务-本地服务通信
bindService(Intent service, ServiceConnection connection, int flags)
- service:用于指定启动的服务
- connection:用于监听调用者与Service之间的连接状态
- flags:用于指定绑定时是否自动创建Service,创建时为:
BIND_AUTO_CREATE
- 应用程序内部线程的通信即为本地服务通信
- 需要使用
IBinder
对象实现本地服务通信
3 本地服务通信的使用
3.1 创建服务
- 在Service中创建内部类MyBinder 继承 Binder
- 在Service的
onBind()
方法中返回,调用者可以使用binder 获取Service中的数据
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 {
public String state = "running";
public MyBinder myBinder = new MyBinder();
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.i("service_life", "OnBind function 绑定服务成功!");
state = "bind_service";
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("service_life", "OnUnBind function 解除绑定成功!");
state = "onUnBind";
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.i("service_life", " onDestroy function 销毁服务!");
state = "onDestroy";
super.onDestroy();
}
@Override
public void onCreate() {
Log.i("service_life", "on Create function 开启服务!");
state = "onCreate";
super.onCreate();
}
public class MyBinder extends Binder{
public String getState() {
return state;
}
}
}
3.2 连接服务并调用
- 在调用服务时,使用
ServiceConnection类
的onServiceConnected()
方法中获取binder对象
// 创建服务连接
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("service_life", "服务连接成功");
myBinder = (MyService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("service_life", "服务连接断开");
}
};
- 组件通过binder与Service进行通信
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private MyService.MyBinder myBinder;
// 创建服务连接
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("service_life", "服务连接成功");
myBinder = (MyService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("service_life", "服务连接断开");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
button3 = findViewById(R.id.button3);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 绑定服务按钮
Intent intent = new Intent(MainActivity.this, MyService.class);
// 绑定服务, 自动绑定
bindService(intent, serviceConnection, BIND_AUTO_CREATE);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 解除绑定
unbindService(serviceConnection);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取Service中State的状态
Log.i("service_life", "获取了State状态");
Toast.makeText(MainActivity.this, "State: " + myBinder.getState(), Toast.LENGTH_SHORT).show();
}
});
}
private Button button1, button2, button3;
}
以上是关于Android 09 服务 使用服务进行本地进程通信的主要内容,如果未能解决你的问题,请参考以下文章
Android:远程服务Service(含AIDL & IPC讲解)