Android 按用户扩展状态栏会扭曲我的getFrontPackage()功能

Android 按用户扩展状态栏会扭曲我的getFrontPackage()功能,android,Android,我有一个服务,他的主要目标是获取当前可见应用程序的包名。这是负责它的代码: try { if (Build.VERSION.SDK_INT > 20) { UsageStatsManager usm = (UsageStatsManager) service.getSystemService(Context.USAGE_STATS_SERVICE); Calendar calendar = Calend

我有一个服务,他的主要目标是获取当前可见应用程序的包名。这是负责它的代码:

try {
            if (Build.VERSION.SDK_INT > 20) {
                UsageStatsManager usm = (UsageStatsManager) service.getSystemService(Context.USAGE_STATS_SERVICE);
                Calendar calendar = Calendar.getInstance();
                long endTime = calendar.getTimeInMillis();
                calendar.add(Calendar.DAY_OF_WEEK, -1);
                long startTime = calendar.getTimeInMillis();

                List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
                if (usageStatsList != null && usageStatsList.size() > 0) {
                    Collections.sort(usageStatsList, new UsageStatsComparator());
                    UsageStats mUsageStats = usageStatsList.get(0);
                    return mUsageStats.getPackageName();
                }

                else {
                if (!Utils.usageAccessGranted(service) && !directToSettingAlreadyTookPlace) {
                    launchUsageStatsSetting(service);
                }
                return "";
            }
        } else {
            ActivityManager mActivityManager = (ActivityManager) service.getSystemService(Context.ACTIVITY_SERVICE);
            return mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
        }
    } catch (Exception e) {
        Log.e("Error", "Getting Front Package Failed " + e.toString());
        return "";
    }
试试看{
如果(Build.VERSION.SDK_INT>20){
usagestastmanager usm=(usagestastmanager)service.getSystemService(Context.USAGE\u STATS\u service);
日历=Calendar.getInstance();
long-endTime=calendar.getTimeInMillis();
calendar.add(calendar.DAY/u周,-1);
long startTime=calendar.getTimeInMillis();
List usagestastslist=usm.queryUsageStats(usagestastmanager.INTERVAL_DAILY、startTime、endTime);
if(usagestastslist!=null&&usagestastslist.size()>0){
Collections.sort(usagestastslist,newusagestastcomparator());
UsageStats mUsageStats=usageStatsList.get(0);
返回mUsageStats.getPackageName();
}
否则{
如果(!Utils.usageaccessgrated(service)&&!directToSettingAlreadyTookPlace){
启动状态设置(服务);
}
返回“”;
}
}否则{
ActivityManager mActivityManager=(ActivityManager)service.getSystemService(Context.ACTIVITY_service);
返回mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
}捕获(例外e){
Log.e(“错误”,“获取前端包失败”+e.toString());
返回“”;
}
这是我使用的比较器:

public class UsageStatsComparator implements Comparator<UsageStats> {



    @Override
    public int compare(UsageStats lhs, UsageStats rhs) {

        if(Build.VERSION.SDK_INT > 20)
        {
            long time1 = lhs.getLastTimeUsed();
            long time2 = rhs.getLastTimeUsed();
            if (time1 > time2) {
                return -1;
            } else if (time1 < time2) {
                return 1;
            }
            return 0;
        }
        else
            return 0;

    }

}
公共类UsageStatsComparator实现Comparator{
@凌驾
公共整数比较(UsageStats lhs、UsageStats rhs){
如果(Build.VERSION.SDK_INT>20)
{
long-time1=lhs.getLastTimeUsed();
long-time2=rhs.getLastTimeUsed();
如果(时间1>时间2){
返回-1;
}否则如果(时间1<时间2){
返回1;
}
返回0;
}
其他的
返回0;
}
}
这个问题发生在棒棒糖和转发设备上

在用户使用状态栏之前,一切正常。一旦扩展,我开始获取与通知相关的包,最有问题的是当用户关闭状态栏时,我没有获取可见应用程序的包,我仍然会获取状态栏打开时收到的最后一个包

这可能会导致所需功能出现重大问题

我尝试了以下方法:

  • Get在状态栏扩展时发出通知。我进行了深入的搜索,但我找到的唯一解决方案只能由一个活动处理,但在我的情况下,这是不可能的,因为我正在通过一个服务工作

  • 我的服务总是在状态栏中以自定义远程视图的形式显示通知。我试图找到一种方法来知道用户是否可以看到通知,但没有成功


  • 有人知道如何解决这个问题吗

    我在这里找到了解决方案:

    解决方案是使用UsageEvents
    关键是检查您找到的前端包是否具有以下事件类型:event.MOVE_TO_front

    我在这里找到了我的解决方案:

    解决方案是使用UsageEvents
    关键是检查您找到的前端包是否具有以下事件类型:event.MOVE_TO_front

    是否尝试对上述api 20运行getRunningAppProcesses()。@santoXme IgetRunningAppProcesses()将返回设备上运行的所有进程的列表。我以前试过,但我不知道哪一个是最前面的。我感觉它就在我的比较仪里。我编辑了我的答案并添加了我的比较程序,或者您是否尝试为上述api 20运行getRunningAppProcesses()。@santoXme IgetRunningAppProcesses()将返回设备上运行的所有进程的列表。我以前试过,但我不知道哪一个是最前面的。我感觉它就在我的比较仪里。我编辑了我的答案并添加了我的比较器