Android获取手机已安装APP【二】(根据包名检测APP运行状态)

转载请标明出处:http://www.jianshu.com/u/a5ad093cffe8
上节说到获取手机安装APP列表的方法,(文章:http://www.jianshu.com/p/f2a8ff92e6a0
本章讲一下关于获取某个APP的运行状态。
最近的一个需求,需要检测某个APP的运行状态,来进行一些相应的操作。网上的一些资料都特别的零碎。我在这里总结一下。

效果图:

《Android获取手机已安装APP【二】(根据包名检测APP运行状态)》 运行效果图
《Android获取手机已安装APP【二】(根据包名检测APP运行状态)》 检测效果图

从效果图中可以看到,当项目运行后,服务将会监控某个APP的运行状态。是否是前台运行。
直接上代码:
添加权限

<uses-permission
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.GET_TASKS" />

判断工具类IsAppRuning:

package com.example.gray_dog3.applist;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Log;

import java.util.List;

import static com.example.gray_dog3.applist.ApkTool.TAG;

/**
 * Created by liupanpan on 2017/3/28.
 */

public class IsAppRuning {
    /**
     * 方法描述:判断某一应用是否正在运行
     * Created by cafeting on 2017/2/4.
     *
     * @param context     上下文
     * @param packageName 应用的包名
     * @return true 表示正在运行,false 表示没有运行
     */
    public static boolean isAppRunning(Context context, String packageName) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();
        if (list.size() <= 0) {
            return false;
        }
        for (ActivityManager.RunningAppProcessInfo info : list) {
            if (info.importance == 100 && info.processName.equals(packageName)) {
                return true;
            }else {
                return false;
            }
        }
        return false;
    }


    //获取已安装应用的 uid,-1 表示未安装此应用或程序异常
    public static int getPackageUid(Context context, String packageName) {
        try {
            ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
            if (applicationInfo != null) {
                Log.d(TAG, "getPackageUid: " + applicationInfo.uid);
                return applicationInfo.uid;
            }
        } catch (Exception e) {
            return -1;
        }
        return -1;
    }

    /**
     * 判断某一 uid 的程序是否有正在运行的进程,即是否存活
     * Created by cafeting on 2017/2/4.
     *
     * @param context 上下文
     * @param uid     已安装应用的 uid
     * @return true 表示正在运行,false 表示没有运行
     */
    public static boolean isProcessRunning(Context context, int uid) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200);
        if (runningServiceInfos.size() > 0) {
            for (ActivityManager.RunningServiceInfo appProcess : runningServiceInfos) {
                if (uid == appProcess.uid) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean IsAppRuning(Context context, String packageName) {
        int uid = getPackageUid(context, packageName);
        if (uid > 0) {
            boolean rstA = isAppRunning(context, packageName);
            boolean rstB = isProcessRunning(context, uid);
            if (rstA || rstB) {
                return true;
            } else {
                //指定包名的程序未在运行中
                return false;
            }
        } else {
            //应用未安装
            return false;
        }

    }
}

启动服务监控APP运行状态:

package com.example.gray_dog3.applist;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import java.util.concurrent.TimeUnit;

/**
 * Created by liupanpan on 2017/3/28.
 */

public class TopSevers extends Service {
    public static final String TAG = "TestService";
    private MyThread myThread = null;

    private static class MyThread extends Thread {
        private Context context;
        private boolean isRun = true;

        private MyThread(Context context) {
            this.context = context;
        }

        public void setStop() {
            isRun = false;
        }

        @Override
        public void run() {
            while (isRun) {
                try {
                    TimeUnit.SECONDS.sleep(2);
                    //此处的isAppruning(context,pakgename);pakgename 为你需要检测的APP包名。
                    if (new IsAppRuning().isAppRunning(context, "com.example.gray_dog3.applist")) {
                        //Toast.makeText(context, "com.example.gray_dog3.applist正在运行", Toast.LENGTH_SHORT).show();
                        Log.e("usrun", "运行中");
                    } else {
                        // Toast.makeText(context, "com.example.gray_dog3.applist失败=========", Toast.LENGTH_SHORT).show();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myThread = new MyThread(this);
        myThread.start();
        Log.i(TAG, "Service is start.");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        myThread.setStop();
        Log.i(TAG, "Service is stop.");
    }
}

到此就可以实现了。
源码后期将会奉上。
关注公众号:

《Android获取手机已安装APP【二】(根据包名检测APP运行状态)》 图片.png

    原文作者:ROOM先生
    原文地址: https://www.jianshu.com/p/ace9aca8066e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞