2011-03-25 6 views
6

내 응용 프로그램에서 알람을 설정하고 있습니다.강제 종료 응용 프로그램 - 설정된 경보를 취소합니다.

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

제대로 작동합니다. 시스템 설정 -> 응용 프로그램으로 들어가서 응용 프로그램을 강제 종료하면 일정이 잡힌 모든 경보를 취소하는 효과가있는 것으로 보입니다. 사실입니까? 그렇다면, 나는 마지막으로 알려진 설정이 사용자가 실제로 알람을 설정했지만 시스템이 내 등 뒤에서 취소되었을 수있는 이상한 상황에 처해 있으므로 이제 사용자에게 잘못된 상태를 보여주고 있습니다. 알람 설정 여부.

고맙습니다

답변

2

예. 그렇습니다. 내가 아는 한 당신이 할 수있는 것은 당신의 신분을 바로 잡는 것입니다. 당신의 경보가 아직 없습니다 당신은 2 단계를 취할 수 있는지 확인하려면 : - 기능 checkPendingIntent 정확히 PendingIntent.getBroadcast에서이 플래그를 제외하고 makePendingIntent 및 결과의 수표처럼 될 것이다 PendingIntentFLAG_NO_CREATE과를 만들

  1. Atempt을 - 알람이 일반적인 방법으로 취소 된 경우 (물론 PendingIntent에 대해 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>);