我有一个
Service
,即使应用程序完全关闭,它也始终在后台运行。在这项服务中,我有一个 BroadcastReceiver
让我知道设备是否正在充电:
@Override
public void onBatteryStatusChanged(BatteryUtils.Status status) {
if (status.getStatus() == BatteryUtils.BatteryStatus.CHARGING) {
if(!AppUtils.isAppRunning(getPackageName()))
LogUtils.dTag(Constants.TAG, "APP SHOULD LAUNCH NOW");
}
}
public static boolean isAppRunning(final String pkgName) {
ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(Integer.MAX_VALUE);
if (taskInfo != null && taskInfo.size() > 0) {
for (ActivityManager.RunningTaskInfo aInfo : taskInfo) {
if (aInfo.baseActivity != null) {
if (pkgName.equals(aInfo.baseActivity.getPackageName())) {
return true;
}
}
}
}
List<ActivityManager.RunningServiceInfo> serviceInfo = am.getRunningServices(Integer.MAX_VALUE);
if (serviceInfo != null && serviceInfo.size() > 0) {
for (ActivityManager.RunningServiceInfo aInfo : serviceInfo) {
if (pkgName.equals(aInfo.service.getPackageName())) {
return true;
}
}
}
}
return false;
}
我的目标:
插入充电器后即启动应用程序,但前提是该应用程序尚未启动。
我的问题:
当我检查应用程序是否正在运行时,它总是返回
TRUE
,即使应用程序已关闭。出现此行为的原因是该服务在后台运行,导致整个应用程序被视为正在运行。
您正在检查您的
Service
是否正在运行,当然它正在运行,因此此方法将始终返回 true
。使用 getRunningTasks()
并非用于此目的,并且可能不可靠,尤其是对于较新的 Android 版本。
您应该做的是将当前“充电”状态存储在共享首选项中。每当您的
BroadcastReceiver
被触发时,请将新的“充电”状态与您存储在共享首选项中的状态进行比较。如果它们不同并且新状态是“正在充电”,那么您可以启动您的应用程序。