package com.aoleyun.sn.utils; import android.app.ActivityManager; import android.app.Application; import android.content.Context; import android.os.Build; import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.reflect.Method; import java.util.List; public class ProcessUtil { private static String currentProcessName; /** * @return 当前进程名 */ @Nullable public static String getCurrentProcessName(@NonNull Context context) { if (!TextUtils.isEmpty(currentProcessName)) { return currentProcessName; } //1)通过Application的API获取当前进程名 currentProcessName = getCurrentProcessNameByApplication(); if (!TextUtils.isEmpty(currentProcessName)) { return currentProcessName; } //2)通过反射ActivityThread获取当前进程名 currentProcessName = getCurrentProcessNameByActivityThread(); if (!TextUtils.isEmpty(currentProcessName)) { return currentProcessName; } //3)通过ActivityManager获取当前进程名 currentProcessName = getCurrentProcessNameByActivityManager(context); return currentProcessName; } /** * 通过Application新的API获取进程名,无需反射,无需IPC,效率最高。 */ public static String getCurrentProcessNameByApplication() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { return Application.getProcessName(); } return null; } /** * 通过反射ActivityThread获取进程名,避免了ipc */ public static String getCurrentProcessNameByActivityThread() { String processName = null; try { final Method declaredMethod = Class.forName("android.app.ActivityThread", false, Application.class.getClassLoader()) .getDeclaredMethod("currentProcessName", (Class[]) new Class[0]); declaredMethod.setAccessible(true); final Object invoke = declaredMethod.invoke(null, new Object[0]); if (invoke instanceof String) { processName = (String) invoke; } } catch (Throwable e) { e.printStackTrace(); } return processName; } /** * 通过ActivityManager 获取进程名,需要IPC通信 */ public static String getCurrentProcessNameByActivityManager(@NonNull Context context) { if (context == null) { return null; } int pid = android.os.Process.myPid(); ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); if (am != null) { List runningAppList = am.getRunningAppProcesses(); if (runningAppList != null) { for (ActivityManager.RunningAppProcessInfo processInfo : runningAppList) { if (processInfo.pid == pid) { return processInfo.processName; } } } } return null; } }