1.如何开启:

给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest.xml中指定"android:process"属性可以在应用内实现多进程。

如果进程名以":"开头,说明该进程属于私有进程,其他应用的组件不可以和它跑在同一个进程中;

如果进程名不以":"开头,则属于全局进程,其它应用通过ShareUID方式可以和它跑在同一个进程中。

2.注意两个进程之间的数据:

Android为每个应用分配了一个独立的虚拟机,或者可以说每个进程都有一个独立的虚拟机,不同的虚拟机在内存分配上有不同的内存地址,这就导致不同的虚拟机访问同一个类的对象会产生多份副本。

所以,所有运行在不同进程中的四大组件,只要他们之间通过内存来共享数据,都会共享失败。

一般来说,使用多进程会有以下影响:

<1>.静态成员和单例模式完全失效

<2>.线程同步机制完全失效(因为都不是一块内存了,所以不同进程锁都不是同一个对象)

<3>.SharePreferences的可靠性下降(因为SharePreferences不支持两个进程同时进行写操作,会导致一定几率的数据丢失,这是因为SharePreferences底层是通过读写xml来实现的)

<4>.Application会多次创建

3.进程间通信

进程获取的内存空间是一块抽象的内存,然后会映射到实际的某一块物理内存,因此,每个进程都无法访问其他进程在内存里面数据。

不同进程之间的通信,就意味着在两块不同的物理内存间传递数据

当然,原生的数据,比如int或者String数据都是可以传递的,但是对象数据是不可以的

在Android中,最有特色的进程间通信方式就是Binder了,还可以支持Socket(既可以在两个设备之间Socket通信,也可以在一个设备的不同进程间通信)。

4.Android IPC机制:
(1).使用Bundle:一个进程启动另一个进程中的Activity,Service,BroadCastReceiver,那么可以在Bunlde中添加信息,并通过Intent传递
注意:传输的数据必须能够序列化,比如基本类型,实现了Serializable或者Parcelable接口的对象,一些Android支持的特殊对象
(2).文件共享:进程A把数据写入文件,进程B去读取文件内容
注意:<1>.适合于数据同步要求不高的情况,要注意处理好并发读写的问题
<2>.进程A写入一个对象,进程B读取出来一个对象,虽然两个对象的内容一致,但是注意两个对象本质上其实并不相同(因为使用了Serializable序列化对象,以及反射,反射导致了两个对象其实并不相同)
<3>.虽然SharePreferences也是文件的一种,底层采用xml文件,目录位于/data/data/package name/shared_prefs目录下,但是由于系统对它的读写有一定的缓存策略,即在内存中会有一份SharePreferences文件的缓存,因为在多进程下,系统对它的读写很不靠谱。(虽然在API Level>=11即Android 3.0可以通过Context.MODE_MULTI_PROCESS属性来实现SharedPreferences多进程共享)
1 SharedPreferences myPrefs = context.getSharedPreferences(MY_FILE_NAME, Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);

一旦我们设置了这个Flag,每次调用Context.getSharedPreferences 的时候系统会重新从SP文件中读入数据,因此我们在使用的时候每次读取和存入都要使用Context.getSharedPreferences 重新获取SP实例。即使是这样,由于SP本质上并不是多进程安全的,所以还是无法保证数据的同步,因此该方法我们并没有使用,我们也不推荐使用。

    由于SP不是多进程安全的,可以使用一个多进程安全的开源项目:Tray  (但是需要的minsdk是15)

 1 // create a preference accessor. This is for global app preferences.
 2 final AppPreferences appPreferences = new AppPreferences(getContext()); // this Preference comes for free from the library
 3 // save a key value pair
 4 appPreferences.put("key", "lorem ipsum");
 5
 6 // read the value for your key. the second parameter is a fallback (optional otherwise throws)
 7 final String value = appPreferences.getString("key", "default");
 8 Log.v(TAG, "value: " + value); // value: lorem ipsum
 9
10 // read a key that isn't saved. returns the default (or throws without default)
11 final String defaultValue = appPreferences.getString("key2", "default");
12 Log.v(TAG, "value: " + defaultValue); // value: default

  (3).ContentProvider是Android官方支持的多进程安全的,参考:Android应用程序组件Content Provider应用实例

  (4).Messager:通过它可以在不同进程间传递Message对象,在Message中放入要传递的数据
(5).AIDL

注意<1>:Messager只能串行处理消息,如果要处理大量的消息的话,还是用aidl

<2>:在AIDL文件中,并不是所有的数据类型都是可以使用的,AIDL只支持以下数据类型

(1).基本数据类型(int、long、char、boolean、double等)

(2).String和CharSequence

(3).List:只支持ArrayList,里面的每个元素都必须能够被AIDL支持

(4).Map:只支持HashMap,里面的每个元素都必须能够被AIDL支持,包括key和value

(5).Parcelable:所有实现了Parcelable接口的对象

(6).AIDL:所有的AIDL接口本身也可以在AIDL文件中使用

转载于:https://www.cnblogs.com/wufeng0927/p/5304448.html

多进程的一些注意事项相关推荐

  1. Android 面试要点

    整个面试题分为三个部分:Java.Android和项目经验. 1 Java技术    1.1 Java基础 对抽象.继承.多态的理解 泛型的作用及使用场景 枚举的特点及使用场景 线程sleep和wai ...

  2. Android面试攻略

    文章背景 在外界看来IT是一个"高薪"的行业,都羡慕不已,熟不知IT也是一个苦逼的行业,每天加班加点,时刻用生命在写代码啊,导致许多程序猿和程序媛们都找不到对象,好不容易有个家庭的 ...

  3. 多线程和多进程的差别(小结)

    非常想写点关于多进程和多线程的东西,我确实非常爱他们.可是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手. 今天最终下了决心,写点东西,以后能够再修修补补也无妨. 一.为何须要多进程( ...

  4. php 多进程 返回值,php多进程

    软件简介 php基于pcntl扩展实现的多进程框架. 有以下几种优点: 1.子进程数量的控制 2.钩子形式的运行子进程,方便代码实现 3.3种不同的方式导入任务(数组输入.运行次数输入.动态加载) 4 ...

  5. 浅谈多进程多线程的选择(转)

    关于多进程和多线程,教科书上最经典的一句话是"进程是资源分配的最小单位,线程是CPU调度的最小单位",这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了 ...

  6. 一文看懂Python多进程与多线程编程(工作学习面试必读)

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...

  7. python列表批量 修改_python实现多进程按序号批量修改文件名的方法示例

    本文实例讲述了python实现多进程按序号批量修改文件名的方法.分享给大家供大家参考,具体如下: 说明 文件名命名方式如图,是数字序号开头,但是中间有些文件删掉了,序号不连续,这里将序号连续起来,总的 ...

  8. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  9. 【原】webpack--loaders,主要解释为什么需要loaders和注意事项

    Why需要loaders? webpack开箱即用只支持JS和JSON两种文件类型,但是比如css.less,还有目前市场上比较新的语法糖jsx,怎么处理呢? 通过Loaders去支持其他文件类型并且 ...

最新文章

  1. java jdk 环境变量配置(window 10 系统)
  2. python【蓝桥杯vip练习题库】ADV-181质因数2(短除法)
  3. 时结果 hive_Hive优化
  4. 个人信息管理系统代码_Thymeleaf+SpringBoot+Mybatis实现的易游网旅游信息管理系统...
  5. Java Short类hashCode()方法及示例
  6. 当年要是早知道这4步框架,我就不会为数据管理发愁了
  7. micropython esp32驱动舵机_PCA9685舵机控制板与MicroPython-ESP32-1Z实验室
  8. 使用xUnit测试验证属性
  9. Oracle MERGE用法
  10. IT职场人生系列之十九:危险职业(中)
  11. linux 用户管理、权限管理
  12. 计算机二进制教案教程,计算机的二进制教案.doc
  13. RFID射频识别技术
  14. Layer2 DAO基础协议Metis与IDO平台Paid Network达成战略合作
  15. 回归方程有效性的检查
  16. while 循环进入死循环?
  17. 向身边优秀的人学习,让自己变得优秀
  18. NYOJ-71 独木舟上的旅行
  19. ios开发中各种版本、设备的区分的代码
  20. Unity 水体浮力的实现

热门文章

  1. 万门大学倒闭了,童哲连夜跑路了
  2. 名校华人教授专门设局诈骗中国留学生,4年吸金超百万美元,连亲戚也没放过...
  3. 橡鹭科技获源码资本亿元融资,美团原核心高管加盟,发力服务机器人
  4. 「思想钢印」成真!33位中美科学家最新成果:用光成功改变大脑认知
  5. 写论文前先交提纲,没准儿提前就被顶刊接收!Nature:论文还没写,就知道是好研究...
  6. 这年头连人用脑机接口信号都能无线传输了,瘫痪者可在家轻松上网看视频
  7. 清华《摸鱼学导论》开课啦!1000多学子在线摸鱼,开课老师为大一新生
  8. 3D打印火箭发动机真被做出来了!首次地面全周期点火实测,发射报价不到猎鹰9的五分之一...
  9. 英特尔90亿美元卖掉「起家业务」,SK海力士接盘
  10. Scikit-learn新版本发布,一行代码秒升级