当前位置:网站首页>两个APP进行AIDL通信
两个APP进行AIDL通信
2022-08-04 05:28:00 【N_Y_S】
创建服务端
一、创建服务端App
项目名:power
包名:com.nys.power
aidl:是用于定义服务器和客户端通信接口的一种描述语言,主要用在进程与进程之间的通信;
二、创建AIDL文件,只做了业务逻辑接口,Rebuild项目,让项目生成同名的接口文件
会自动创建相应的包名
在aidl文件中添加逻辑接口
interface PowerAidlInterface {
void setAccount(String user,String pwd);
String getInfo();
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
添加逻辑接口以后Rebuild 让项目生成同名的接口文件
三、创建一个Java类,继承接口文件中的抽象类(Stub),并完成业务逻辑
public class PowerImpl extends PowerAidlInterface.Stub{
private String user;
private String pwd;
@Override
public void setAccount(String user, String pwd) throws RemoteException {
this.user=user;
this.pwd=pwd;
}
@Override
public String getInfo() throws RemoteException {
String[] userarray=new String[]{"admin","user"};
String[] pwdarray=new String[]{"123","111"};
for (int i=0;i<userarray.length;i++){
if (user.equals(userarray[i])){
if (pwd.equals(pwdarray[i])){
return "登录成功";
}
}
}
return "登陆失败";
}
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
}
四、将接口公开,使用Service
public class PowerService extends Service {
public PowerService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new PowerImpl();
}
}
创建客户端
一、创建客户端App
项目名称:login
包名:com.nys.login
二、将服务器的,aidl文件复制到客户端app中,Rebuid,让项目生成同名的接口文件
在资源管理器显示文件,然后将文件复制到客户端的src文件夹下,然后Rebuid
三 、在Activity中绑定接口,使用接收到的Binder通信
public class MainActivity extends AppCompatActivity {
TextInputEditText text_user;
TextInputEditText text_pwd;
Button btn_login;
PowerAidlInterface powerAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_user=findViewById(R.id.text_user);
text_pwd=findViewById(R.id.text_pwd);
btn_login=findViewById(R.id.btn_login);
Intent intent=new Intent();
intent.setComponent(new ComponentName("com.nys.power","com.nys.power.PowerService"));
bindService(intent,conn,BIND_AUTO_CREATE);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String user = text_user.getText().toString();
String pwd = text_pwd.getText().toString();
try {
powerAidlInterface.setAccount(user,pwd);
String result = powerAidlInterface.getInfo();
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
powerAidlInterface=PowerAidlInterface.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
}
这个时候通信并不能成功,因为版本原因,需要在注册表添加服务器的路径
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.nys.login">
<queries >
<package android:name="com.nys.power"/>
</queries>
...
</manifest>
边栏推荐
猜你喜欢
随机推荐
webrtc中视频采集实现分析(二) 视频帧的分发
JS原型链
VScode配置PHP环境
webrtc中的视频编码(一) 视频编码模块轮廓
使用express-jwt第三方包报错TypeError: expressJWT is not a function
thymeleaf中onclick事件动态传递参数问题
自动化运维工具Ansible(3)PlayBook
编程Go:return、break、continue
剑指 Offer 2022/7/8
(十一)树--堆排序
关系型数据库-MySQL:错误日志(log_error)
程序员的财富观
(十六)图的基本操作---两种遍历
多个gcc/glibc版本的共存及指定gcc版本的编译
剑指 Offer 2022/7/2
大龄程序员的心理建设
完美解决keyby造成的数据倾斜导致吞吐量降低的问题
flink on yarn指定第三方jar包
【Matlab仿真】:一带电量为q的电荷以速度v运动,求运动电荷产生磁感应强度
SQl练习 2022/6/29