Android多进程时Application中onCreate执行多次
来源:互联网 发布:数据库恢复模式设置 编辑:程序博客网 时间:2024/05/24 16:13
自己写了一个音视频通讯的SDK,由于做了双进程保活,造成很多代码会执行两次,在日志从发现一个在主进程,另一个在守护进程,逐步寻找,最后发现是Application的OnCreate方法会执行两次。原来是多进程的缘故,导致了Application创建了两次,每个进程都会有一个Application,于是就找到以下解决方法:
主要就是:android:process这个属性,这个属性有什么作用?
在Android的帮助文档中我们可以了解到,一般情况下一个服务没有自己独立的进程,它一般是作为一个线程运行于它所在的应用的进程中。但是也有例外,Android声明文件中的android:process属性却可以为任意组件包括应用指定进程,换句话说,通过在声明文件中设置android:process属性,我们可以让组件(例如Activity, Service等)和应用(Application)创建并运行于我们指定的进程中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.doormaster.doorphone" >//包名<activity android:name=".DMVPhoneService" android:process=":VPhoneProcess"/>//为service开启一个进程
上面就为这个DMVPhoneService单独开启了一个进程com.doormaster.doorphone:VPhoneProcess,前面加:,代表是把这个名字附加到你的包所运行的标准进程名字的后面作为新的进程名称(只不过这个进程为该应用私用,其他应用不能共享)
还有一种,单独命名的进程,以小写字母开头,如下:
<activity android:name=".KeepAliveService" android:process="com.doormaster.alive"/>//为service开启一个不同于应用包名的进程
解决多进程次执行多次onCreate()
如果应用中采用多进程方式,oncreate方法会执行多次,根据不同的进程名字进行不同的初始化。应用判断进程名字进行单独初始化,这要就可以利用进程名根据具体需求,应该加载哪些资源,执行哪些具体逻辑了。
@Override public void onCreate() { super.onCreate(); String processName = getProcessName(this); if (processName!= null) { if(processName.equals("com.doormaster.doorphone")){ //初始化com.doormaster.doorphone以包名为进程名,项目默认的进程 } else if(processName.equals("com.doormaster.doorphone:VPhoneProcess")){ //初始化com.doormaster.doorphone:VPhoneProcess进程 }else if(processName.equals("com.doormaster.alive")){ //初始化com.doormaster.alive进程 }else{ } } } private String getProcessName(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); if (runningApps == null) { return null; } for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) { if (proInfo.pid == android.os.Process.myPid()) { if (proInfo.processName != null) { return proInfo.processName; } } } return null; }
方法总结:这里有两点需要注意
第一就是找错的方法,一定要逐个排查,多用debug调试;
第二就是 在对应的把它们的值和对应的进程在日志中输出,一定要仔细;
第三就是 学会记录和总结,把这个知识点总结并记录下来。
以上如有错误之处,敬请指出纠正,或者需要指导帮忙,可以留言!
CSDN博客:http://blog.csdn.net/kebiiii
- Android多进程时Application中onCreate执行多次
- Android多进程app中Application回调onCreate()方法被执行多次分析及解决
- Android避免多进程Application onCreate中初始化代码执行多次
- 亲自实践:.多进程Application onCreate多次执行
- Android的Application中onCreate执行多次解决方案
- Android的Application中onCreate执行多次解决方案
- Android中多进程方式导致的全局Application的OnCreate多次被调用
- Android中多进程方式导致的全局Application的OnCreate多次被调用
- 记一次诡异的问题:跟多进程多次执行application的onCreate有关
- android的application类中,onCreate()被执行多次的原因及解决方案
- Android中全局Application的onCreate多次调用问题
- Android中全局Application的onCreate多次调用问题
- Android中Application的onCreate多次调用问题
- Android中Application的onCreate调用多次的解决方案
- Android中全局Application的onCreate多次调用问题
- Android中Application的onCreate多次调用问题
- Android中Application的onCreate多次调用问题
- Android中Application的onCreate多次调用问题
- 欢迎来到HelloWorld的世界
- zookeeper window下伪集群
- C++11中std::initializer_list的使用
- HBITMAP
- HTML和css面试题
- Android多进程时Application中onCreate执行多次
- ssh框架org.springframework.dao.InvalidDataAccessApiUsageException错误
- 秋细雨的日课十二条
- 原型模式
- 基于tinyXml2库封装的解析xml的通用类
- 怎么一次性删除PPT中所有动画效果?
- SS选择性搜索算法
- javaSE-Day4-This
- 夜灵的Html笔记Day11——弹性盒子布局