进程通信:Binder、文件共享、AIDL、Messenger、ContentProvider、Soket
在正式介绍进程见通信之前,我们必须要理解Android中的多进程模式。首先,在Android中使用多进程只有一种方法那就是给四大组件设置android:process属性,我们可以轻易地开启多进程模式(还有一种多进程方法,那就是通过JNI在native层去fork一个新的进程,但是这种方法属于特殊情况,也不是常用的创建多进程的方式,因此我们暂时不考虑这种方式)。
1.Activity设置进程
运行demo跑起来之后,可以通过 adb shell ps | 应用包名 如图
三个进程分别为:13423、13805、14008 可以理解为三个应用程序,为什么我要这样说呢?下面请看代码
1.首先创建一个UserManager类
public class UserManager {
public static int sUserId =1;
}
2.在MainActivity中的OnCreate方法中重新进行 sUserId变量进行赋值,然后跳转到SecondActivity界面中重新打印 sUserId
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UserManager.sUserId =2;
Log.e("sUserId"," MainActivity "+UserManager.sUserId+" ");
}
public void second(View view){
startActivity(new Intent(this,SecondActivity.class));
}
接下跳转到SecondActivity界面当中在打印一遍sUserId变量看看会输出什么请看代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.e("sUserId"," SecondActivity "+UserManager.sUserId+" ");
}
public void third(View view){
startActivity(new Intent(this,ThirdActivity.class));
}
上述问题出现的原因是MainActivity和SecondActivity都是运行在单独的一个进程中,我们知道Android为每一个应用分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,可以理解成MainActivity进程中有一个UserManager类,SecondActivity进程中也有一个UserManager类,在MainActivity 进程中只会修改当前进程中地址指向sUserId变量,修改不了SecondActivity进程中sUserId变量。