Способ получения текущего запущенного приложения / процесса переднего плана - PullRequest
0 голосов
/ 01 октября 2019

Мне любопытно, есть ли в Android OS какой-либо способ сообщить приложению, что приложение только что запущено. По сути, в моем приложении я хочу уведомить мое приложение о том, что приложение будет запущено или только запущено. В этом случае я хочу выполнить некоторые операции, например заблокировать это приложение, если пользователь (использующий мое приложение) включил его в список блокировки. Любая помощь или руководство будут высоко оценены.

1 Ответ

1 голос
/ 01 октября 2019

first Добавить

  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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...