0. 序言
服务端在这里可以简单的理解为Service,客户端在这里可以简单的理解为Activity。
时刻要有这个意识:Android是建立在Linux内核的基础上的,资源的分配是根据进程进行的。
这里先简单的讲解下通过Binder,相同进程Activity如何与Service进行通信。
1. 服务端
这里创建AidlService作为服务端,时刻监听客户端的请求。
public class AidlService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new AidlBinder();
}
public class AidlBinder extends Binder{
public int plus(int first,int second){
return first + second;
}
}
}
- 定义名为AidlService的Service,继承Service,实现onBind方法
- 定义一个内部类,名为AidlBinder,继承Binder,并在AidlBinder内部类中创建一个名为plus的方法,参数是两个int的值,返回两个参数的和。
- 通过plus方法可以实现AidlService和Activity的通信。
- onBind方法中返回名为AidlBinder的Binder对象即可。
2.客户端
定义名为MainActivity的Activity作为客户端
public class MainActivity extends AppCompatActivity {
private AidlService.AidlBinder mAidlBinder;
private static final String TAG = "MainActivity";
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mAidlBinder = (AidlService.AidlBinder) iBinder;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mAidlBinder = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText first_num = findViewById(R.id.ed_firtst);
final EditText second_num = findViewById(R.id.ed_second);
Intent bindService = new Intent(MainActivity.this, AidlService.class);
bindService(bindService, mServiceConnection, BIND_AUTO_CREATE);
findViewById(R.id.bt_plus).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int first = Integer.parseInt(first_num.getText().toString());
int second = Integer.parseInt(second_num.getText().toString());
Log.d(TAG, "onClick: plus: " + mAidlBinder.plus(first, second));
}
});
}
}
2019-09-15 21:44:49.654 21151-21151/com.example.testaidl D/MainActivity: onClick: plus: 11
- 定义了两个EditText和一个Button控件。输入两个数字在EditText中,点击Button进行求和操作,也就是在服务端中进行求和的操作。
- 为了实现Activity和Service的通信,我们创建ServiceConnection对象,onServiceConnected是客户端和服务端建立连接时的回调方法,onServiceDisconnected是客户端与服务端连接断开的时候的回调方法。
- onServiceConnected回调方法的第二个参数iBinder即是服务端中onBinder方法中返回的Binder对象,这里只需要强转即可。
- 有了客户端和服务端连接成功和断开连接的回调方法还不够,还需要客户端主动与服务端进行绑定,建立连接,这里只需要进行bindService即可,bindService的第一个参数是需要绑定的Service,第二个参数是ServiceConnection对象,用来监听客户端与服务端的连接的建立和断开,第三个参数的意思是客户端绑定服务端之后,服务端自动实例化Service。
- 当点击Button控件时,调用mAidlBinder的plus方法并传入参数即可。
- 即客户端Activity与服务端Service进行通信,可以通过Binder,这里Binder相当于一个代理对象,通过它就可以实现客户端与服务端的通信。
3. 后续
如果大家喜欢这篇文章,欢迎点赞!
如果想看更多 IPC 方面的文章,欢迎关注!
网友评论