版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/82744332
使用usage statistics API,这个API本来是系统用来统计app使用情况的,包含了每个app最近一次被使用的时间。我们只需要找出距离现在时间最短的那个app,就是当前在前台的app。
类和方法
类 | 方法 | 说明 |
---|---|---|
UsageStaticsManager | – | app使用统计的管理者 |
– | queryUsageStats (int intervalType, long beginTime, long endTime) | 按照条件查询,结果是List,API>=21 |
UsageStats | – | app使用统计信息类 |
– | getPackageName() | 获取包名,API>=21 |
– | getLastTimeUsed() | 最后的使用时间,API>=21 |
首先需要在AndroidManifest里声明权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
如果不声明权限,会导致打开的设置界面没有我们的应用。
实现方法:
/**
* 判断手机当前前台显示的APP
* @param context
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private String getForegroundApp(Context context) {
/**
* 此功能需要在设置的(允许查看使用情况的应用)里打开,在很多手机设置里没有发现这一入口。
需要在代码里打开,注意要判断一下系统版本
*/
// if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
// }
boolean isInit = true;
UsageStatsManager usageStatsManager =
(UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long ts = System.currentTimeMillis();
List<UsageStats> queryUsageStats =
usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, ts);
UsageEvents usageEvents = usageStatsManager.queryEvents(isInit ? 0 : ts-5000, ts);
if (usageEvents == null) {
return null;
}
UsageEvents.Event event = new UsageEvents.Event();
UsageEvents.Event lastEvent = null;
while (usageEvents.getNextEvent(event)) {
// if from notification bar, class name will be null
if (event.getPackageName() == null || event.getClassName() == null) {
continue;
}
if (lastEvent == null || lastEvent.getTimeStamp() < event.getTimeStamp()) {
lastEvent = event;
}
}
if (lastEvent == null) {
return null;
}
return lastEvent.getPackageName();
}