跨进程如何通讯?两个进程无法直接通讯,通过Android系统底层间接通讯。基于service的aidl实现跨进程通讯。
什么叫AIDL? Android interface definition language,Android接口定义语言
什么时候使用?
AIDL IPC 多线程 多应用
Binder IPC 没有多线程 多应用
message IPC 没有多线程
使用
eclipse
Androidstudio
new-folder-AIDL Folder 生成AIDL目录
在目录中 new - AIDL - AIDL FILE 生成,要编译后,才可以调用
案列
新建两个app.
服务端app
new-folder-AIDL Folder 生成AIDL目录
在目录中 new - AIDL - AIDL FILE 新建一个aidl文件
// IMyAidlInterface.aidl
package com.base.aidl; // Declare any non-default types here with import statements interface IMyAidlInterface { //计算两个数的和
int add(int num1, int num2); }
再提供一个service提供调用
public class IRemoteService extends Service { //当客户端绑定这个服务时 会执行
@Override
public IBinder onBind(Intent intent) {
return iBinder;
} private IBinder iBinder = new IMyAidlInterface.Stub(){ @Override
public int add(int num1, int num2) throws RemoteException {
Log.e("TAG", "收到的数是:"+ num1+","+ num2);
return num1+num2;
}
};
}
xml注册
<service
android:name=".IRemoteService"
android:enabled="true" >
<intent-filter>
<action android:name="com.base.aidl.IRemoteService" />
</intent-filter>
</service>
客服端app
新建一个和服务端一样的AIDL,(包名,名称都要一样)
activity代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText eTNum1;
private EditText eTNum2;
private EditText eTNum3;
private IMyAidlInterface iMyAid; private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//绑定成功
iMyAid = IMyAidlInterface.Stub.asInterface(iBinder);
} @Override
public void onServiceDisconnected(ComponentName componentName) {
//绑定结束
iMyAid = null;
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView(); //启动绑定
bindSer();
} private void bindSer() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.base.aidl", "com.base.aidl.IRemoteService"));
bindService(intent, conn, Context.BIND_AUTO_CREATE);
} private void initView() { eTNum1 = (EditText) findViewById(R.id.ed_num1);
eTNum2 = (EditText) findViewById(R.id.ed_num2);
eTNum3 = (EditText) findViewById(R.id.ed_res); findViewById(R.id.btn_add).setOnClickListener(this);
} @Override
public void onClick(View view) {
int num1 = Integer.parseInt(eTNum1.getText().toString());
int num2 = Integer.parseInt(eTNum2.getText().toString()); int num3; try {
num3 = iMyAid.add(num1, num2);
eTNum3.setText(num3 + "");
} catch (RemoteException e) {
e.printStackTrace();
eTNum3.setText("出错了");
}
} @Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
布局省略
AIDL 数据类型
short不支持
list要表明 in 或者 out
parcelable 序列化