Android多进程时Application初始化问题
原文地址 blog.csdn.net
之前在做项目时,遇到一个大坑,就是我的APP 的Application 的onCreate方法,竟然执行了好几次,这就导致我在onCreate里面做了一些初始化的操作被重复执行了,导致奇怪的bug产生。后来冷静下来分析一下,才发现有一些第三方组件,比如百度推送之类的,它们是单独开了一个进程,那么每个进程会自己初始化自己的Application,那自然onCreate方法会多次执行。准确的说就是你的APP里有多少个进程,就会初始化多少次Application 。
但是有的东西就是只需要在Application 的onCreate 里只初始化一次。那怎么解决呢?看代码:
1. public class MyApplication extends Application {
2. private final static String PROCESS_NAME = "com.test";
3. private static MyApplication myApplication = null;
5. public static MyApplication getApplication() {
6. return myApplication;
7. }
9. /**
10. * 判断是不是UI主进程,因为有些东西只能在UI主进程初始化
11. */
12. public static boolean isAppMainProcess() {
13. try {
14. int pid = android.os.Process.myPid();
15. String process = getAppNameByPID(MyApplication.getApplication(), pid);
16. if (TextUtils.isEmpty(process)) {
17. return true;
18. } else if (PROCESS_NAME.equalsIgnoreCase(process)) {
19. return true;
20. } else {
21. return false;
22. }
23. } catch (Exception e) {
24. e.printStackTrace();
25. return true;
26. }
27. }
29. /**
30. * 根据Pid得到进程名
31. */
32. public static String getAppNameByPID(Context context, int pid) {
33. ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
34. for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
35. if (processInfo.pid == pid) {
36. return processInfo.processName;
37. }
38. }
39. return "";
40. }
42. @Override
43. public void onCreate() {
44. super.onCreate();
46. myApplication = this;
48. if (isAppMainProcess()) {
49. //do something for init
50. }
51. }
52. }