以下内容摘抄自作者:任玉刚所著的《Android开发艺术探索》
简介
IPC方式其实有很多,比如在Intent中附加extras来传递信息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外ContentProvider天生就是支持跨进程访问的,还有网络通信,用Socket实现IPC,但它们在使用和侧重点上有很大区别,下面来详细逐个介绍一下。
Bundle
由于Bundle实现了Parcelable接口,所以可以很方便的在不同进程间传输。在四大组件中,Activity、Service、Receiver 这三大组件都支持在Intent中传递Bundle数据。
由于Bundle中需要添加数据,所以这些数据,必须是能够被序列化的数据,如基本类型、实现了Parcelable或Serializable接口的对象、以及一些Android支持的特殊对象,具体支持哪些类型,可以查看Bundle类源码。
如果某计算结果无法被序列化,导致在Bundle中无法添加,那么可以尝试用Bundle先向目标进程传递计算前的数据,在目标进程中再去计算结果。
使用文件共享
共享文件方式就是两个进程通过读写同一个文件数据,来实现进程间通信。
在Windows上,一个文件被加入了排斥锁,将会导致其它进程无法对其进行访问。但是由于Android基于Linux,使其读写可以并发操作且无限制,所以共享文件其实有操作风险。
在文件中,除了可以交换文本信息,也可以将对象序列化保存到文件中,然后在另一个进程中反序列化恢复这个对象。如下示例:
我们在MainActiivty的onResume()中调用如下方法:
private void persistToFile() {
File file = new File("data/data/com.example.onsaveinstancestateteset/SaveFileTest.txt");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
new Thread(new Runnable() {
@Override
public void run() {
try {
FileOutputStream fileStream = new FileOutputStream(file);
User user = new User(1, "hello word", true);
ObjectOutputStream outputStream = new ObjectOutputStream(fileStream);
outputStream.writeObject(user);
fileStream.close();
outputStream.close();
Log.e("MainActivity", "user:" + user.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
然后在SencondActivity中的onResume()调用如下方法:
private void recoverFromFile() {
new Thread(new Runnable()