-
2022-01-11 16:46:03
1.单例和静态成员失效
2.线程同步机制失效,每个进程有自己的线程锁。
3.SharedPreferences可靠性下降,不支持并发写,会出现脏数据。
4.Application多次创建,不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application实例,自定义Application时生命周期会混乱。
更多相关内容 -
Android 多进程看这里就够了
2021-05-14 13:51:54在Android中使用多进程只有一种方法,就是在给四大组件在AndroidManifest中指定android:process属性。(有一种非常规的方法: 通过JNI在native层去fork一个新的进程) 代码如下 <activity android:name=".task....开启多进程模式
在Android中使用多进程只有一种方法,就是在给四大组件在AndroidManifest中指定android:process属性。(有一种非常规的方法:
通过JNI在native层去fork一个新的进程) 代码如下<activity android:name=".task.TasksActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".addedittask.AddEditTaskActivity" android:process=":remote"/> <activity android:name=".taskdetail.TaskDetailActivity" android:process="com.ljh.mytodo.remote"/>
设置android:process属性时,要注意:如果是android:process=”:deamon”,以:开头的名字,表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程
上述代码创建了三个进程:
进程1: com.ljh.mytodo
进程2: com.ljh.mytodo:remote
进程3: com.ljh.mytodo.remote使用多进程会造成的问题
1.静态成员和单例模式失效。
Android 为每一个进程分配一个独立的虚拟机,不同虚拟机在内存分配上有不同的地址空间,这就导致多进程下访问同一个类的对象会产生多分副本。所以在一个
进程中修改某个值,只会在当前进程有效,对其他进程不会造成任何影响。
2.线程同步失效。
因为多进程的内存地址空间不同,锁的不是同一个对象,所以不管是锁对象还是锁全局对象都无法保证线程同步。
3.SharedPreference的可靠性下降。
因为SharedPrefercences底层通过读写xml实现,并发读写显示不是安全的操作,甚至会出现数据错乱。
4.Application会多次创建。
默认情况下,应用拥有一个主进程。组件被指定新进程之后,系统在启动这个组件的时候,是先创建这个进程,再创建该组件。打印出进程名称办法:重载Application类的onCreate方法即可。多进程优化
- 针对Application的onCreate中获取进程id 来判断不同的进程
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //获取进程Id int pid = android.os.Process.myPid(); Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根据进程id获取进程名称 String pName = getProcessName(this,pid); if("com.xyy.processtest".equals(pName)){ //处理该进程的业务 } } } public String getProcessName(Context cxt, int pid) { ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); if (runningApps == null) { return null; } for (RunningAppProcessInfo procInfo : runningApps) { if (procInfo.pid == pid) { return procInfo.processName; } } return null; }
2、 针对静态成员的失效:
使用Intent或者aidl等进程通讯方式传递内容,不能使用静态或者单例模式。3、 针对文件共享问题:
多进程情况下会出现两个进程在同一时刻访问同一个数据库文件的情况。这就可能造成资源的竞争访问,导致诸如数据库损坏、数据丢失等。
在多线程的情况下我们有锁机制控制资源的共享,但是多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现。解决方法就是多进程
的时候不并发访问同一个文件,比如子进程涉及到操作数据库,就可以考虑调用主进程进行数据库的操作。IPC方式的优缺点和适用场景
名称 优点 缺点 适用场景 Bundle 简单易用 只能传输Bundle支持的数据类型,或者序列化的数据,大小有限制,使用的是arrayMap存储数据 四大组件间的进程间通信 文件共享 简单易用 不适合高并发场景,并且无法做到进程间的即时通信 无并发访问情形,交换简单的数据实时性不高的场景 AIDL 功能强大,支持一对多并发通信,支持实时通信 使用稍复杂,需要处理好线程同步 一对多通信,且有RPC需求 Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 低并发的一对多即时通信,无RPC需求,或者无需返回结果的RPC需求 ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间的数据共享 Socket 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 实现细节稍微有点繁琐,不支持直接的RPC 网络数据交换 -
安卓多进程
2016-12-09 14:13:03安卓多进程 -
Android开发中多进程共享数据简析
2020-09-02 13:09:00主要为大家简单分析Android开发中多进程共享数据,怎么做才能让这两边共享数据,感兴趣的小伙伴们可以参考一下 -
Android多进程时Application初始化问题,大坑
2021-06-08 04:51:55后来冷静下来分析一下,才发现有一些第三方组件,比如百度推送之类的,它们是单独开了一个进程,那么每个进程会自己初始化自己的Application,那自然onCreate方法会多次执行。准确的说就是你的...之前在做项目时,遇到一个大坑,就是我的APP 的Application 的onCreate方法,竟然执行了好几次,这就导致我在onCreate里面做了一些初始化的操作被重复执行了,导致奇怪的bug产生。后来冷静下来分析一下,才发现有一些第三方组件,比如百度推送之类的,它们是单独开了一个进程,那么每个进程会自己初始化自己的Application,那自然onCreate方法会多次执行。准确的说就是你的APP里有多少个进程,就会初始化多少次Application 。
但是有的东西就是只需要在Application 的onCreate 里只初始化一次。那怎么解决呢?看代码:
public class MyApplication extends Application {
private final static String PROCESS_NAME = "com.test";
private static MyApplication myApplication = null;
public static MyApplication getApplication() {
return myApplication;
}
/**
* 判断是不是UI主进程,因为有些东西只能在UI主进程初始化
*/
public static boolean isAppMainProcess() {
try {
int pid = android.os.Process.myPid();
String process = getAppNameByPID(MyApplication.getApplication(), pid);
if (TextUtils.isEmpty(process)) {
return true;
} else if (PROCESS_NAME.equalsIgnoreCase(process)) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return true;
}
}
/**
* 根据Pid得到进程名
*/
public static String getAppNameByPID(Context context, int pid) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
return processInfo.processName;
}
}
return "";
}
@Override
public void onCreate() {
super.onCreate();
myApplication = this;
if (isAppMainProcess()) {
//do something for init
}
}
}
这样就保证了可以只初始化一次。
===============================
如果你觉得帮到了你,请给作者打赏一口饭吃:
-
android多进程中静态变量是否共享
2021-03-03 14:41:37在android中多进程是指一个应用中存在多个进程的情况。 在Android中使用多进程只有一种方法,就是在AndroidMenifest中指定android:process属性。 所谓的进程就是一个jvm虚拟机。jvm虚拟机讲内存分为四大区, 其中...在android中多进程是指一个应用中存在多个进程的情况。
在Android中使用多进程只有一种方法,就是在AndroidMenifest中指定android:process属性。所谓的进程就是一个jvm虚拟机。jvm虚拟机讲内存分为四大区,
其中方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
因此静态变量不同进程间是不能共享的,保持两份。 -
Android多进程总结一:生成多进程(android:process属性)
2018-11-09 10:58:06前言 正常情况下,一个apk启动后只会运行在一个进程中,其进程名...但是如果需要将某些组件(如Service,Activity等)运行在单独的进程中,就需要用到android:process属性了。我们可以给android的组件设置android:p... -
Android多进程通讯AIDL传递Parcelable对象
2017-07-05 17:42:24Android多进程通讯AIDL传递Parcelable对象 -
Android多进程的实现
2019-05-20 11:39:01一般,一个app只有一个进程,但会有多个线程,比如UI主线程,各种网络请求的子线程。 但是,一些大型的app,比如QQ,会有多个进程!刚通过top命令,看了一下QQ运行时的进程: 10644 u0_a130 20 0 12% S 57 1425816K ... -
Android多进程详解
2018-09-19 20:43:42此文档详细介绍了Android多进程的使用场景,以及多进程使用中的注意事项。 -
Android多进程模式
2021-06-04 04:18:48在Android中说多进程一般是指一个应用中存在多个进程,在Android中使用多进程只有一种方法:给四大组件在AndroidMenifest中指定android:process属性,除此之外别无他法(通过JNI在native层去fork一个进程也可以,不... -
Android 多进程的利弊分析
2018-03-26 23:26:41多进程的使用方法:Android多进程概念:一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程... -
Android 多进程、进程间通信(IPC)的几种方式
2021-02-13 15:01:04在一个应用中启动多个进程 例如:将自己封装的CommonWebViewActivity在一个单独的进程中启动 使用android:process <activity android:name=".activity.CommonWebViewActivity" android:process=":webview" ... -
Android 多进程资料总结
2021-01-05 05:32:26网上说多进程的文章很多,不过基本都是在讨论很深的东西,这是需要去专研的,而我是来这篇是用来偷懒的(应用层次),记录的都是自己对多进程的理解,方便以后用到的时候来偷懒,如果有错,请指教,小小程序员万分... -
Android多进程通讯AIDL实现客户端回调
2017-07-06 15:44:19Android多进程通讯AIDL实现客户端回调 -
Android多进程间采用AIDL方式进行通信
2020-08-27 16:46:44主要为大家详细介绍了Android多进程间采用AIDL方式进行通信,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Android多进程实现及常见问题
2016-12-28 14:23:07Android多进程实现及常见问题 1、为什么需要多个进程? 默认情况下,一个Android应用中所有的组件都会运行在以包名为进程名的单个进程中,但是由于Android自身平台的一些限制或者多进程固有的一些好处,导致很多... -
tray:具有多进程支持的Android的SharedPreferences替代
2021-05-05 07:58:14Google甚至弃用了多进程支持,因为它从来都不可靠 托盘是一种由支持的显式跨进程数据管理方法。 托盘还提供了高级API,通过升级和迁移机制,它可以非常轻松地访问和维护您的数据。 欢迎使用SharedPreferences 2.0... -
安卓多进程与进程间通信
2018-07-10 20:52:261、安卓单进程的概念 一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问... -
Android 多进程Debug 记录
2019-09-21 19:05:361、为什么会用到多进程debug 为了分担主进程内存压力,将三方webview页面独立到其他进程。这样做虽然分担的内存压力但是造成了debug 其他进程代码困难。现对debug过程记录下,方便以后查看。 1)场景如下 现有两个... -
浅谈Android多进程APP的优势
2019-06-27 17:19:30浅谈一下Android多进程APP的优势,至少有以下三点: 1.享受更多的资源 Android系统底层是Linux,每一个进程能够使用的系统资源都是有上限的,例如内存。多进程意味着更多的内存可供使用。如果你需要实现的业务功能... -
Android中应用多进程的整理总结
2021-01-05 08:48:24本文将试图对于Android中应用多进程做一些整理总结。 android:process 应用实现多进程需要依赖于android:process这个属性 适用元素:Application, Activity, BroadcastReceiver, Service, ContentProvider。 通常... -
android多进程通信二
2016-09-08 11:50:19android多进程通信 -
Android开启多进程及进程间通信的几种方式
2021-03-31 10:16:41文章目录进程开启多进程多进程带来的问题进程间通信 进程 首先来看进程的定义: **进程是指一个执行单元,在PC和移动设备上是指一个程序或者一个应用。**而线程是CPU调度的最小单元,同时线程是一种有限的系统资源,... -
android多进程通信的几种方式一
2016-09-07 23:29:25说起android中多进程通信,大家首先想到的是aidl,今天我们就来复习一下aidl在多进程之间的通信,根据官方文档,aidl全拼是Android Interface Definition Language,安卓接口定制语言.作用就是在安卓设备中多个... -
实例说明 Android 多线程、多进程与全局变量之间的关系
2022-02-15 14:41:121.线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程之间的通信更方便,同一进程下的线程共享全局变量、静. -
android多进程操作sp问题
2020-03-03 23:29:40假如你的应用拥有多个进程,比如有两个进程,分别叫进程A和进程B,你定义了一个sp文件叫apkInfo用于存储应用的一些信息。A进程和B进程都需要存取应用信息,所以你在A进程和B进程都会操作apkInfo这个sp文件,这样会... -
Android 多进程导致 Application 重复创建问题
2020-03-12 13:33:39背景 一般情况下,一个应用程序就一个进程,这个进程的名称就是...一个进程情况下,Application 的 onCreate 方法只会执行一次,但如果应用中采用多进程方式,onCreate 方法会执行多次。 解决方案 获取当前运行进程... -
Android——多进程
2021-06-24 17:24:05之前我们了解了 : -----------------------------------Java——多线程浅析. -----------------------------------Android——Handler详解 ------------------------...让我们继续看看Android多进程: 1. 概述 默认情况