小议Android多进程以致Application多次初始化.docx

上传人:牧羊曲112 文档编号:3477639 上传时间:2023-03-13 格式:DOCX 页数:4 大小:37.40KB
返回 下载 相关 举报
小议Android多进程以致Application多次初始化.docx_第1页
第1页 / 共4页
小议Android多进程以致Application多次初始化.docx_第2页
第2页 / 共4页
小议Android多进程以致Application多次初始化.docx_第3页
第3页 / 共4页
小议Android多进程以致Application多次初始化.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《小议Android多进程以致Application多次初始化.docx》由会员分享,可在线阅读,更多相关《小议Android多进程以致Application多次初始化.docx(4页珍藏版)》请在三一办公上搜索。

1、小议Android多进程以致Application多次初始化小议Android多进程以致Application多次初始化 最近遇到一个bug,当应用加了多进程后,比如总共进程数为N,会出现在startService时onStartCommand方法会被重复调用次的奇怪现象。 祸起 最近遇到两个模块互不相干却受到影响的奇怪问题,一个push模块和一个DaemonProcess模块在一起后,会出现如下现像的问题当DaemonProcess为应用加了多进程后,比如总共进程数为N,会出现push模块在startService时onStartCommand方法会被重复调用次的奇怪现象。 寻踪 因为我们用

2、的是Jpush的原因,一开始以为是Jpush,但最后发现是因为引用多进程的原因 再寻找下去发现 调用一次startService时onStartCommand运行多次 而这两者有何关系呢 举证 Demo测试: 首先在Application中申明四个service,其中ServiceA和ServiceC都各自另开一个进程,ServiceB和ServiceD都在主进程中,AndroidManifest.xml如下: 此时在Application中启动四个Service startService(new Intent(this, ServiceA.class); startService(new I

3、ntent(this, ServiceB.class); startService(new Intent(this, ServiceC.class); startService(new Intent(this, ServiceD.class); 同时各Service打下如下log: public static final String TAG = ServiceB.class.getSimpleName; Override public void onCreate super.onCreate;Log.i(TAG,onCreate + pid: + android.os.Process.myP

4、id); Override public int onStartCommand(Intent intent, int flags, int startId) Log.i(TAG,onStartCommand + pid: + android.os.Process.myPid); return super.onStartCommand(intent, flags, startId); 在log中会发现 onCreate方法各执行一遍,这个是正常的,但onStartCommand方法目前执行了三遍,因为共3个进程。 真相 1. N个进程,N个独立的虚拟机,Application被N次初使化 2.

5、处理时应该在Application中分进程初始化数据 剑谱 如下解决方案 mProcessName = getCurrentProcessName(this); Log.i(TAG, onCreate + getProcessName: + mProcessName); Log.i(TAG, init_all_process); if(TextUtils.equals(mProcessName, getPackageName) Log.i(TAG, init_main_process); else if(TextUtils.equals(getProcessName(this, android

6、.os.Process.myPid), com.hujiang.test.servicea) Log.i(TAG, init_a_process); else if(TextUtils.equals(getProcessName(this, android.os.Process.myPid), com.hujiang.test.servicec) Log.i(TAG, init_c_process); 获取当前进程名称: private String getCurrentProcessName(Context context) int pid = android.os.Process.myPid; ActivityManager mActivityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager .getRunningAppProcesses) if (appProcess.pid = pid) return appProcess.processName; return null; 分别在自己的进程中初始化

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号