Java 如何获取当前前台活动的包名称?
我四处看了看类似的问题,每个答案都有一个共同点,那就是它们不适用于大于21的API 以下代码片段仅适用于20或更低版本的API:Java 如何获取当前前台活动的包名称?,java,android,Java,Android,我四处看了看类似的问题,每个答案都有一个共同点,那就是它们不适用于大于21的API 以下代码片段仅适用于20或更低版本的API: ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE); String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName(
ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE);
String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();
还有一个使用了UsageStats。奇怪的是,尽管这个方法是最常见的发布答案,但它只适用于一个API,即21,即Android 5.0。它甚至不能在安卓5.1上运行
有没有一种现代的方法能起作用?感谢阅读。以下方法返回当前顶级软件包可能工作的可观察值:
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;
});
}
public Observable-topPackageNameObservable(){
返回可观察。从可调用(()->{
字符串topPackageName=“”;
ActivityManager MacActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
试一试{
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
UsageStatsManager mUsageStatsManager=(UsageStatsManager)getSystemService(Context.USAGE\u STATS\u SERVICE);
列出统计数据=
mUsageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL\u每日,
System.currentTimeMillis()-TimeUnit.DAYS.toMillis(1),
System.currentTimeMillis()+TimeUnit.DAYS.toMillis(1));
if(stats!=null){
SortedMap mySortedMap=newtreemap();
for(UsageStats UsageStats:stats){
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
如果(!mySortedMap.isEmpty()){
topPackageName=mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}否则{
topPackageName=mActivityManager.GetRunningAppProcesss().get(0).processName;
}
}否则{
topPackageName=mActivityManager.getRunningTasks(1.get(0.topActivity.getPackageName();
}
}捕获(例外e){
e、 printStackTrace();
}
返回topPackageName;
});
}
Hi什么是fromCallable()
方法?我得到的错误是,它不存在于Observable
类这里我需要Observable,您可以将返回类型更改为string并省略fromCallableCORRECTION:这并不总是获得前台活动。如果有一个服务在前台运行,那么它将返回该服务的包名,而不是前台活动。有什么办法吗?