5

У меня есть службы «GroupsTaskAlarmChecker», который вызывается каждые 20 секунд от AlarmManager в OnCreate деятельности Groups.class таким образом:AlarmManager внутри BroadcastReceiver когда 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); 

Это прекрасно работает. Но мне нужно сделать это при загрузке устройства. Тогда я знаю, что я должен сделать AndroidManifest так:

<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> 

, а затем миль BroadcastReceiver как это:

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

    } 
} 

, но внутри этого OnReceive я не знаю, как я могу сделать то же самое, что я делал раньше (с намерением и alarmManager запускать службу каждые 20 секунд). Ошибка в этой строке:

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

Возможно, что я не могу сделать AlarmManager внутри BroadcastReceiver?

Благодарю вас всех, я являюсь разработчиком Android, и мне нужна ваша помощь. Извините за мой английский;)

+0

Я забыл написать эту строку в этом вопросе, но не в коде @Jacob. и init, которые принимают широковещательные работы (до того, как я проведу операцию init и ее ОК), я просто хочу знать о написании первого кода, который я написал, в метод onReceive. Это возможно? – carlosdiazp

ответ

1

ALARM_SERVICE не является ни определено в классе ReceiverBoot ни в BroadcastReceiver.

Вы должны ссылаться на Context.ALARM_SERVICE как аргумент для getSystemService (String).

0

в вашем OnReceive:

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

    //start it again here 

} 
+0

, но моя проблема заключается в создании кода: Мне нужно сделать экземпляр и AlarmManager внутри broadcastReceive. И я не знаю, как это сделать:/ – carlosdiazp

+0

Попробуйте использовать тот же код, который у вас выше – MariusBudin

+0

(если я меняю контексты) никаких предупреждений и ошибок, но да в этой строке: AlarmManager alarmManager = (AlarmManager) getSystemService (ALARM_SERVICE); Проблема с этим методом и переменной внутри широковещательного приемника ... Может быть, я не могу создать AlarmManager внутри broadcastReceiver ?? – carlosdiazp

3

Чтобы обобщить ответы и комментарии выше: обработчик onReceive получает контекст, который можно использовать для доступа к getSystemService и ALARM_SERVICE. Пример кода:

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

Создайте новый класс с этим кодом и изменения курса MyReceiver и MYSERVICE к именам в вашей реализации.

1

Вот небольшой вклад, который, я считаю, может добавить более полное представление о достижении цели этого вопроса.

Первый: настройте «приемник» внутри AndroidManifest из вашего приложения.

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

Второй: с классом, который расширяет абстрактный класс BroadcastReceiver, вы должны определить, является ли Намерение Действие было «BOOT_COMPLETED». Если условие выполнено, вы можете вызвать метод из вашего класса, который имеет всю конструкцию для вашего Тревога.

См. Нижеследующий сниппет.

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

удивительное решение, и спасибо за полный код, который легко понять для начинающих, таких как я – Sasa

+1

Добро пожаловать, приятель! Я считаю, что этот код не так уж трудный и может улучшить решения, которые мы имеем здесь для этого ответа. С уважением :). – ivanleoncz

Смежные вопросы