[转]Android多进程下进行全局初始化操作的正确姿势

/ 0评 / 0

前言

在我们的开发中,如果使用了第三方库比如网络请求库LiteHttp,图片加载库universalimageloader等等都需要在Application里面进行初始化,可是当我们在使用多进程的时候Application会被重新创建,相当于有多少个进程就初始化多少次,所以我们需要根据进程的不同来进行不同的初始化才行。

实现

public class MyApplication extends Application {  
    private final static String PROCESS_NAME = "进程名(就是应用包名)";  
    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  
        }  
    }  
}

大致原理就是获取当前进程的包名,然后根据进程的不同进行初始化。

补充

根据进程pid获取进程名有多种方法,下面贴出一种不同于上面的实现方式:

/**
 * 获取进程号对应的进程名
 * 
 * @param pid 进程号
 * @return 进程名
 */
private static String getProcessName(int pid) {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
        String processName = reader.readLine();
        if (!TextUtils.isEmpty(processName)) {
            processName = processName.trim();
        }
        return processName;
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }
    return null;
}

本文转自:http://blog.csdn.net/wei1583812/article/details/53395234

发表评论

您的电子邮箱地址不会被公开。