安卓5.0上下应用锁的实现方法

转载:Android 5.0以后版本打开“有权查看使用情况的应用”

  1. 应用锁简单介绍
    本文仅讨论如何获得最近运行应用
    这里的应用锁的功能是指的是禁止打开某些特定的应用,或者打开后也会自动关闭。
    简单的介绍一下应用锁实现的方式:后台开一个Service,是Service里开一个Runnable,在实现中每过几秒检测当前应用是否可以打开。
  2. 顶层应用
  3. 5.0以下可以直接获取顶层应用。
    需要声明<uses-permission android:name="android.permission.GET_TASKS"/>
                ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
                List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
                if (!ListUtils.isEmpty(tasksInfo)) {
                    retuString = tasksInfo.get(0).topActivity.getPackageName();
                }
  1. 5.0以上需要<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"></uses-permission>这个权限虽然说是系统权限,但是可以用下面的方法申请到。
/***
     * 有没有这个设置,必须要开启这个设置才能得到最近任务
     * @param pContext 上下文
     * @return true有false没有
     */
    public static boolean isUsageOption(Context pContext) {
        PackageManager packageManager = pContext.getApplicationContext()
                .getPackageManager();
        Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
        List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
                PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    }

    /***
     * 当前的状态
     * @param pContext 上下文
     * @return true开启false关闭
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static boolean isUsageSwitch(Context pContext) {
        long ts = System.currentTimeMillis();
        UsageStatsManager usageStatsManager = (UsageStatsManager) pContext.getApplicationContext()
                .getSystemService(Context.USAGE_STATS_SERVICE);
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(
                UsageStatsManager.INTERVAL_BEST, 0, ts);
        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
            return false;
        }
        return true;
    }

    /***
     * 打开权限界面
     * @param pContext 上下文
     * @param requestCode 请求码
     */
    public static void openUsageActivity(Context pContext, int requestCode) {
        if (pContext == null) {
            throw new RuntimeException(UsageStatsUtils.class.getName() + " context null");
        }
        Intent intent = new Intent(
                Settings.ACTION_USAGE_ACCESS_SETTINGS);
        if (pContext instanceof Activity) {
            ((Activity) pContext).startActivityForResult(intent, requestCode);
        }
    }

申请到权限后才能使用下面的方法获取最近任务。(但不是很准确,如果在设定的时间内没有任何操作,那么取到的最任务为空)。

  UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
                long time = System.currentTimeMillis();
                List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, time - 5 * 1000, time);//检查5秒内的应用情况
                if (appList != null && appList.size() > 0) {
                    SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                    for (UsageStats usageStats : appList) {
                        mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                    }
                    if (mySortedMap != null && !mySortedMap.isEmpty()) {
                        retuString = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
                    }
                }

当前检测到当前应用允许运行时,可以执行以下操作打开默认桌面。

```

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);

推荐阅读更多精彩内容