2011-03-25 11 views
6

Moja aplikacja jest ustawienie alarmu:Aplikacja zatrzymania siły - również anuluje ustawione alarmy?

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

działa dobrze. Jeśli przejdę do ustawień systemowych -> aplikacji i wymuszam zatrzymanie aplikacji, wydaje się, że to również skutkuje anulowaniem wszelkich zaplanowanych alarmów. Czy to prawda? Jeśli tak, to jestem w dziwnej sytuacji, w której moje ostatnie ustawienia są takie, że użytkownik w rzeczywistości ustawił alarm, ale system mógł zostać anulowany za moimi plecami, więc teraz pokazuję użytkownikowi niewłaściwy stan, czy alarm jest ustawiony, czy nie.

Dzięki

Odpowiedz

2

Tak, to prawda. Wszystko, co możesz zrobić, o ile wiem, to poprawienie twojego statusu. Aby sprawdzić, czy alarmy są nadal trzeba wziąć 2 etapy:

  1. Atempt stworzyć swój PendingIntent z FLAG_NO_CREATE - funkcja checkPendingIntent będzie dokładnie jak makePendingIntent wyjątkiem tej flagi w PendingIntent.getBroadcast i czek wyniku - jeśli alarm został anulowany w zwykły sposób (sam, oczywiście, jeśli zadzwoniłeś pod numer cancel() dla twojego PendingIntent s) lub jeśli twoja aplikacja uległa awarii bez Force Stop (tj. z nieprzechwyconym wyjątkiem), PendingIntent.getBroadcast zwróci wartość null.
  2. Jeśli istnieje opcja PendingIntent, można ustawić alarm. Aby to sprawdzić, musisz zrzucić informacje systemowe o wszystkich alarmach i wyszukać tam swoje. Aby zrzucić informacje trzeba zadzwonić

    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(); 
    } 
    

    aby korzystać dumpsys trzeba mieć uprawnienia użytkownika zrzutu. Kiedy masz zrzut można zidentyfikować Cię alarmy w niej przez Ciebie nazwy pakietu, więc kontrola będzie

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