Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取当前前台活动的包名称?_Java_Android - Fatal编程技术网

Java 如何获取当前前台活动的包名称?

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(

我四处看了看类似的问题,每个答案都有一个共同点,那就是它们不适用于大于21的API

以下代码片段仅适用于20或更低版本的API:

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:这并不总是获得前台活动。如果有一个服务在前台运行,那么它将返回该服务的包名,而不是前台活动。有什么办法吗?