美文网首页
Application多次初始化问题

Application多次初始化问题

作者: 被时光移动的城 | 来源:发表于2020-06-15 20:00 被阅读0次

在做接口优化的时候发现APP 的Application 的onCreate方法被执行了好几次,导致在onCreate里面做了一些初始化的操作被重复执行了多次,打断点无果,但抓包却真的存在,这令我十分尴尬。。。事后才发现有一些第三方组件,它们是单独开了一个进程
解决办法根据进程名进行初始化过滤,Application 的onCreate 里只初始化一次。
解决方法一:
判断当前进程是主进程才执行初始化代码.
Android避免多进程Application onCreate中初始化代码执行多次

if (TextUtils.equals(getCurrentProcessName(this), getPackageName())) {
         init();//判断成功后才执行初始化代码
}
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;
}

解决方法二:
内容摘自:Android多进程时Application初始化问题,大坑

public class MyApplication extends Application {
    private final static String PROCESS_NAME = "com.test";
    private static MyApplication myApplication = null;
 
    public static MyApplication getApplication() {
        return myApplication;
    }
 
    /**
     * 判断是不是UI主进程,因为有些东西只能在UI主进程初始化
     */
    public static boolean isAppMainProcess() {
        try {
            int pid = android.os.Process.myPid();
            String process = getAppNameByPID(MyApplication.getApplication(), pid);
            if (TextUtils.isEmpty(process)) {
                return true;
            } else if (PROCESS_NAME.equalsIgnoreCase(process)) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return true;
        }
    }
 
    /**
     * 根据Pid得到进程名
     */
    public static String getAppNameByPID(Context context, int pid) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == pid) {
                return processInfo.processName;
            }
        }
        return "";
    }
 
    @Override
    public void onCreate() {
        super.onCreate();
 
        myApplication = this;
 
        if (isAppMainProcess()) {
            //do something for init
        }
    }
}

相关文章

网友评论

      本文标题:Application多次初始化问题

      本文链接:https://www.haomeiwen.com/subject/xhwhxktx.html