Android 强制停止应用程序-是否也取消其设置的所有报警?

Android 强制停止应用程序-是否也取消其设置的所有报警?,android,Android,我的应用程序正在设置警报: AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); mgr.setRepeating( AlarmManager.RTC_WAKEUP, firstRun, interval, makePendingIntent(context)); 很好。如果我进入系统设置->应用程序,并强制停止我的应用程序,这似乎也有取消我计划的任何警报的效果。

我的应用程序正在设置警报:

AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(
  AlarmManager.RTC_WAKEUP, 
  firstRun, 
  interval, 
  makePendingIntent(context));
很好。如果我进入系统设置->应用程序,并强制停止我的应用程序,这似乎也有取消我计划的任何警报的效果。这是真的吗?如果是这样的话,我就处于一种奇怪的情况下,我最后知道的设置是用户实际上设置了警报,但系统可能在我背后取消了,所以我现在向用户显示了错误的状态,即是否设置了警报


谢谢

是的,这是真的。据我所知,你所能做的就是使你的地位正确。要检查您的警报是否仍然存在,您必须采取两个步骤:

  • a尝试使用
    标志创建您的
    PendingEvent
    -如果报警已以普通方式取消,则功能
    CheckPendingEvent
    将与
    MakePendingEvent
    完全相同,除了
    PendingEvent.getBroadcast中的此标志和结果检查(当然,如果您为您的
    pendingent
    s调用
    cancel()
    ),或者如果您的应用程序在没有强制停止的情况下崩溃(即出现未捕获的异常),
    pendingent.getBroadcast
    将返回null
  • 如果PendingEvent存在,则可能会设置您的报警。要检查报警,您必须转储有关所有报警的系统信息并在那里搜索您的报警。要转储信息,您必须调用

    String collectAlarmsInfo() {
        StringBuilder result = new StringBuilder();
        try {
            Process process = Runtime.getRuntime().exec("dumpsys alarm");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
                result.append("\n");
            }
        } catch (IOException e) {
            Log.e(TAG, "Could not retrieve data", e);
        }
        return result.toString();
    }
    
    要使用dumpsys,您需要具有用户权限DUMP。当您拥有DUMP时,您可以通过包名在其中标识您的报警,因此检查将被取消

    boolean alarmIsSet = collectAlarmsInfo().contains(<your package name>);
    
    布尔alarmIsSet=collectAlarmsInfo().contains();