强制停止应用程序 - 也取消它设置的任何警报?

问题描述:

我的应用程序设置一个警报:强制停止应用程序 - 也取消它设置的任何警报?

AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
mgr.setRepeating(
    AlarmManager.RTC_WAKEUP, 
    firstRun, 
    interval, 
    makePendingIntent(context)); 

工作正常。如果我进入系统设置 - >应用程序,并强制停止我的应用程序,看起来这也具有取消我预定的任何警报的效果。这是真的?如果是这样,我处于一种奇怪的情况,那就是我最后一次知道的设置是用户实际上设置了闹钟,但系统可能已经取消了我的背后,所以我现在向用户展示了错误的状态是否设置警报。

谢谢

是的,的确如此。就我所知,你所能做的就是让你的状态正确。要检查您的警报仍然存在,你必须采取两个步骤:

  1. Atempt创建您PendingIntentFLAG_NO_CREATE - 功能checkPendingIntent会完全一样,除了这个标志makePendingIntentPendingIntent.getBroadcast和结果的检查 - 如果报警已被以普通方式取消(当然,如果您为您的PendingIntent s调用cancel()),或者如果您的应用在没有强制停止的情况下崩溃(例如未捕获的异常),则PendingIntent.getBroadcast将返回null。
  2. 如果PendingIntent存在,则可能会设置警报。要检查它,你必须转储关于所有警报的系统信息并在那里搜索你的。要转储信息,您必须致电

    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。当你有转储你可以找出你在它的报警由你包的名字,所以检查将

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