一、背景
在某些oppo手机上发现系统会启动很多个进程,为了防止应用多次执行初始化的代码我们只在主进程去做初始化的操作,那么如何判断一个进程是否为主进程就成了需要解决的问题,
二、解决方案
在Android中主进程的进程名是应用的包名,只要判断进程名是否为包名就可以判断是否为主进程了,获取进程名有如下两种方式:
- 利用Linux系统获取进程名
public static String getCurrentProcessName() {
FileInputStream in = null;
try {
String fn = "/proc/self/cmdline";
in = new FileInputStream(fn);
byte[] buffer = new byte[256];
int len = 0;
int b;
while ((b = in.read()) > 0 && len < buffer.length) {
buffer[len++] = (byte) b;
}
if (len > 0) {
String s = new String(buffer, 0, len, "UTF-8");
return s;
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
- 利用Android系统获取进程名
public static String getProcessName(Context cxt) {
int pid = android.os.Process.myPid();
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
- Application的getProcessName方法
/**
* Returns the name of the current process. A package's default process name
* is the same as its package name. Non-default processes will look like
* "$PACKAGE_NAME:$NAME", where $NAME corresponds to an android:process
* attribute within AndroidManifest.xml.
*/
public static String getProcessName() {
return ActivityThread.currentProcessName();
}
判断是否为主进程代码如下:
public static boolean isMainProcess(Context context) {
try {
if (null != context) {
return context.getPackageName().equals(getProcessName(context));
}
} catch (Exception e) {
return false;
}
return true;
}