Android5.1系统自带的应用启动次数统计
来源:互联网 发布:淘宝产品历史价格 编辑:程序博客网 时间:2024/05/29 14:13
转自:http://www.cnblogs.com/0616--ataozhijia/p/5202384.html
前段时间要做一个统计手机中激活量的东东,这个统计不是单独的某个应用统计,是整个手机中所有预装应用的安装量。第一时间想到的就是后台去跑个 service,隔一段时间去扫一遍,和程序锁原理类似。但是这种方案有个弊端,大家也都了解,就是费电,当然也有优点,那就是统计精确。还有另外一种方 案,就是android自带的统计,之前也只是粗略的知道有这么回事,没有仔细看过。
具体操作,在拨号界面输入 ×#×#4636#×#×,手机会自动跳转到测试页面,然后点击使用情况统计数据,你就会看到统计的界面了。一开始感觉这个需求应该好做了,但仔细一看不 对啊,5.1的手机上面就没有打开次数这一栏了,5.0之前是好用的,没关系这里打开次数下面会说到的。说了一堆,下面上代码。
首先是UsageStatsManager这个类,先看下介绍
这里说的很清楚 需要android.permission.PACKAGE_USAGE_STATS这个权限,而且是system级别,不能在第三方应用中使用,但是在Settings里面有个选项是可以赋给你的应用查询的权限。
但前提你必须把这个权限写到你的manifest里面,否则在这个列表回看不到你的应用。这时你会发现manifest报错,导致应用不能直接运行,没关系,看代码。
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
这样写可以让你代码正常运行
获取统计列表
public static List<UsageStats> getUsageStatsList(Context context){ UsageStatsManager usm = getUsageStatsManager(context); Calendar calendar = Calendar.getInstance(); long endTime = calendar.getTimeInMillis(); calendar.add(Calendar.YEAR, -1); long startTime = calendar.getTimeInMillis(); Log.d(TAG, "Range start:" + dateFormat.format(startTime) ); Log.d(TAG, "Range end:" + dateFormat.format(endTime)); List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,startTime,endTime); return usageStatsList;}@SuppressWarnings("ResourceType") private static UsageStatsManager getUsageStatsManager(Context context) { UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats"); return usm; }
这个方法第一次是空的,因为你没有权限,判断为空之后去跳转到Settings,这里大家看到了,我传的startTime,是过去一年的,而这个方法统计是有时间段的,上面的注释也有说。我统计的是过去一年到当前的所有应用的使用次数。
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);startActivity(intent);
赋完权限之后就可以正常获取到列表
打印所需要的值
public static void printUsageStats(List<UsageStats> usageStatsList) throws IllegalAccessException, IllegalArgumentException, NoSuchFieldException{ for (UsageStats u : usageStatsList){ Log.d(TAG, "Pkg: " + u.getPackageName() + "\t " + "ForegroundTime: " + DateUtils.formatElapsedTime(u.getTotalTimeInForeground() / 1000)+" lasttimeuser:"+DateUtils.formatSameDayTime(u.getLastTimeUsed(), System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM) +"times"+u.getClass().getDeclaredField("mLaunchCount").getInt(u));}
这里大家看见了,我获取打开次数mLaunchCount的方法,没错,就是反射。到这里,一般第三方应用的需求应该可以满足了,但是系统类的应用要去手动打开权限未免有些突兀。我又跟代码到对应switch打开的代码,结合自己应用的需求
AppOpsManager mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_PERMISSIONS);mAppOpsManager.setMode(43, packageInfo.applicationInfo.uid,context.getPackageName(), AppOpsManager.MODE_ALLOWED);
上面这段代码可以让系统应用自动有权限。有一段setMode(43, 这里的43是抄之前switch打开的代码
致此,所有代码结束。最后顺带说一句,我这里是用来统计激活量,所以打开次数要求不是很精确,这种方式可以满足,但是要求统计非常精确的需要再考虑 一下。因为这种方式拿到的打开次数应该是和自身的其他service相关,比如已很很简单的demo,它的打开次数是精确的,但是如果带有一个 service,打开次数就会以2增长,第一次为2,第二次为4,这里我是自己理解的,代码跟到后面能力有限,没有找到真正的原因,还请大家谅解。
- Android5.1系统自带的应用启动次数统计
- Android5.1-s5p6818平台去掉系统自带应用
- android5.1应用打开次数统计(优化篇)
- 使用Android系统自带的应用统计
- 使用Android系统自带的应用统计!!!
- Android5.1应用打开次数获取
- 调试系统自带的应用
- Android 自带的应用统计服务(UsageStatsService)
- 启动系统自带浏览器
- Android5.1应用统计源码分析
- Win10系统删除系统自带应用的方法
- VxWorks启动后系统自带的任务
- Android启动系统自带的程序组件
- tq210-uboot nfs启动TQ210自带的linux系统
- 对系统自带的框架MapKit的应用
- Android5.1 应用开机启动方法
- Android APP 启动次数的统计原理
- 百度移动统计的启动次数
- Redis介绍以及安装(Linux)
- WEB 页面滚动条 相关操作
- EMGU Hello, world
- 【JavaWeb开发】初步实现网站应用钉钉扫码登录
- cocos2dx打包异常处理记录
- Android5.1系统自带的应用启动次数统计
- Struts2中的页面跳转
- Hibernate工作原理及为什么要用?
- Vue中v-for的数据分组
- Slot Games 0.3% Rebate Bonus Promotion in Newcity8 Online Casino Malaysia
- Web开发之单位和值
- Android的5类Manager
- 操作系统实战之CPU的模式切换与Linux上的实现
- 大学生活与学习