建议收藏本文,你的项目一定用的到。
一、获取进程名的常规方法,通过ActivityManager
在多进程的APP中,常常需要知道当前进程是主进程还是后台进程?还是什么进程。
如下代码,是我们常见的一个用法,在进程启动时,根据进程名判断当前进程是哪个进程:
public class MyApp extends Application {
private static final String TG = "MyApp";
@Override
public void onCreate() {
super.onCreate();
//判断当前进程是否为主进程,那么初始化主进程
if (isMainProcess()) {
initMainProcess();
}
}
private boolean isMainProcess() {
//获取当前进程名,并与主进程对比,来判断是否为主进程
String processName = ProcessUtil.getCurrentProcessName(this);
Log.e(TG, "isMainProcess processName=" + processName);
return BuildConfig.APPLICATION_ID.equals(processName);
}
private void initMainProcess() {
Log.e(TG, "initMainProcess");
}
}
通过ActivityManager来获取进程名,网上也能搜索到很多人推荐这个用法。
但是,大叔要说,这个方法不是最优解。
/**
* 通过ActivityManager 获取进程名,需要IPC通信
*/
public static String getCurrentProcessNameByActivityManager(@NonNull Context context) {
int pid = Process.myPid();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.RunningAppProcessInfo> runningAppList = am.getRunningAppProcesses();
if (runningAppList != null) {
for (ActivityManager.RunningAppProcessInfo processInfo : runningAppList) {
if (processInfo.pid == pid) {
return processInfo.processName;
}
}
}
}
return null;
}
但是,大叔要说,这个方法不是最优解。
但是,大叔要说,这个方法不是最优解。
但是,大叔要说,这个方法不是最优解。
二、通过ActivityManager获取当前进程名的弊端
-
ActivityManager.getRunningAppProcesses() 方法需要跨进程通信,效率不高
需要 和 系统进程的 ActivityManagerService 通信。必然会导致该方法调用耗时。
-
拿到RunningAppProcessInfo的列表之后,还需要遍历一遍找到与当前进程的信息。
显然额外的循环也会增加耗时;
当然这个耗时影响很小。
-
最恐怖的是 ActivityManager.getRunningAppProcesses() 有可能调用失败