1. 使用Bundle
Android中的Activity、Service和Receiver都是支持在 Intent 中传递 Bundle 数据的,Bundle实现了 Parcelable 接口,它可以方便的在不同进程间传输。当我们在一个进程中启动了另一个进程的 Activity、Service 和 Receiver,就可以在 Bundle 中附加需要传输给远程进程的信息并通过 Intent 发送。注意:传输的数据必须能够被序列化,比如基本数据类型、实现Serializable 或 Parcelable接口的对象以及Android支持的特殊对象。
考虑这么一种情况,A进程正在计算,计算完成后它要启动B进程的一个组件并把计算结果传递给B进程,可是这个计算结果不支持放入Bundle中,因此无法使用Intent来传输。可以这么考虑来解决:通过Intent启动进程B的一个Service组件(比如IntentService),让Service在后台进行计算,计算完毕后再启动B进程中真正要启动的目标组件,由于Service也运行在B进程中,所有目标组件就可以直接获取计算结果。
2. 使用文件共享
共享文件也是一种很好的进程间通信方式,两个进车通过读/写同一个文件来交换数据。在Android系统中,可以并发的读/写文件,甚至两个线程可以同时对同一个文件进行读/写操作。还可以序列化一个对象到文件系统中的同时在另一个进程中恢复这个对象 。关键代码如下:
文件共享的方式要注意并发的问题,考虑使用线程同步来限制多个线程的写操作。
//MainActivity.java
private void persistToFile() {
new Thread(new Runnable() {
@Override
public void run() {
User user = new User(1, "hello", true);
File dir = new File(getFilesDir().getAbsolutePath() + File.separator + "User");
if (!dir.exists())
dir.mkdir();
File cacheFile = new File(getFilesDir().getAbsolutePath() + File.separator + "User" + File.separator + "usercache");
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(cacheFile));
objectOutputStream.writeObject(user);
Log.d("MainActivity", "persist user: " + user);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
//SecondActivity
private void recoverFromFile() {
new Thread(new Runnable() {