IPC多进程模式学习笔记

2018-03-24  本文已影响0人  android_noob

进程通信: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));

}

可以看到sUserId变量已经修改成2

接下跳转到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));

}

可以看到 sUserId 打印结果为1

上述问题出现的原因是MainActivity和SecondActivity都是运行在单独的一个进程中,我们知道Android为每一个应用分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,可以理解成MainActivity进程中有一个UserManager类,SecondActivity进程中也有一个UserManager类,在MainActivity 进程中只会修改当前进程中地址指向sUserId变量,修改不了SecondActivity进程中sUserId变量。

上一篇下一篇

猜你喜欢

热点阅读