2012-01-16 19 views
8

Użyłem tego samego w toku, aby ustawić wiele alarmów przy użyciu różnych intentId dla każdego alarmu. alarm działa. Teraz chcę anulować dany alarm. Jeśli użyję metody cancel(), to w końcu anuluję wszystkie alarmy. Chcę, aby usunięto tylko konkretny. Również użytkownik powinien mieć możliwość anulowania tego alarmu nawet podczas drugiego lub trzeciego uruchomienia. Podobnie jak w przypadku, gdy uruchomię go po raz drugi, nie będę mieć tego samego obiektu oczekującego. Czy musiałbym utrzymać obiekt oczekujący? Jeśli tak to jak? i jak mogę anulować pojedynczy alarm z wielu alarmów?Anulowanie pojedynczego alarmu w przypadku wielu alarmów

+0

Nie znam metody anulowania pojedynczego alarmu na zestawie alarmów o tym samym zamiarze w toku. Można jednak oznaczyć konkretny czas alarmu jako anulowany za pomocą pewnej metody utrwalania (wspólne preferencje, plik, sqlite, ...) oraz w kodzie wywoływanym przez intencję alarmu Oceń zapisaną informację, aby określić, czy alarm został anulowany. Możesz również anulować wszystkie alarmy i ustawić wszystkie oprócz jednego później (jeśli nadal wiesz, ile razy). BTW, nie potrzebujesz oryginalnego zamiaru, możesz utworzyć nowy. – Stefan

Odpowiedz

8

Można zrobić to w ten sposób,

W swojej Czeka intencyjny można przekazać unique ID w miejsce requestCode

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0); 

i anulować MOŻESZ użyj tego samego unikalnego identyfikatora, aby go anulować, wykorzystując ten sam Pending Intent.

am.cancel(pi); 

Dla uzyskania więcej informacji można po prostu używać StackOverflow lub Google, na razie myślę this answer zrobi dla ciebie. :)

+0

Jeśli ustawisz unikalny_id na czas alarmu w milisekundach, możesz zagwarantować, że będzie unikalny. Dlatego możesz łatwo to anulować. Sprawdziłem to. Metodą kalendarza jest calendar.getTimeInMillis() – bschwagg

3

Oto rodzaj hack do tego z wyjaśnieniem.

Przede wszystkim powinieneś stworzyć unikalną intencję dla oczekującej intencji. W tym celu możesz utworzyć niestandardowe pole danych dla swojej aplikacji. Zrobić to w następujący sposób:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
       String.valueOf(intentId)); 
intent.setData(data); 

W twoim przypadku intentId będzie twój unikalny identyfikator intencji.

Następnie należy utworzyć powiadomienie alarmManager w zwykły sposób. Aby anulować alarm, wykonaj następujące czynności. Na początku powinieneś stworzyć intencję jak w poprzednim przykładzie kodu. Następnie tworzysz oczekujące intencje na podstawie tego zamiaru (tworzysz również ten sam oczekujący na alarm). A potem anulować alarm:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
      String.valueOf(intentId)); 
intent.setData(data); 


PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context, 0, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
Powiązane problemy