1. 程式人生 > >Android多程序時Application初始化問題,大坑

Android多程序時Application初始化問題,大坑

之前在做專案時,遇到一個大坑,就是我的APP 的Application 的onCreate方法,竟然執行了好幾次,這就導致我在onCreate裡面做了一些初始化的操作被重複執行了,導致奇怪的bug產生。後來冷靜下來分析一下,才發現有一些第三方元件,比如百度推送之類的,它們是單獨開了一個程序,那麼每個程序會自己初始化自己的Application,那自然onCreate方法會多次執行。準確的說就是你的APP裡有多少個程序,就會初始化多少次Application 。

但是有的東西就是隻需要在Application 的onCreate 裡只初始化一次。那怎麼解決呢?看程式碼:

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
        }
    }
}

這樣就保證了可以只初始化一次。

===============================
如果你覺得幫到了你,請給作者打賞一口飯吃: