[英]How to get the package name of the current foreground activity?
我查看了類似的問題,每個答案都有一個共同點,那就是它們不適用於大於 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。
有沒有一種現代的方式有效? 謝謝閱讀。
以下返回當前頂部 package 的 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;
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.