美文网首页IT部落Android知识Android开发
Android获取手机已安装APP【二】(根据包名检测APP运行

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

作者: ROOM先生 | 来源:发表于2017-03-30 15:06 被阅读584次

    转载请标明出处:http://www.jianshu.com/u/a5ad093cffe8
    上节说到获取手机安装APP列表的方法,(文章:http://www.jianshu.com/p/f2a8ff92e6a0
    本章讲一下关于获取某个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.");
        }
    }
    

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

    图片.png

    相关文章

      网友评论

        本文标题:Android获取手机已安装APP【二】(根据包名检测APP运行

        本文链接:https://www.haomeiwen.com/subject/pexpottx.html