Java 如何在前台服务运行时检测当前前台应用

Java 如何在前台服务运行时检测当前前台应用,java,android,Java,Android,我目前正在开发一个AppLock,其中包括检测当前前台应用程序的服务,但问题是,即使在我最小化AppLock或关闭AppLock后,该服务仍将AppLock本身作为当前前台应用程序返回。有办法解决这个问题吗 我知道其他类似的问题已经得到了回答,但据我所知,没有其他人有和我一样的问题 下面是我用来检测前台应用程序的代码 public String getForegroundApp() { String currentApp = "NULL"; UsageStatsManager

我目前正在开发一个AppLock,其中包括检测当前前台应用程序的服务,但问题是,即使在我最小化AppLock或关闭AppLock后,该服务仍将AppLock本身作为当前前台应用程序返回。有办法解决这个问题吗

我知道其他类似的问题已经得到了回答,但据我所知,没有其他人有和我一样的问题

下面是我用来检测前台应用程序的代码

public String getForegroundApp() {

    String currentApp = "NULL";
    UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
    long time = System.currentTimeMillis();
    List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
    if (appList != null && appList.size() > 0) {
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
        for (UsageStats usageStats : appList) {
            mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
        }
        if (mySortedMap != null && !mySortedMap.isEmpty()) {
            currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
        }
    }
    else {
        ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    return currentApp;
}
我用来启动服务的接收器:

public class RestartReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent lol) {
        Log.i("running in the back","restarting");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(new Intent(context, MyService.class));
        } else {
            context.startService(new Intent(context, MyService.class));
        }
    }
}
注意:foreapp和lockedApp都是字符串变量


currentApp返回的字符串始终是com.example.apptest3,这是我正在处理的程序包名称。

您无法获得自Android L以来的顶级活动,但有一种解决方法,可以使用ActivityManager.RunningAppProcessInfo在用户启动应用程序时获得重要性,.

自Android L以来,您无法获得最重要的活动,但使用ActivityManager有一个解决方法。当用户启动应用程序时,运行AppProcessInfo
重要性可以获得。

问题不再存在。我使用Tarun Sharma在前面的一个问题中提供的答案解决了这个问题,如果有人面临与我相同的问题,请继续。

问题不再存在。我使用Tarun Sharma在前面的一个问题中提供的答案解决了这个问题,如果有人面临与我相同的问题,请继续。

我不确定您为什么认为这会起作用。queryUsageStats不保证它的结果被排序,也不保证应用程序是前台应用程序。你的备份呼叫getRunningAppProcesses也会返回前台和后台应用程序,但不保证顺序。你能建议一种只返回当前打开的应用程序的方法吗?我尝试了很多获取前台应用程序的方法,但它们仍然产生相同的结果。我不确定你为什么认为这会起作用。queryUsageStats不保证它的结果被排序,也不保证应用程序是前台应用程序。您的备份调用getRunningAppProcesses也会返回前台和后台应用程序,但不保证顺序。您能建议一种只返回当前打开的应用程序的方法吗?我尝试了很多方法来获取前台应用程序,但它们仍然产生相同的结果。您能指定适合您的解决方案吗?我去了那个链接,但是没有一个是为我工作的。他们要么只是在applock被最小化后才检测到applock,要么在最小化applock后无法检测到任何东西。你能指定对你有效的解决方案吗?我去了那个链接,但是没有一个是为我工作的。他们要么只是在苹果锁被最小化后才检测到苹果锁,要么在最小化苹果锁后无法检测到任何东西
public class RestartReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent lol) {
        Log.i("running in the back","restarting");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(new Intent(context, MyService.class));
        } else {
            context.startService(new Intent(context, MyService.class));
        }
    }
}