1.判斷應(yīng)用是否在后臺運(yùn)行(兩種方式)
/**
* 判斷程序是否在后臺
* @param context
* @return
*/
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
} else {
return false;
}
}
}
return false;
}
或者
public static boolean isApplicationInBackground(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskList = am.getRunningTasks(1);
if (taskList != null && !taskList.isEmpty()) {
ComponentName topActivity = taskList.get(0).topActivity;
if (topActivity != null && !topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
或者全局監(jiān)聽(推薦)
object AppFrontBack {
/**
* 打開的Activity數(shù)量統(tǒng)計(jì)
*/
private var activityStartCount = 0
/**
* 注冊狀態(tài)監(jiān)聽,僅在Application中使用
* @param application
* @param listener
*/
fun register(application: Application, listener: AppFrontBackListener) {
application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityDestroyed(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
override fun onActivityStarted(activity: Activity) {
activityStartCount++
if (activityStartCount == 1) {
listener.onFront(activity)
}
}
override fun onActivityStopped(activity: Activity) {
activityStartCount--
if (activityStartCount == 0) {
listener.onBack(activity)
}
}
})
}
}
/**
* App狀態(tài)監(jiān)聽
*/
interface AppFrontBackListener {
/**
* 前臺
*/
fun onFront(activity: Activity?)
/**
* 后臺
*/
fun onBack(activity: Activity?)
}
使用時(shí):
/**
* 注冊APP前后臺切換監(jiān)聽
*/
private fun appFrontBackRegister() {
AppFrontBack.register(this, object : AppFrontBackListener {
override fun onBack(activity: Activity?) {
LogUtil.d("onBack")
}
override fun onFront(activity: Activity?) {
LogUtil.d("onFront")
}
})
}
2.判斷進(jìn)程是否在主進(jìn)程
public static boolean isMainProcess(Context context) {
if (context == null) {
return false;
}
String packageName = context.getApplicationContext().getPackageName();
String processName = getProcessName(context);
return packageName.equals(processName);
}
public static String getProcessName(Context context) {
String processName = getProcessFromFile();
if (processName == null) {
// 如果裝了xposed一類的框架砰盐,上面可能會拿不到,回到遍歷迭代的方式
processName = getProcessNameByAM(context);
}
return processName;
}
private static String getProcessFromFile() {
BufferedReader reader = null;
try {
int pid = android.os.Process.myPid();
String file = "/proc/" + pid + "/cmdline";
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "iso-8859-1"));
int c;
StringBuilder processName = new StringBuilder();
while ((c = reader.read()) > 0) {
processName.append((char) c);
}
return processName.toString();
} catch (Exception e) {
return null;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static String getProcessNameByAM(Context context) {
String processName = null;
ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE));
if (am == null) {
return null;
}
while (true) {
List<ActivityManager.RunningAppProcessInfo> plist = am.getRunningAppProcesses();
if (plist != null) {
for (ActivityManager.RunningAppProcessInfo info : plist) {
if (info.pid == android.os.Process.myPid()) {
processName = info.processName;
break;
}
}
}
if (!TextUtils.isEmpty(processName)) {
return processName;
}
try {
Thread.sleep(100L); // take a rest and again
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}