引言
IPC(Inter-Process Communication)机制,即进程间通信。在操作系统中都存在进程间通信的方式,比如在Andorid中最常见的情况就是天猫跳转到支付宝,第三方应用跳转到微信,分享XX到朋友圈,某某应用跳转到浏览器,这些都是很明显的进程间通信。那么什么是进程?进程,是指计算机中已运行的程序。比如Windows系统中任务管理器看到的各个程序是进程,在Android系统中查看正在运行的应用也是一个个进程。
上述的种种例子几乎都是多应用的情况。当然,Android中的一个应用也是可以多进程运行的。因此,IPC机制可以分为多个应用间的进程通信或者是一个应用的多个进程通信,这两种情况本身原理是一致的,我们就从一个应用中多进程例子来研究下Android多进程模式。
开启多进程
在AndroidMenifest中四大组件指定android:process属性即可。
- 私有进程 android:process=":xxx"
- 全局进程 android:process="包名.xxx"
Android中的IPC方式
Bundle机制
Android中特有的方式,Intent可以传递Bundle数据。
AndroidMenifest中在SecondActivity中配置android:process=":remote";
MainActivity作为LAUNCHER,点击按钮跳转到SecondActivity。User2实现了Parcelable接口。
// MainActivity
private void putIntentData(){
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
User2 user2 = new User2(1, "小黄", true,
new Book(123, "Hello World"));
bundle.putParcelable("user2", user2);
Log.d("TAG "+getClass().getSimpleName(), "user2 hashCode:"+user2.hashCode());
Log.d("TAG "+getClass().getSimpleName(), "user2 : "+user2.toString());
Log.d("TAG "+getClass().getSimpleName(), "bundle : "+bundle.hashCode());
intent.putExtra("bundle", bundle);
startActivity(intent);
}
//SecondActivity
private void getIntentData(){
Bundle bundle = getIntent().getExtras().getBundle("bundle");
User2 user2 = bundle.getParcelable("user2");
Log.d("TAG "+getClass().getSimpleName(), "user2 hashCode:"+user2.hashCode());
Log.d("TAG "+getClass().getSimpleName(), "user2 : "+user2.toString());
Log.d("TAG "+getClass().getSimpleName(), "bundle : "+bundle.hashCode());
}
运行结果:
1.png 2.png
文件共享
两个进程通过对同一个文件读写操作来交换数据。
// MainActivity
private void persistToFile(){
new Thread(new Runnable() {
@Override
public void run() {
File dir = new File(MyUtils.DIRECTORY_PATH);
if(!dir.exists()){
boolean tag = dir.mkdirs();
Log.e("TAG" , "mkdirs: "+tag);
}
ObjectOutputStream out = null;
try {
User user = new User(1, "xiaoming", true);
out = new ObjectOutputStream(
new FileOutputStream(MyUtils.FILE_PATH));
out.writeObject(user);
Log.d("TAG "+getClass().getSimpleName(), "user hashCode:"+user.hashCode());
Log.d("TAG "+getClass().getSimpleName(), "user : "+user.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
MyUtils.close(out);
}
}
}).start();
}
//SecondActivity
private void recoverFromFile(){
new Thread(new Runnable() {
@Override
public void run() {
ObjectInputStream in =null;
try {
File cacheFile = new File(MyUtils.FILE_PATH);
if(cacheFile.exists()){
in = new ObjectInputStream(
new FileInputStream(MyUtils.FILE_PATH));
User newUser = (User) in.readObject();
Log.d("TAG "+getClass().getSimpleName(), "newUser hashCode:"+newUser.hashCode());
Log.d("TAG "+getClass().getSimpleName(), "newUser : "+newUser.toString());
}else{
Log.e("TAG "+getClass().getSimpleName(), "file is absence.");
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
MyUtils.close(in);
}
}
}).start();
}
运行结果:
3.png 4.png
Android中IPC其他方式
Android中IPC其他方式Messenger、AIDL、ContentProvider、Socket下节讲述。
网友评论