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