獲取APP後臺運行狀態,殺死指定APP

當咱們須要控制某個APP的時候,就須要知道這個APP當前的狀態;
java

首先要開容許檢測,關閉進程的權限,在manifests中配置:android

<!--殺死第三方應用的權限-->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

<!--獲取TASKS權限-->
<uses-permission android:name="android.permission.GET_TASKS" />

有兩種方式:app

一、遍歷棧裏面的應用,對比是否有相同的APP應用code

/**
 * APP是否正在運行
 *
 * @param context     應用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppRunning(Context context, String packageName)
{
    boolean isAppRunning = false;
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> list = activityManager.getRunningTasks(100);

    for (ActivityManager.RunningTaskInfo info : list)
    {
        if (info.topActivity.getPackageName().equals(packageName) ||
                info.baseActivity.getPackageName().equals(packageName))
        {
            isAppRunning = true;
            SkyLogger.d(TAG,
                    info.topActivity.getPackageName() + " info.baseActivity.getPackageName()=" +
                            info.baseActivity.getPackageName());
            break;
        }
    }
    return isAppRunning;
}

二、檢測是否正在運行進程

/**
 * APP是否正在運行
 *
 * @param context     應用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppOnForeground(Context context, String packageName)
{
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();

    if (appProcessInfos == null)
        {
        SkyLogger.d(TAG, "appProcessInfos == null");
        return false;
    }

    for (RunningAppProcessInfo appProcess : appProcessInfos)
    {
        if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                appProcess.processName.equals(packageName))
        {
            SkyLogger.d(TAG, "正在後臺運行");
            return true;
        }
    }

    ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity;
    String currentPackageName = cn.getPackageName();

    if (!TextUtils.isEmpty(currentPackageName) && packageName.equals(currentPackageName))
    {
        SkyLogger.d(TAG, "正在前臺運行");
        return true;
    }
    SkyLogger.d(TAG, "沒有運行");
    return false;
}

殺死某個應用get

/**
 * 強制關閉應用
 *
 * @param context     應用上下文
 * @param packageName 關閉的APP的包名
 */
public static void closeDeviceApp(Context context, String packageName)
{
    if (packageName != null && context != null)
    {
        ActivityManager activityManager =
                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        activityManager.killBackgroundProcesses(packageName);
        SkyLogger.d(TAG, packageName + " is killed.");
    }
    else
    {
        SkyLogger.d(TAG, "packageName is null.");
    }
}

若是僅僅只是檢測該APP是否運行,可參照以下方法:it

/**
 * APP是否正在運行
 *
 * @param context     應用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppOnForeground(Context context, String packageName)
{
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();

    //通常不會跑到這裏來,若是跑到這裏來的話,要麼就是這個app廢了,要不就是見鬼了。。
    if (appProcessInfos == null)
    {
        SkyLogger.d(TAG, "appProcessInfos == null");
        return false;
    }
    else
    {
        for (RunningAppProcessInfo appProcess : appProcessInfos)
        {
            if (appProcess.processName.equals(packageName))
            {
                SkyLogger.d(TAG, packageName+"正在後臺運行...");
                return true;
            }
        }
        return false;
    }
}
相關文章
相關標籤/搜索