Android多进程时Application初始化问题

Posted cps666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.  


Android全局变量:Application

在android开发过程中,总是需要用到一些贯穿整个应用的变量,即全局变量。然后我们可以通过自定义的Application进行设置。
我们的app就是一个application,启动application时,系统会创建一个进程ID,所有的Activity就会在此进程上运行。可以在Application创建时初始化全局变量,同一个应用的所有Activity都可以访问这些全局变量,只需要调用Context的getApplicationContext或者Activity的getApplication方法来获得一个application对象,再做出相应的处理。

1.自定义MyApplication继承于Application
/**
 * 通过Application设置全局变量
 */
public class MyApplication extends Application 
    private Boolean isEvalCenter;
    @Override
    public void onCreate() 
        super.onCreate();
        setEvalCenter(false); //初始化全局变量
    
    
    public void setEvalCenter(Boolean newEvalCenter) 
        isEvalCenter = newEvalCenter;
    

    public Boolean getEvalCenter() 
        return isEvalCenter;
    


2.在清单文件AndroidManifest.xml中配置

3.在fragment或activity中使用
// MyApplication app = (MyApplication) getActivity().getApplication(); //fragment中
 MyApplication app = (MyApplication) getApplication();  //在activity中
 app.setEvalCenter(true);  //设值
 Boolean isEvalCenter = app.getEvalCenter(); //取值

以上是关于Android多进程时Application初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

Android全局变量:Application

Android Application 两个进程只初始化一个

Android Application 两个进程只初始化一个

android之多进程下Application.getSharedPreferences的取值

Android 启动流程

Android面试题整理三