java - 如何获取当前前台活动的包名?
问题描述
我查看了类似的问题,每个答案都有一个共同点,那就是它们不适用于大于 21 的 API。
这个片段只适用于 20 或更低的 API:
ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE);
String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();
然后是使用UsageStats的那个。奇怪的是,尽管这是关于 SO 最常发布的答案,但此方法仅适用于一个 API,即 21,即 Android 5.0。它甚至不适用于 Android 5.1。
有没有一种现代的方式有效?谢谢阅读。
解决方案
以下返回当前顶级包的 Observable 的方法可能有效:
public Observable<String> topPackageNameObservable() {
return Observable.fromCallable(() -> {
String topPackageName = "";
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> stats =
mUsageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_DAILY,
System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1),
System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1));
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (!mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
} else {
topPackageName = mActivityManager.getRunningAppProcesses().get(0).processName;
}
} else {
topPackageName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
} catch (Exception e) {
e.printStackTrace();
}
return topPackageName;
});
}
推荐阅读
- asp.net-mvc - 有人知道如何在 webpack-dev-server 或类似中代理 index.html 吗?
- rxjs - 错误 TS2339:“可观察”类型上不存在属性“过滤器”
' - swift - 为什么 URL 在这里需要强制解包或默认值?
- ubuntu - Ubuntu 图表中截断的表名
- javascript - javascript debounce:如何获取 e.target?
- angular - 使用 Typescript 在 Angular 中忽略 GET 请求上未定义的属性集
- mongodb - 通过字段使用 Mongoose 进行查询
- python - 通过标记它们来替换文件中的多个字符串
- javascript - 如何将 D3 csv 数据转换为不同的变量
- razor - 如何在 donet core 2.1 中创建自定义 taghelper