version:1.0
update:2021-10-13 18:52:13 fix:去除okgo,rxAndroid1,优化依赖 add:切换到奥乐云平台
This commit is contained in:
96
app/src/main/java/com/aoleyun/sn/utils/ProcessUtil.java
Normal file
96
app/src/main/java/com/aoleyun/sn/utils/ProcessUtil.java
Normal file
@@ -0,0 +1,96 @@
|
||||
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<ActivityManager.RunningAppProcessInfo> runningAppList = am.getRunningAppProcesses();
|
||||
if (runningAppList != null) {
|
||||
for (ActivityManager.RunningAppProcessInfo processInfo : runningAppList) {
|
||||
if (processInfo.pid == pid) {
|
||||
return processInfo.processName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user