Android多进程模式
来源:互联网 发布:js替换全部字符串 编辑:程序博客网 时间:2024/06/13 07:50
IPC(Inter-Process Communication),含义为进程间通信,也就是指两个进程之间进行数据交换的过程。
线程与进程的概念:
线程:CPU调度的最小单元
进程:一般指一个执行单元
二、开启多进程模式
这里的多进程模式讨论的是一个应用存在多个进程的情况;
应用开启多进程模式有两种方法:
第一种:只需在AndroidMenifest文件中为四大组件指定android:process属性
第二种:通过JNI在native层去fork一个新的进程
以第一种方法为例:
<activity android:name="com.ryg.chapter_2.MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category._LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process=":remote" /> <activity android:name=".ThirdActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process="com.ryg.chapter_2.remote" />
分析:
当前包名为“com.ryg.chapter_2”;
当SecondActivity启动时,会创建进程名为“com.ryg.chapter_2:remote”的进程;
当ThirdActivity启动时,会创建进程名为”com.ryg.chapter_2.remote“的进程;
同时入口MainActivity,没有为它指定process属性,则会运行在默认进程中,默认进程名为包名。
SecondActivity与ThirdActivity的进程名命名方式不同:前者是简写的命名方式,”:“的含义是指当前进程名前面附加上当前的包名;后者是完整的命名方式,不会附加包名信息。
开启多进程模式很简单,但是它会造成如下问题:
1、静态成员和单例模式失效
2、Application会多次创建
3、线程同步机制完全失效(这里指的是多进程间的线程同步)
4、SharedPreferences的可靠性下降
Android为每一个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,也就导致了同一类对象会有多份副本,所以运行在不同进程间的四大组件不能通过内存来共享数据;这就解释了第一种问题出现的原因。
当一个组件在一个新的进程中启动的时候,由于系统要新的进程,并为其分配独立的虚拟机,这个过程其实就是启动一个应用的过程,那么自然会重新创建新的Application;这就解释了第二种问题出现的原因。
不同的进程有不同的内存地址,那么不管是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象;这就解释了第三种问题出现的原因。
SharedPreferences是通过读写XML文件来实现,并发读写有可能出现问题;这就解释了第四种问题出现的原因。
- Android多进程模式
- Android多进程模式
- Android多进程模式
- Android中的多进程模式
- android中的多进程模式
- android 中的多进程模式
- Android中的多进程模式
- Android中的多进程模式
- Android IPC机制多进程模式
- 6.Android中的多进程模式
- android中的多进程模式(IPC)
- Android IPC机制之开启多进程模式
- IPC机制---02 Android中的多进程模式
- PID,UID,sharedUserId以及Android开启多进程模式
- Android开发艺术探索笔记(4)- 多进程模式
- Android IPC -- 初期(实现多进程模式)
- Android IPC简介之(多进程模式)初识
- java多进程模式
- C/C++输入输出
- java乐高程序设计
- 顺序表C++版
- ViewPager实现图片轮播
- 微信公众号开发环境ngrok 服务搭建
- Android多进程模式
- 【JEECG Docker安装】Docker启动报错
- Java7并发编程--4.3、运行多个任务并处理结果
- 使用RestTemplate发送post和delete请求
- 深入理解Java内存模型(四)——volatile
- 解决软键盘弹起导致gridview的布局错乱的方法(转载)
- 前端人应该知道的排序知识
- 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
- 链表