一. AIDL跨进程通讯
AIDL
AIDL全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)
服务端 Server
- 将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl
- 修改aidl文件,提供一个方法,该方法 就是处理客户端的请求
- rebuild project之后会发现自动生成一个Java文件:IMyAidlInterface.java
- 在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量。最终代码如下:
public class MyService extends Service {
IBinder binder = new IMyAidlInterface.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
return num1+num2;
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
- 清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报java.lang.SecurityException: Not allowed to bind to service Intent 异常
<service android:name=".MyService" android:exported="true">
<intent-filter>
<action android:name="com.bw.1703"></action>
</intent-filter>
</service>
接下来该从客户端向服务端发内容
客户端 Client
- 在客户端创建同样AIDL文件,要求包名AIDL名字必须一致,内容也必须一样提供add方法,rebuild 项目
- 在代码中绑定服务调用服务端的方法
public class MainActivity extends AppCompatActivity {
IMyAidlInterface iMyAidlInterface;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
int add = MainActivity.this.iMyAidlInterface.add(5, 5);
Toast.makeText(MainActivity.this, ""+add, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.bw.1703");
intent.setPackage("com.example.day18");
bindService(intent,conn, Service.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
注意:要先启动服务端,再启动客户端
二. Messenger跨进程通讯
Messenger
Messager,故名思义信使的意思,能够完成跨进程通信
Messenger的特点
- 客户端和服务端发送的都是message
- 使用handler接受消息(客户端和服务端都是)
- 不需要编写aidl文件
服务端 Server
- 创建服务
public class MyService extends Service {
@SuppressLint("HandlerLeak")
Messenger Servermessenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String data = bundle.getString("data");
Toast.makeText(MyService.this, ""+data, Toast.LENGTH_SHORT).show();
Messenger clientMessager = msg.replyTo;
Message message = Message.obtain();
Bundle b = new Bundle();
b.putString("message","客户端你好啊");
message.setData(b);
try {
clientMessager.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
@Override
public IBinder onBind(Intent intent) {
return Servermessenger.getBinder();
}
}
- 清单文件注册服务
<service android:name=".MyService" android:exported="true">
<intent-filter>
<action android:name="com.bw.messager"></action>
</intent-filter>
</service>
接下来该从客户端向服务端发内容
客户端 Client
public class MainActivity extends AppCompatActivity {
Messenger Servermessenger;
Messenger Clientmessager = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String message = bundle.getString("message");
Toast.makeText(MainActivity.this, ""+message, Toast.LENGTH_SHORT).show();
}
});
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Servermessenger = new Messenger(service);
Message message = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("data","我是客户端,你好服务器");
message.setData(bundle);
message.replyTo = Clientmessager;
try {
Servermessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setPackage("com.example.day17");
intent.setAction("com.bw.messager");
bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
}
以上就是我所掌握的Server跨进程的两种方式:AIDL和Messenger