UsageStatsManager怎样使用问题详解和获取应用使用信息

Android 应用使用情况统计 本篇文章简单记录下android中usageStatsManager的简单使用.UsageStatsManager提供对设备使用历史记录和统计信息的访问,时间周期为days, weeks, months, and years. 阅读详情
转载自:http://blog.youkuaiyun.com/andoop/article/details/50593699

UsageStatsManager就是使用情况统计管理者,通过它可以获取应用的使用情况。
它是Android 5.0 才有的API。

使用它之前需要在清单文件中配置 “android.permission.PACKAGE_USAGE_STATS”的权限
用户必须在 设置–安全–有权查看使用情况的应用 中勾选相应的应用
对应设备 Android 5.0 及其以上。
魅族和小米手机不能通过UsageStatsManager获取应用使用情况
系统会统计应用的使用情况并保存起来,然后按照这些保存起来的信息的时间长短进行划分。

划分级别有4个:
1.日长短级别数据:Daily data
最长7天内的数据
2.星期长短级别数据:Weekly data
最长4个星期内的数据
3.月长短级别数据: Monthly data
最长6个月内的数据
4.年长短级别数据: Yearly data
最长2年内的数据,也就是说,数据最长保存2年
对于每一个应用来说,系统会记录以下信息:

应用最后一次被用的时间
对应存储的4个级别,应用在前台的总共时间
时间戳:一个组件一天之内改变状态的时刻(从前台到后台,或从后台到前台),这个组件可以通过包名或activity的名字来唯一标示。
时间戳:设备配置信息改变的时刻,如:横竖屏切换。
android5.0以后通过UsageStatsManager获取前台应用进程

5.0之前:
<pre name="code" class="java">public String getForegroundApp(Context context) {  
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
            List<RunningAppProcesInfo> lr = am.getRunningAppProcesses();  
            if (lr == null) {  
                  return null;  
            }  
            for (RunningAppProcessInfo ra : lr) {  
                if (ra.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE  
                     || ra.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {  
                            return ra.processName;  
               }  
            }  
  
            return null;  
        }  




5.0之后(魅族除外)
@SuppressLint("NewApi") 
    private String getForegroundApp() {
        Calendar calendar=Calendar.getInstance();
        calendar.setTime(new Date());
        long endt = calendar.getTimeInMillis();//结束时间
        calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月
        long statt = calendar.getTimeInMillis();//开始时间
        UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
        //获取一个月内的信息
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);

        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
                return null;
        }

        UsageStats recentStats = null;
        for (UsageStats usageStats : queryUsageStats) {

                if(recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()){
                        recentStats = usageStats;
                }
        }

        return recentStats.getPackageName();
     }



UsageStatsManager 的方法 queryUsageStats用法
queryUsageStats的三个参数说明:
intervalType 时间间隔的类型,5种,对应上面的4个,还有一个,后面再说
beginTime 开始的时间
endTime 结束的时间

正如上面的代码,我们可以通过queryUsageStats这个方法获取指定时间段内的应用使用情况信息
long endt = calendar.getTimeInMillis();//结束时间
            calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月
            long statt = calendar.getTimeInMillis();//开始时间
            UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
            //获取一个月内的信息
            List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);



但是在指定时间段的时候要注意了:有可能获取的数据为空。

很多人喜欢这样用:
long st = System.currentTimeMillis();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,st-2*1000,st);

这种情况下,很容易获取到空的数据,如果在执行这段代码之前,有一个时间间隔:2*1000(这里就是2秒了),在这个间隔内系统没有记录应用使用情况的信息(应用什么时候记录应用使用情况信息请看上面内容),这样就导致系统数据库中没有对应这个时间段的数据,所以就为空了。
关于第一个参数:intervalType 是时间间隔的类型:

INTERVAL_DAILY 天存储级别的数据
INTERVAL_WEEKLY 星期存储级别的数据
INTERVAL_MONTHLY 月存储级别的数据
INTERVAL_YEARLY 年存储级别的数据
INTERVAL_BEST 根据提供的时间间隔(根据与第二个参数和第三个参数获取),自动搭配最好的级别
如代码:


Calendar calendar=Calendar.getInstance();
calendar.setTime(new Date());
long endt = calendar.getTimeInMillis();//结束时间
calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月
long statt = calendar.getTimeInMillis();//开始时间
UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
//获取一个月内的信息
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);

时间最好不要太短,以防获取不到数据
使用UsageStatsMannager获取应用使用时长 UsageStatsManager.queryEventStats:一般是用来根据最近时间戳找到top进程UsageStatsManager.queryAndAggregateUsageStats:获取聚合后的应用前台使用时长UsageStatsManager.queryEvents:自己计算每个进程的运行时长和启动次数(包含Activity和Service ForeGround 事件) 阅读详情

相关推荐

关于 UsageStatsManager.queryUsageStats 的注意事项及 UsageStatsService 的简单原理

问题背景: 目前需求统计应用的当天使用情况,在 5.0 以上有权限 android.permission.PACKAGE_USAGE_STATS,获取到该权限后可以通过 UsageStatsManager.queryUsageStats(int intervalType, long beginTime, long endTime) 方法查询到应用的使用情况。 问题描述: 第一天下午使用一些应用后,...

菜鸟的自我修养 1万+

Android 应用使用数据统计服务——UsageStatsManager

先了解下相关知识。

fromVillageCoolBoy的博客 2636

Android应用使用时长统计:基于UsageStatsManager的完整实现指南

在Android应用开发中,系统权限管理与后台数据采集是构建高级功能的基础。Android系统通过UsageStatsManager服务,为开发者提供了官方、高效的应用使用情况统计能力,其原理是系统内核统一收集所有应用的活动事件并聚合为可查询的数据。这项技术的核心价值在于,它避免了开发者自行监听应用前后台切换所带来的不准确与耗电问题,同时确保了数据的权威性和隐私合规性。在数字健康、家长控制、应用行为分析等场景中,精确统计应用使用时长和启动次数是核心需求。本文聚焦于PACKAGE_USAGE_STATS权限的

weixin_33910385的博客 444

UsageStatsManager总结

总结 1、功能 UsageStatsManager用于查询应用使用详情,配置详情,事件日志数据,开发过程中可以通过这个接口获取应用使用数据,然后自定义展示方式。本地数据存储在/data/system/usagestats/目录下,该目录下以不同的类型分为5个文件夹,分别是: daily weekly monthly yearly version 当查询的时候,对应了四个不同的变量,去查询对应文件...

Chuck Chan的专栏 4976

android5.0用UsageStatsManager来获取程序运行时间

android5.0用UsageStatsManager来获取程序运行时间 本来想用PkgUsageStats来获取的,后来看到有人说5.0以后可以直接用UsageStatsManager来获取信息,而不用之前麻烦的反射了

CryRabbit的博客 6376

Android应用使用时长与次数监控:UsageStatsManager实战指南

在Android应用开发中,应用行为分析与用户时间管理是常见的需求,尤其在数字健康、设备管理等场景下。其核心原理是通过系统提供的API来精确统计应用的前台活跃时间与启动次数,而非简单的打开记录。这一技术价值在于能够为开发者提供规范、高效且低功耗的数据采集方案,替代传统的后台轮询等低效方法。在具体实现上,Android系统自5.0版本起引入了UsageStatsManager服务,它作为系统的“时间记录官”,基于应用使用事件(如MOVE_TO_FOREGROUND、MOVE_TO_BACKGROUND)来动态

weixin_34216107的博客 395

【UsageStatsManager】Android 获取设备上应用的使用统计信息

UsageStatsManager 是 Android 系统中一个强大的服务,它允许应用程序在获得用户授权的情况下,查询设备上其他应用的使用情况统计信息。这个 API 在 Android 5.0 (API 级别 21) 中被引入,为开发者提供了分析应用使用行为、构建数字健康类应用等能力。

特立独行的博客 2614

Android应用使用时长统计实战:从UsageStatsManager权限申请到数据查询全解析

在Android应用开发中,系统权限管理与后台数据获取是构建高级功能的核心基础。Android系统通过权限机制保护用户隐私与设备安全,其中特殊权限如使用情况访问权限(Usage Access)需用户手动授权,涉及AppOpsManager等底层框架。理解权限申请流程与后台服务限制,对于实现可靠的数据统计功能至关重要。UsageStatsManager作为系统提供的应用使用情况“记账员”,其数据查询与聚合机制能帮助开发者获取精确的应用前台时长与启动次数。这一技术广泛应用于数字健康、家长控制、应用行为分析等场景

weixin_30561425的博客 287

Android获取应用使用时长和次数-UsageStatsManager使用

最近在做暑研,要求是需要获取到Android手机中的应用使用情况,经过查找,发现Android提供了 UsageStatsManager类来帮助进行应用使用信息的统计(注明,Android5.0系统大部分手机不支持这个类,Android5.1系统之后完全支持[1], 显然现在大部分手机都是支持的),这篇文章主要记录一下这个类的使用方法。 授权 想要使用这个类来获取应用使用信息,首先需要对app进行授权,我们需要在AndroidManifest.xml文件中加入uses-permission <uses

weixin_45951701的博客 1万+

Android应用使用统计与分析:UsageStatsManager实践指南

在Android系统中,了解和追踪应用的使用情况对于开发者和企业来说至关重要。这些数据可以帮助开发者优化应用性能,提升用户体验,并为企业提供有价值的信息,如用户行为分析和市场趋势预测。本章将概述Android应用使用情况追踪的重要性、基本原理以及其在不同场景下的应用。本章将引导读者从基础到进阶,逐步深入了解如何通过Android提供的工具和API实现对应用使用情况的追踪。我们将首先介绍,这是Android系统用于追踪应用使用数据的API,之后会探讨如何在实际应用中解析和分析这些数据。

weixin_29717341的博客 2086

sentaurus学习笔记(HFET_pGate_GaN仿真)(九)

`(sdedr:define-constant-profile-placement "Ohmic.s" "Ohmic" "Pl.ohmic.s" 0.002)`这一行将`"Ohmic"`掺杂剖面放置在`"Pl.ohmic.s"`参考评估窗口中,同样`0.002`可能表示掺杂剖面在窗口中的偏移量或其他参数。欧姆接触是半导体器件中的一种低阻抗电气接触,通常需要高掺杂来减少接触电阻并提高器件性能。通过这些步骤,SDE能够为器件的源极和漏极区域设置高掺杂的欧姆接触,这对于确保器件的高性能和低接触电阻至关重要。

qq_52640792的博客 1382

UsageStatsManager 获取应用使用情况

获取应用使用情况涉及的类是UsageStatsManager ,用于获取包含特定时间范围的应用包的使用情况统计信息;在Android api21(即Android5.0引入);系统API稳定性好,Android5.0及以后版本都支持,不存在版本兼容问题。 一.判断应用是否具有此权限的方式如下: public boolean isGrantedUsagePremission(Conte...

weixin_39352694的博客 3654

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7412

Android获取前台运行应用包名UsageStatsManager和ActivityManager结合

获取前台运行应用的包名 在这之前我一直使用ActivityManager获取前台运行包名,因为APP有系统签名的问题在Android6.0并没有受到API限制,在Android6.0用上系统签名使用ActivityManager.getRunningAppProcesses()一切正常,不过这些天在Android7.0和9.0上发现这个API只能获取自己本身,一查看说这个方法在Android5.1就推荐不再使用了。啊?是这样吗?哪为啥getRunningAppProcesses()被划一条横线,也没有注解被

Felix的博客 4960

Windows 10/11系统下TurboDesign 6.4.0完整安装指南(附序列号+破解补丁)

本文提供Windows 10/11系统下TurboDesign 6.4.0的完整安装指南,涵盖系统环境预检、安装程序部署、序列号处理及破解补丁部署等关键步骤。通过详细的安装教程和优化配置,帮助用户高效完成这款涡轮机械设计软件的安装与调试,解决常见兼容性问题。

s4t5u6v的博客 1029

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 921

Android5.0通过UsageStatsManager获取应用使用情况

目前需求统计应用的当天使用情况,在 5.0 以上有权限android.permission.PACKAGE_USAGE_STATS,获取到该权限后可以通过UsageStatsManager.queryUsageStats(int intervalType, long beginTime, long endTime)方法查询到应用的使用情况。 首先需要在AndroidManifest.xml里声明权限 <uses-permission android:name="android.permis...

王温暖的博客 1880

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

android 应用使用情况统计,Android已安装应用使用时长统计-UsageStatsManager

先看效果图应用使用时长统计截图源码地址Step1 授权必须确保设备的Android版本>=Android5.1(v22),少部分Android5.0(v21)可以使用UsageStatsManager在AndroidManifest.xml文件中添加权限说明,这是一个system级别的权限,加上tools:ignore="ProtectedPermissions"可以屏蔽调AS的红线(强逼症...

weixin_42405705的博客 2387

详解vit_base_patch16_224

ViT-Base模型的核心思想是将输入图像划分为多个小块(patches),并使用Transformer架构来处理这些小块。具体来说,ViT-Base使用16x16像素的patch大小,输入图像的尺寸为224x224像素,这意味着每张图像将被划分为49个patch(22416×22416=14×14=19616224​×16224​=14×14=196个patch)。ViT-Base(ViT-B/16)通过将图像处理任务转化为序列处理任务。

具身机器人和通用AI 3221

霜冰优化算法(RIME)详解:从自然现象到智能优化

霜冰优化算法(RIME)是一种新型元启发式优化算法,灵感源于自然界中霜冰的形成过程。该算法通过模拟软霜和硬霜的不同生长特性,实现了高效的全局探索和局部开发平衡。RIME算法包含三个核心机制:软霜搜索策略模拟随机覆盖特性实现全局探索;硬霜穿刺机制模拟定向生长特性进行局部开发;正向贪婪选择机制确保解的持续优化。与遗传算法、粒子群算法相比,RIME具有参数少、收敛快、自适应平衡等优势,特别适合处理高维复杂优化问题。算法已在工程优化、机器学习等领域获得广泛应用,发表一年内即成为高被引论文。

qq_42212808的博客 780

获取Android当前运行的activity之UsageStatsManager

前言:之前总结了如何获取当前界面正在运行的APP包名,也就是上一个博客。这里做一下补充。 UsageStatsManager是用来统计app使用情况的类,用于获取包含特定时间范围的应用包的使用情况统计信息;在Android api21(即Android5.0引入);系统API稳定性好,Android5.0及以后版本都支持,不存在版本兼容问题。 UsageStatsManager源码 下面看如何使用...

一个Android菜鸟的博客 1867

Arduino ESP8266通过 RF433数据收发实验

Arduino ESP8266通过 RF433射频模块实现数据收发实验 写这篇文章,折腾了2天,在没有成功之前,一直在摸索和采坑当中,不要问我黑暗和黎明之间有多长。开发很多时候只问结果,不问过程的,在这里分享来之不易的结果,希望后面的人不要采坑,有成功的案例先河,后面与之相关的应用开发只需要套用模板修改即可实现。 实物搭建 RF433模块 我使用的是这个:nodemcu 本案例开发所使用到的库:RadioHead:http://www.airspayce.com/mikem/

perseverance51博客 3806

Android 通过UsageStatsManager获取App使用情况

Android 5.0之后提供了UsageStatsManager来获取App使用情况。

LX_LE的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android.app.usage,android – 使用UsageStatsManager获取前台应用程序

我正在尝试使用UsageStatsManager在带有Marshmallow的Nexus 5上获取前台应用程序.我记得它曾经工作,但由于某种原因我现在得到包/类名称的空字符串.这是我的实施public String[] getForegroundPackageNameClassNameByUsageStats() {String packageNameByUsageStats = null;Str...

weixin_33204286的博客 770

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: ViewPager或Fragment中使用Fragment(二)
下一篇: 安卓获取顶层应用的包名
安卓鸟
博客等级 码龄15年 14粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值