AIDL(Android Interface Definition Language ,Android 接口定义语言),定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。
只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。
如果不需要执行跨越不同应用的并发 IPC,就应该通过实现一个 Binder 创建接口;或者,如果想执行 IPC,但根本不需要处理多线程,则使用 Messenger 类来实现接口。
1、创建 AIDL 文件
首先在 java 同级目录 aidl 文件夹,然后创建 .aidl 文件。
// IBookManager.aidlpackage com.wshunli.ipc.demo;// Declare any non-default types here with import statementsimport com.wshunli.ipc.demo.Book;interface IBookManager { List<Book> getBookList ...
通过 Messenger 可以在不同进程之间传递 Message 对象,是一种轻量级的 IPC 方案。
首先看 Messenger 的构造方法:
public Messenger(Handler target) { mTarget = target.getIMessenger();}public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target);}
实质上还是底层还是基于 AIDL 的。
对于 Message 对象可以存储传递的数据:
public int what; // 消息标识public int arg1; // 整型数据public int arg2; // 整型数据public Object obj;public Messenger replyTo;/*package*/ Bundle data;public void setData(Bundle data) { this.data = data; ...
使用文件共享也是不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据。
在 Windows 系统,文件会被加排斥锁导致其他线程无法对其访问,而 Android 是基于 Linux 系统,所以并发读写文件没有限制。
// 序列化private void persistToFile() { new Thread(new Runnable() { @Override public void run() { User user = new User(1, "wshunli", true); File dir = new File(getApplicationContext().getCacheDir().getPath() + "/user/"); if (!dir.exists()) { dir.mkdirs(); } ...
在 Android 四大组件中 Activity、Service、Receiver 都支持在 Intent 中附加传递 Bundle 数据。
Bundle 是以键值对的形式存储数据,支持基本数据类型、数组、实现 Serializable 或 Parcelable 接口的对象以及一些 Android 支持的特殊对象。
// 发送数据Intent intent = new Intent(MainActivity.this, SecondActivity.class);Bundle bundle = new Bundle();bundle.putString("userName", "wshunli");intent.putExtras(bundle);startActivity(intent);// 接收数据Bundle bundle = getIntent().getExtras();String userName = null;if (bundle != null) { userName = bundle.getString( ...
在 Android 中多进程指单个应用存在多个进程的情况。
开启多进程模式在 Android 中开启多线程只有一种方法,即在 AndroidManifest.xml 中指定 android:process 属性。
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity><activity android:name=".SecondActivity" android:process=":remote" /><act ...
IPC(Inter-Process Communication,进程间通信)指两进程间进行数据交换的过程。
IPC 并不是 Android 独有的,Windows 上可通过剪切板、管道和油槽等来进行进程间通信;Linux 可通过命名管道、共享内存和信号量等实现进程间通信。
虽然 Android 是基于 Linux 内核的操作系统,但是它有自己的进程间通信方式。
在 Android 中,通过 Binder 可以实现进程间通信,还有 Socket 、ContentProvider 等等。
IPC 使用场景,一是应用的自身原因需要使用多进程实现;另一个是通过多进程获得更多内存空间。
我们需要通过 Intent 和 Binder 传输数据时,需要用到 Serializable 或者 Parcelable 接口完成对象的序列化。
1、Serializable 接口
Serializable 是 Java 提供的一个序列化接口,是一个空接口。
public class User implements Serializable { private static final lon ...
移动端技术
未读《第一行代码》读书笔记 – 网络编程
《第一行代码》读书笔记(一)– 平台架构 (第1章)《第一行代码》读书笔记(二)– 应用组件之 Activity (第2、4章)《第一行代码》读书笔记(三)– 应用组件之 Service (第10章)《第一行代码》读书笔记(四)– 应用组件之 BroadcastReceiver (第5章)《第一行代码》读书笔记(五)– 应用组件之 ContentProvider (第7章)《第一行代码》读书笔记(六)– 数据存储方案 (第6章)《第一行代码》读书笔记(七)– 多媒体资源 (第8章)《第一行代码》读书笔记(八)– 网络编程 (第9章)
第8章 使用网络技术WebView 的用法WebView 也是 Android 的一个控件,用来显示一些网页,内容也比较多。
针对 WebView 的封装,可以使用 AgentWeb :
Justson/AgentWeb: AgentWeb is a powerful library based on Android WebView.https://github.com/Justson/A ...
移动端技术
未读《第一行代码》读书笔记 – 多媒体资源
《第一行代码》读书笔记(一)– 平台架构 (第1章)《第一行代码》读书笔记(二)– 应用组件之 Activity (第2、4章)《第一行代码》读书笔记(三)– 应用组件之 Service (第10章)《第一行代码》读书笔记(四)– 应用组件之 BroadcastReceiver (第5章)《第一行代码》读书笔记(五)– 应用组件之 ContentProvider (第7章)《第一行代码》读书笔记(六)– 数据存储方案 (第6章)《第一行代码》读书笔记(七)– 多媒体资源 (第8章)《第一行代码》读书笔记(八)– 网络编程 (第9章)
第8章 丰富你的程序使用通知1、通知的基本用法
通知 Notification 是 Android 系统中比较特色的功能,使用方式也很灵活。
首先获取 NotificationManager 对象,然后构建 Notification 实例,最后使用 notify 方法显示通知。
NotificationManager notificationManager = (NotificationManag ...
移动端技术
未读《第一行代码》读书笔记 – 数据存储方案
《第一行代码》读书笔记(一)– 平台架构 (第1章)《第一行代码》读书笔记(二)– 应用组件之 Activity (第2、4章)《第一行代码》读书笔记(三)– 应用组件之 Service (第10章)《第一行代码》读书笔记(四)– 应用组件之 BroadcastReceiver (第5章)《第一行代码》读书笔记(五)– 应用组件之 ContentProvider (第7章)《第一行代码》读书笔记(六)– 数据存储方案 (第6章)《第一行代码》读书笔记(七)– 多媒体资源 (第8章)《第一行代码》读书笔记(八)– 网络编程 (第9章)
第6章 数据存储全方案Android 系统中主要提供了 3 种方式:文件存储、SharedPreference 以及数据库存储。
文件存储对于文件存储,Android 系统不对数据进行格式化处理,适合一些简单的文本数据或者二进制数据。
1、将数据保存到文件中
String FILENAME = "hello_file";String string = "hello ...
移动端技术
未读《第一行代码》读书笔记 – 应用组件之 ContentProvider
《第一行代码》读书笔记(一)– 平台架构 (第1章)《第一行代码》读书笔记(二)– 应用组件之 Activity (第2、4章)《第一行代码》读书笔记(三)– 应用组件之 Service (第10章)《第一行代码》读书笔记(四)– 应用组件之 BroadcastReceiver (第5章)《第一行代码》读书笔记(五)– 应用组件之 ContentProvider (第7章)《第一行代码》读书笔记(六)– 数据存储方案 (第6章)《第一行代码》读书笔记(七)– 多媒体资源 (第8章)《第一行代码》读书笔记(八)– 网络编程 (第9章)
第7章 跨程序共享数据ContentProvider 主要用于不同程序之间实现数据共享的功能,同时保证被访问数据的安全。
目前,使用 ContentProvider 是 Android 实现跨程序共享数据的标准方式。
ContentProvider 有两种用法,一是访问其他程序中的数据,另一种是创建自己的 ContentProvider 让其他程序访问。
访问其他程 ...


