5

Mam Service "GroupsTaskAlarmChecker", która jest wywoływana co 20 sekund AlarmManager w onCreate aktywności Groups.class ten sposób:AlarmManager wewnątrz BroadcastReceiver gdy BOOT_COMPLETED

int seconds = 20; 

      Intent myIntent = new Intent(Groups.this, GroupsTaskAlarmChecker.class); 
      pendingIntent = PendingIntent.getService(Groups.this, 0, myIntent, 0); 

      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, 10); 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), seconds * 1000, pendingIntent); 

to działa doskonale. Ale muszę to zrobić po uruchomieniu urządzenia. Wtedy wiem, że muszę zrobić AndroidManifest tak:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name=".ReceiverBoot"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"> 
      <category android:name="android.intent.category.HOME"> 
     </category></action></intent-filter> 
    </receiver> 

a potem mi broadcastReceiver tak:

public class ReceiverBoot extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    int seconds = 20; 

     Intent myIntent = new Intent(context, GroupsTaskAlarmChecker.class); 
     pendingIntent = PendingIntent.getService(context, 0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.add(Calendar.SECOND, 10); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), seconds * 1000, pendingIntent); 

    } 
} 

ale wewnątrz tego onReceive nie wiem, jak mogę zrobić to samo, że zrobiłem przed (z intencją i alarmManager, aby uruchomić usługę co 20 sekund). błąd w tej linii:

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

Czy to możliwe, że nie mogę zrobić AlarmManager wewnątrz BroadcastReceiver?

Dziękuję wszystkim, jestem początkującym Androidem i potrzebuję twojej pomocy. Przepraszam za mój angielski;)

+0

Zapomniałem napisać wiersz w tym pytaniu, ale nie w kodzie @ Jacob. i init, które odbierają nadawanie działa (zanim przetestuję działanie init i jego ok), chcę tylko wiedzieć o napisaniu pierwszego kodu, który napisałem do metody onReceive. czy to możliwe? – carlosdiazp

Odpowiedz

1

ALARM_SERVICE jest ani zdefiniowane w ReceiverBoot klasy ani w BroadcastReceiver.

Powinieneś odwołać się do Context.ALARM_SERVICE jako argumentu dla getSystemService (String).

0

w onReceive:

if ("android.intent.action.BOOT_COMPLETED".equals (intent.getAction())){ 

    //start it again here 

} 
+0

ale mój problem polega na tworzeniu kodu: Muszę uczynić instancję i AlarmManager wewnątrz broadcastReceive. I nie wiem jak to zrobić:/ – carlosdiazp

+0

Spróbuj tego samego kodu, który masz powyżej – MariusBudin

+0

(jeśli zmienię konteksty) bez ostrzeżeń i błędów, ale tak w tej linii: AlarmManager alarmManager = (AlarmManager) getSystemService (ALARM_SERVICE); Problem z tą metodą i zmienną wewnątrz odbiornika telewizyjnego ... Czy mogę nie wykonać AlarmManager w antenie broadcastReceiver ?? – carlosdiazp

3

Podsumowując odpowiedzi i komentarze powyżej: procedura obsługi onReceive otrzymuje kontekst, w którym można uzyskać dostęp do usług getSystemService i ALARM_SERVICE. Przykładowy kod:

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Start periodic service. 
     Calendar cal = Calendar.getInstance(); 
     Intent srvIntent = new Intent(context, MyService.class); 
     PendingIntent pIntent = PendingIntent.getService(context, 0, srvIntent, 0); 
     // Use context argument to access service 
     AlarmManager alarm = 
         (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

     // Repeat every 5 seconds 
     alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
           5000, pIntent); 
     } 
    } 
} 

Utwórz nową klasę z tym kodem i zmiany kursu MyReceiver i MojaUsluga do nazw w swojej realizacji.

1

Oto mały wkład, który moim zdaniem może dodać bardziej kompletną wizję osiągnięcia celu tego pytania.

Najpierw: skonfiguruj "odbiornik" w AndroidManifest z aplikacji.

<receiver 
    android:name=".AlarmBroadcastReceiver" 
    android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

drugie: z klasy, która rozszerza klasa abstrakcyjna BroadcastReceiver, należy ustalić, czy Intent Akcja była „BOOT_COMPLETED”. Jeśli warunek jest spełniony, możesz wywołać metodę z twojej klasy, która ma całą konstrukcję do twojego alarmu.

Zobacz poniższy fragment poniżej.

public class AlarmBroadcastReceiver extends BroadcastReceiver { 

    String TAG = "ALARMS"; 
    String CLASS = this.getClass().getSimpleName() + ": "; 

    Context alarmContext; 

    @Override 
    public void onReceive(final Context context, Intent intent) { 

     Log.d(TAG, CLASS + "[START] onReceive()... "); 

     alarmContext = context; 

     if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
      Log.d(TAG, CLASS + "BOOT_COMPLETED action has been received."); 
      setAlarmOnBoot(); 
     } 

      Log.d(TAG, CLASS + "[END] onReceive()... "); 

    } 

    public void setAlarmOnBoot() { 

     Log.d(TAG, CLASS + "[START] - setAlarmOnBoot()"); 

     final long beginAt = SystemClock.elapsedRealtime() + 60 * 1000; 
     final long interval = 300000; // 5 minutes 

     try { 
      AlarmManager alarm = (AlarmManager) alarmContext.getSystemService(Context.ALARM_SERVICE); 
      Intent intent   = new Intent(alarmContext, AlarmBroadcastReceiver.class); 
      PendingIntent pIntent = PendingIntent.getService(alarmContext, 0, intent, 0); 
      alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, beginAt, interval, pIntent); 
      Log.d(TAG, CLASS + "the Alarm has been configured successfully (5 minutes) of interval."); 
     } catch (Exception e) { 
      Log.d(TAG, CLASS + "an exception has ocurred while setting the Alarm..."); 
      e.printStackTrace(); 
     } 

     Log.d(TAG, CLASS + "[END] - setAlarmOnBoot()"); 

    } 

} 
+1

niesamowite rozwiązanie, a dzięki za kompletny kod, który jest łatwy do zrozumienia dla początkujących, takich jak ja – Sasa

+1

Nie ma za co, kolego! Uważam, że ten kod nie jest trudny i może poprawić rozwiązania, które mamy tutaj dla tej odpowiedzi. Pozdrowienia :). – ivanleoncz