获取当前正在运行的前台应用程序/进程的方法

时间:2019-10-01 06:47:35

标签: android service process broadcastreceiver

我很好奇Android操作系统中是否有任何方法可以告诉应用程序应用程序刚刚启动。基本上,在我的应用程序中,我想通知我的应用程序即将启动或刚刚启动的应用程序。发生这种情况时,如果用户(使用我的应用程序)将该应用程序包括在阻止列表中,我想执行一些操作,例如阻止该应用程序。任何帮助或指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

首次添加

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(context)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
                            Uri.parse("package:" + getPackageName()));
                    startActivityForResult(intent, 200);
                }
            } else {
                //Do work
            }

            if (Settings.System.canWrite(context)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    checkOpsPermissions();
                }
            }

        }



private void checkOpsPermissions() {
        if (!hasOpsPermission(this)) {
            requestOpsPermission();
        } else {
           //start your service

        }
    }


private boolean hasOpsPermission(Context ctx) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AppOpsManager appOps = (AppOpsManager)
                    ctx.getSystemService(Context.APP_OPS_SERVICE);
            int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
                    android.os.Process.myUid(), ctx.getPackageName());
            return mode == AppOpsManager.MODE_ALLOWED;
        }
        return true;
    }



private void requestOpsPermission() {
        startActivityForResult(
                new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 1);
    }

您可以获得当前正在这样运行的应用程序

 public static String getTopAppName(Context context) {
        ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        String strName = "";
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                strName = getLollipopFGAppPackageName(context);
            } else {
                strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        return strName;
    }


private static String getLollipopFGAppPackageName(Context ctx) {
        String foregroundProcess = "";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //  try {
            UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService(Context.USAGE_STATS_SERVICE);
            long milliSecs =  60 * 1000;
            Date date = new Date();
            List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
            if (stats != null) {
                SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                for (UsageStats usageStats : stats) {
                    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                }
                if (mySortedMap != null && !mySortedMap.isEmpty()) {
                    String topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
                    foregroundProcess = topPackageName;
                }
            }
        }
        //System.out.println("foregroundProcess" + foregroundProcess);
        return foregroundProcess;
    }

在服务类中使用它,它将在一段时间内运行。

要关闭某些不需要的应用程序,您可以使用

 private void closeApp(String a) {
        try {
            Log.e(TAG, "KILLING here " + a);

                ActivityManager am = (ActivityManager) ctx.getSystemService(Activity.ACTIVITY_SERVICE);
                am.killBackgroundProcesses(a);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
相关问题