Android 中的IPC简单使用
来源:互联网 发布:电脑抽奖软件下载 编辑:程序博客网 时间:2024/06/02 05:58
AIDL
Android Interface Definition Language //安卓接口定义语言
语法
- 文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。
- 数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包, 就算目标文件与当前正在编写的 .aidl 文件在同一个包下 ——在 Java 中,这种情况是不需要导包的。
默认支持的数据类型包括:
- Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
- String 类型。
- CharSequence类型。
- List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。
- Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的。
- 定向tag:AIDL中的定向 tag 表示了在跨进程通信中数据的流向。用于非默认支持的数据类型,有三种 in代表数据可以从客户端流向服务端 ,out则相反,inout代表支持双向流动
支持自定义类的数据类型 ,但是必须实现Parcelable接口
/** * 参数是一个Parcel,用它来存储与传输数据 * @param dest */ //**这样数据就能支持out流向了**public void readFromParcel(Parcel dest) { //注意,此处的读值顺序应当是和writeToParcel()方法中一致的 name = dest.readString(); price = dest.readInt();}
使用AIDL实现跨进程通信
1.创建AIDL文件,一般所有AIDL用到的类要在同一个包里这样移植也比较方便
interface AIDLManager {String getName();void setName(String name);}
==自定义类一定要导包==
如果不放在一起可以使用以下Gradle代码实现读取同包里的文件
sourceSets {main { java.srcDirs = ['src/main/java', 'src/main/aidl']}}
2.编写服务端代码
public class MyService extends Service {private static final String TAG = "MainActivity";private String name;//重写方法AIDLManager.Stub bookManager = new AIDLManager.Stub() { @Override public String getName() throws RemoteException { return name; } @Override public void setName(String name) throws RemoteException { MyService.this.name = name; }};@Nullable@Overridepublic IBinder onBind(Intent intent) { Log.d(TAG, "onBind: " + name); //返回对象 return aidlManager;}@Overridepublic void onCreate() { super.onCreate(); //初始化 name = "Android Interface Definition Language";}@Overridepublic void onDestroy() { super.onDestroy();}
}
3.客户端代码
AIDLManager.Stub aidlManager;ServiceConnection serviceConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { aidlManager = (AIDLManager.Stub) AIDLManager.Stub.asInterface(service); try { String name1 = aidlManager.getName(); aidlManager.setName("sfsfsf"); Log.d(TAG, "onServiceConnected: " + name1); Toast.makeText(MainActivity.this, "" + name1, Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { }};@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setAction("cn.gas.testaidl.aidl"); intent.setPackage("cn.gas.testaidl"); bindService(intent, serviceConn, BIND_AUTO_CREATE);}
0 0
- Android 中的IPC简单使用
- Android中的IPC之使用Bundle
- Android 中的 IPC 方式一:使用 Bundle
- android中的ipc
- 初识Android中的IPC
- Android 中的 IPC 机制
- android 中的IPC方式
- Android中的IPC方式
- Android中的IPC方式
- Android中的IPC(一)
- Android中的IPC(二)
- 2.2 Android中的IPC
- Android中的IPC方式
- Android中的IPC机制
- android中的IPC机制
- Android中的IPC机制
- Android 中的IPC机制
- Android中的IPC机制
- 页面位置会向上偏移或者向下偏移
- tornado入门实例
- [LeetCode]378. Kth Smallest Element in a Sorted Matrix
- 如何使用Imatest进行色彩还原测试
- unpack(b) received extra data saltstack故障
- Android 中的IPC简单使用
- Java学习笔记(九)--Calendar类 正则表达式
- 利用java的IO流简单创建文件和赋值文件(内含简单代码)
- 提取字符串中的大写字母
- ASP.NET 统计连续签到天数
- MongoDB数据库备份
- 苹果微信web无法提交form表单问题解决
- PAT-1009
- mapreduce 二次排序后reduce输出中key的变化