h5移动端网站模板下载,网页设计实验总结100字,企业官方网站认证,百度爱采购怎么免费入驻概述 AIDL可以实现进程间的通信#xff0c;由于每个进程都是运行在独立的空间#xff0c;不同的进程想要交互需要借助一些特殊的方式#xff0c;AIDL就是其中的一种#xff0c;AIDL是一种模板#xff0c;因为实际交互过程中#xff0c;并不是AIDL起的作用#xff0c;具体…概述 AIDL可以实现进程间的通信由于每个进程都是运行在独立的空间不同的进程想要交互需要借助一些特殊的方式AIDL就是其中的一种AIDL是一种模板因为实际交互过程中并不是AIDL起的作用具体会在之后源码分析解释AIDL的作用是为了避免重复编写代码而出现的一个模板 语法 AIDL的语法十分简单与Java语言基本保持一致需要记住的规则有以下几点 AIDL文件以 .aidl 为后缀名 AIDL支持的数据类型分为如下几种 八种基本数据类型byte、char、int、long、float、double、boolean StringCharSequence其中不支持short类型实现了Parcelable接口的数据类型List 类型。List承载的数据必须是AIDL支持的类型或者是其它声明的AIDL对象Map类型。Map承载的数据必须是AIDL支持的类型或者是其它声明的AIDL对象 定向Tag。定向Tag表示在跨进程通信中数据的流向用于标注方法的参数值分为 in、out、inout 三种。其中 in 表示数据只能由客户端流向服务端out 表示数据只能由服务端流向客户端inout 则表示数据可在服务端与客户端之间双向流通此外如果AIDL方法接口的参数值类型是基本数据类型、String、CharSequence或者其他AIDL文件定义的方法接口那么这些参数值的定向 Tag 默认是且只能是 in所以除了这些类型外其他参数值都需要明确标注使用哪种定向Tag。定向Tag具体的使用差别后边会有介绍 明确导包。在AIDL文件中需要明确标明引用到的数据类型所在的包名即使两个文件处在同个包名下 服务端 先建立一个项目由于要传输自定义User对象所以定义一个User的aidl文件直接生成 创建完成后系统就会默认创建一个 aidl 文件夹文件夹下的目录结构即是工程的包名Book.aidi 文件就在其中 然后更改User.aidl文件内容package com.baidu.bpit.aibaidu.aidl;parcelable User;
复制代码然后生成一个User的类实现Parcelablepublic class User implements Parcelable {public String name;public User(String name){this.namename;}protected User(Parcel in) {name in.readString();}public static final CreatorUser CREATOR new CreatorUser() {Overridepublic User createFromParcel(Parcel in) {return new User(in);}Overridepublic User[] newArray(int size) {return new User[size];}};Overridepublic int describeContents() {return 0;}Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}
}
复制代码然后在定义一个BookName的aidl文件向客户端暴露可调用的接口需要手动导入Userimport com.baidu.bpit.aibaidu.aidl.User;package com.baidu.bpit.aibaidu.aidl;
import com.baidu.bpit.aibaidu.aidl.User;
interface BookName {String getName();ListUser getList();}
复制代码这时候重新build一下工程现在需要来创建一个 Service 供客户端远程绑定了返回你的自定义的Binder
public class ServiceService extends Service {public ServiceService() {}Overridepublic IBinder onBind(Intent intent) {return new MyBinder();}class MyBinder extends BookName.Stub {Overridepublic String getName() throws RemoteException {return 西游记;}Overridepublic ListUser getList() throws RemoteException {User user new User(111);User user1 new User(222);ListUser users new ArrayList();users.add(user1);users.add(user);return users;}}
}
复制代码AndroidManifest.xml文件定义 serviceandroid:name.ServiceServiceandroid:enabledtrueandroid:exportedtrueintent-filteraction android:namecom.aaa.aaa //intent-filter/service
复制代码客户端 首先把服务端的aidl文件夹整体复制到客户端之后需要创建和服务端User类所在的相同包名来存放 User类在MainActivity绑定服务端的service点击按钮获取书名
public class MainActivity extends AppCompatActivity {private BookName bookName;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindServer();initView();}private void initView() {findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {Log.d(mmmgetName, bookName.getName());ListUser list bookName.getList();for (User user : list) {Log.d(mmmgetList, user.name);}} catch (RemoteException e) {e.printStackTrace();}}});}private void bindServer() {Intent mIntent new Intent();//你定义的service的actionmIntent.setAction(com.aaa.aaa);//这里你需要设置你应用的包名mIntent.setPackage(com.baidu.bpit.aibaidu.aidl);bindService(mIntent, new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {bookName BookName.Stub.asInterface(service);}Overridepublic void onServiceDisconnected(ComponentName name) {}}, BIND_AUTO_CREATE);}
}复制代码点击按钮打印01-18 22:11:17.642 4542-4542/com.baidu.bpit.aibaidu.client D/mmmgetName: 西游记
01-18 22:11:17.643 4542-4542/com.baidu.bpit.aibaidu.client D/mmmgetList: 222111
复制代码正确获取数据 定向TAG 有三种定向TAG inout服务端修改数据会同步到客户端因此可以说数据是双向流动的in数据只从客户端流向服务端服务端修改数据不会影响客户端out数据只能由服务端传向客户端及时客户端传入一个对象这个对象也是空的即没有数据服务端获取该对象后对该对象任何操作都会同步到客户端这里修改aidl interface BookName {String getName();ListUser getList();void addInout(inout User user);void addIn(in User user);void addout(out User user);}
复制代码这次增加了三个方法addInoutaddInaddout之后分别测试这三个方法 修改User类 User类需要添加俩个方法一个无参构造一个readFromParcel public class User implements Parcelable {public String name;public User(){}public User(String name){this.namename;}protected User(Parcel in) {name in.readString();}public static final CreatorUser CREATOR new CreatorUser() {Overridepublic User createFromParcel(Parcel in) {return new User(in);}Overridepublic User[] newArray(int size) {return new User[size];}};Overridepublic int describeContents() {return 0;}Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}public void readFromParcel(Parcel dest) {name dest.readString();}
}
复制代码先测试一下inout 服务端
public class ServiceService extends Service {public ServiceService() {}Overridepublic IBinder onBind(Intent intent) {return new MyBinder();}class MyBinder extends BookName.Stub {Overridepublic String getName() throws RemoteException {return 西游记;}Overridepublic ListUser getList() throws RemoteException {User user new User(111);User user1 new User(222);ListUser users new ArrayList();users.add(user1);users.add(user);return users;}Overridepublic void addInout(User user) throws RemoteException {Log.d(mmmserver,服务端获取到user.name);user.name服务端更改;Log.d(mmmserver,服务端修改书名user.name);}Overridepublic void addIn(User user) throws RemoteException {}Overridepublic void addout(User user) throws RemoteException {}}
}
复制代码主要看inout方法服务端接受到客户端传来的信息后修改信息内容 客户端 private void initView() {findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {User user new User(客户端传入);Log.d(mmmclient, 客户端向服务端传入一本书,书名 user.name);bookName.addInout(user);Log.d(mmmclient, 服务端修改书名后,书名 user.name);} catch (RemoteException e) {e.printStackTrace();}}});}
复制代码点击按钮后向服务端传入数据服务端收到数据会对数据更改客户端再次查看此数据看是否同步 01-18 23:15:18.529 5606-5606/com.baidu.bpit.aibaidu.client D/mmmclient: 客户端向服务端传入一本书,书名客户端传入
01-18 23:15:18.529 5527-5554/com.baidu.bpit.aibaidu.aidl D/mmmserver: 服务端获取到客户端传入
01-18 23:15:18.530 5527-5554/com.baidu.bpit.aibaidu.aidl D/mmmserver: 服务端修改书名服务端更改
01-18 23:15:18.530 5606-5606/com.baidu.bpit.aibaidu.client D/mmmclient: 服务端修改书名后,书名服务端更改
复制代码看到服务端修改可以及时同步到客户端这就是inout 数据双向流动 测试in 服务端 Overridepublic void addIn(User user) throws RemoteException {Log.d(mmmserverIn, 服务端获取到 user.name);user.name 服务端更改;Log.d(mmmserverIn, 服务端修改书名 user.name);}
复制代码客户端 private void initView() {findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {User user new User(客户端传入);Log.d(mmmclient, 客户端向服务端传入一本书,书名 user.name);bookName.addIn(user);Log.d(mmmclient, 服务端修改书名后,书名 user.name);} catch (RemoteException e) {e.printStackTrace();}}});}
复制代码当点击按钮会发送数据到服务端服务端会更改数据内容客户端再次查看数据看是否被改变 01-18 23:26:23.079 5815-5815/com.baidu.bpit.aibaidu.client D/mmmclient: 客户端向服务端传入一本书,书名客户端传入
01-18 23:26:23.080 5736-5763/com.baidu.bpit.aibaidu.aidl D/mmmserverIn: 服务端获取到客户端传入
01-18 23:26:23.081 5736-5763/com.baidu.bpit.aibaidu.aidl D/mmmserverIn: 服务端修改书名服务端更改
01-18 23:26:23.081 5815-5815/com.baidu.bpit.aibaidu.client D/mmmclient: 服务端修改书名后,书名客户端传入
复制代码看以看出服务端修改数据并不会影响客户端 测试OUT 服务端 Overridepublic void addout(User user) throws RemoteException {Log.d(mmmserverout, 服务端获取到 user.name);user.name 服务端更改;Log.d(mmmserverout, 服务端修改书名 user.name);}
复制代码客户端 private void initView() {findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {User user new User(客户端传入);Log.d(mmmclient, 客户端向服务端传入一本书,书名 user.name);bookName.addout(user);Log.d(mmmclient, 服务端修改书名后,书名 user.name);} catch (RemoteException e) {e.printStackTrace();}}});}
复制代码客户端向服务端传入数据服务端收到后更改数据客户端再次查看数据 01-18 23:36:21.997 6100-6100/com.baidu.bpit.aibaidu.client D/mmmclient: 客户端向服务端传入一本书,书名客户端传入
01-18 23:36:21.998 6023-6037/com.baidu.bpit.aibaidu.aidl D/mmmserverout: 服务端获取到null服务端修改书名服务端更改
01-18 23:36:21.998 6100-6100/com.baidu.bpit.aibaidu.client D/mmmclient: 服务端修改书名后,书名服务端更改
复制代码可以看到服务端收到的是空对象服务端更改影响客户端 GitHub: 参考www.jianshu.com/p/29999c1a9… 转载于:https://juejin.im/post/5d4d12e7518825237b5bdb4d