当前位置:网站首页>两个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>
边栏推荐
猜你喜欢
随机推荐
将两个DataTable合并——DataTable.Merge 方法
flink-sql查询配置与性能优化参数详解
webtrc 中VideoAdapter类中的作用及局限
【树 图 科 技 头 条】2022年6月27日 星期一 今年ETH2.0无望
flink-sql所有数据类型
实际开发中,如何实现复选框的全选和不选
自动化运维工具Ansible(3)PlayBook
NFT市场以及如何打造一个NFT市场
登录页面js手写
使用express-jwt第三方包报错TypeError: expressJWT is not a function
k9s-终端UI工具
webrtc中视频采集实现分析(二) 视频帧的分发
ES6 Const Let Var的区别
scrapy 爬取当当图书名字图片
flink sql left join数据倾斜问题解决
PostgreSQL模式(Schema)
win云服务器搭建个人博客失败记录(wordpress,wamp)
攻防世界MISC—MISCall
剑指 Offer 2022/7/2
智能合约安全——私有数据访问