1 需求

找出手机多少天没有使用的所有APP

 

 

 

 

 

2 思路

通过 ACTION_USAGE_ACCESS_SETTINGS权限得到多少天已经使用的APP的包名,然后获取手机所有用户APP,剩下的APP就是多少天没有使用的APP。

 

 

 

 

 

3 ACTION_USAGE_ACCESS_SETTINGS权限申请

1)在AndroidManifest.xml文件里面定义权限

    

 

2) 声明权限后还再需要通过Intent启动方式申请,打开相应的界面,同意当前的APP权限。

            val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)            startActivityForResult(intent, REQUEST_SYSTEM_USAGE_ACCESS_CODE)

 

 

 

 

 

 

 

 

4 判断是否获取ACTION_USAGE_ACCESS_SETTINGS权限

    /**     * 判断是否已经获取 有权查看使用情况的应用程序 权限     *     * @param context     * @return     */    public static boolean isStatAccessPermissionSet(Context context) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            try {                PackageManager packageManager = context.getPackageManager();                ApplicationInfo info = packageManager.getApplicationInfo(context.getPackageName(), 0);                AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);//                appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName);                return appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) == AppOpsManager.MODE_ALLOWED;            } catch (Exception e) {                e.printStackTrace();                return false;            }        } else {            return true;        }    }

 

    /**     * 查看是存在查看使用情况的应用程序界面     *     * @return     */    public static boolean isNoOption(Context context) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            PackageManager packageManager = context.getPackageManager();            Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);            List list = new ArrayList<>();            //进程间通讯有可能异常            try {                list.addAll(packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY));            } catch (Exception e) {                e.printStackTrace();            }            return list.size() > 0;        }        return false;    }
    /**     * 权限检查     */    fun checkUsedPermission():Boolean {        if(!isStatAccessPermissionSet(this) && isNoOption(this)) {            return false        } else {            return true        }    }

 因为我们一开始是用startActivityForResult这种方式打开界面,我们可以在onActivityResult里面进行权限的相关判断再处理

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        Log.i(TAG, "onActivityResult start requestCode is:" + requestCode)        if (requestCode == REQUEST_SYSTEM_USAGE_ACCESS_CODE) {            var result = checkUsedPermission()            Log.i(TAG, "onActivityResult result is ${result}")            if (result) {                init()            } else {                //finish                Log.i(TAG, "has no ACTION_MANAGE_WRITE_SETTINGS");                ToastUtils.showShort(R.string.text_please_allow_permisson)                finish()            }        }    }

 

 

 

 

 

5 检测多久时间内使用了其它APP

 /**         * 查询使用在多少小时使用了app         */        fun getRuningAppsNoContainSelf(context: Context, hour: Int): List {            val runingApps = ArrayList()            val sUsageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager            val endTime = System.currentTimeMillis()            val beginTime = endTime - TimeUnit.HOURS.toMillis(hour.toLong())            val event = UsageEvents.Event()            val usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime)            while (usageEvents.hasNextEvent()) {                usageEvents.getNextEvent(event)                if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {                    val pkg = event.packageName                    LogUtil.i("获取使用过的应用", "pkg为${pkg}")                    if (!TextUtils.isEmpty(pkg) && !CLEAN_NOT_CONTAIN_LIST.contains(pkg)) {                        if (!runingApps.contains(pkg)) {                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                            }                            runingApps.add(event.packageName)                        }                    }                }            }            return runingApps        }

比如是10天内,我们那个hour参数传递10 * 24

更多相关文章

  1. Android群英传读书笔记-----控件架构
  2. Android(安卓)从setContentView谈Activity界面的加载过程
  3. 学个明白--Android控件架构
  4. AndroidManifest详解之Application(有图更好懂)
  5. 关于Android(安卓)的系统架构
  6. 聊聊android界面适配
  7. android用户界面编程技巧――如何使用Adapter
  8. android ANR处理方法
  9. Android(安卓)壁纸设置代码 详解

随机推荐

  1. 解析Android(安卓)Studio创建的第一个And
  2. 实现 Android(安卓)应用在开机时自启动
  3. Android和.NET通用的DES算法
  4. 互联网寒冬下那些 Android(安卓)开发高手
  5. android下基本json串的生成与解析
  6. Java设计模式之Command在Android中的应用
  7. Linux的CPU调速器
  8. Android之获得已安装程序列表
  9. Android精通:View与ViewGroup,LinearLayout
  10. 自动化代码检查优化Lint