Android中Application的onCreate多次调用的原因和解决办法
2016-05-11 15:03
260 查看
在做"个推"时发现官方文档中有这么一个注释:
该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。
解释一下,每个android应用都要运行在一个虚拟机上,”个推“采用Service和后台服务器通信进行通信,于是和原本的Activity就形成了多进程。一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,application对象的onCreate方法就会执行多次,所以为了保证只初始化一次,就必须做出区分的处理的(“个推”中提到的在Activity或Service中初始,这种做法个人认为也是存在多次初始化的风险的);
进程名是通过Manifest.xml中的"android:process"属性设置的,因此可以在application的onCreate方法中通过pid获取processName,再做进一步的判断(跟android:process的值进行判断)使得相关初始化代码仅执行一次。
在application中添加如下代码:
该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。
解释一下,每个android应用都要运行在一个虚拟机上,”个推“采用Service和后台服务器通信进行通信,于是和原本的Activity就形成了多进程。一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,application对象的onCreate方法就会执行多次,所以为了保证只初始化一次,就必须做出区分的处理的(“个推”中提到的在Activity或Service中初始,这种做法个人认为也是存在多次初始化的风险的);
进程名是通过Manifest.xml中的"android:process"属性设置的,因此可以在application的onCreate方法中通过pid获取processName,再做进一步的判断(跟android:process的值进行判断)使得相关初始化代码仅执行一次。
在application中添加如下代码:
public void onCreate() { String processName = getProcessName(this, android.os.Process.myPid()); if(processName.endWidth("自行替换为所需进程名")) { initXXX(); } } public static String getProcessName(Context cxt, int pid) { <span style="white-space:pre"> </span>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; }
相关文章推荐
- Android自定义控件和自定义属性
- Android使用ZBar扫描二维码/条形码(实例)+常见问题汇总
- WebView 无法加载html上传文件的控件
- Android强制设置横屏或竖屏
- Android 消息传递机制分析
- Android Drawable图标生成工具
- 支付宝,微信,银联集成例子 (BUG是有的)
- Android测试环境搭建(win7)
- Android Activity的生命周期分析
- 粒子、地图
- 事件
- Android listview、gridView 只显示一行
- iOS开发之判断用户是否打开APP通知开关,看我就够了。
- 微信支付 java 服务端demo (v3版本app支付 springMVC框架中)
- iOS多线程开发
- Android签名制作,keystore文件转换格式为pk8+x509.pem
- Android关于身份证号码的验证
- Android通用流行框架大全
- UIAppearance 基本使用
- RecyclerView 添加 Footer and Header