2016-07-14 5 views
1

Я делаю приложение, где вы можете установить аварийные сигналы. Например, у меня есть класс по понедельникам в 7 часов, поэтому мне нужно начинать будильник каждый понедельник, но у меня есть еще один класс во вторник, и мне нужно сделать то же самое.аварийные сигналы тревоги android alarmmanager после перезагрузки 2016

Я уже могу это сделать и работает с сигналом тревоги для каждого curso, но когда я перезагружаю мобильный телефон, они не работают.

Вот мой код нанесенная экстра так важна в моем приложении:

Calendar cal = Calendar.getInstance(); 
    cal.setTimeInMillis(System.currentTimeMillis()); 
    cal.set(Calendar.HOUR_OF_DAY, horai); 
    cal.set(Calendar.MINUTE, minutoi); 
    cal.set(Calendar.DAY_OF_WEEK, dias.getSelectedItemPosition() + 1); 
    cal.add(Calendar.SECOND, 2); 



    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
    intent.putExtra("name", curso); 
    //intent.putExtra("curos bn",1); 
    PendingIntent pendingIntent = 
      PendingIntent.getBroadcast(getBaseContext(), 
      cont, intent, PendingIntent.FLAG_UPDATE_CURRENT);//cont star with 1 a then ++ 

RECEIVER

public class AlarmReceiver extends BroadcastReceiver { 

private static final String TAG = "BANANEALARM"; 
Intent intent; 
PendingIntent pendingIntent; 
NotificationManager notificationManager; 
private static final int PERIOD=5000; 
@Override 
public void onReceive(Context context, Intent intent) { 



    Log.i(TAG, "BroadcastReceiver has received alarm intent."); 
    Intent service1 = new Intent(context, AlarmService.class); 
    String id = intent.getStringExtra("name"); // this is so important 
    service1.putExtra("name",id); 
    context.startService(service1); 

}

Manifets

<receiver android:name=".AlarmReceiver" android:enabled="true" > 

    </receiver> 
    <service android:name=".AlarmService" /> 

Так что в другой части моего приложения я устанавливал аварийные сигналы с данными, которые я получаю от json. Все работает, как будто я хочу, чтобы проблема была только при перезагрузке телефона?

ответ

3

Согласно developer.google.com

Зарегистрированные сигналы сохраняются в то время как устройство спит (и опционально может разбудить устройство, если они уходят в это время), но будет очищен, если он выключен и перезагружен.

Поэтому вам нужно будет создать другой приемник, который воссоздал бы все ваши тревоги. Этот приемник не является вашим сигналом AlarmReceiver, он не обрабатывает активированные аварийные сигналы. Он используется только для их сброса после перезагрузки.

Для этого вам нужны эти строки кода:

AndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application 

    <!-- rest of the code --> 

    <receiver android:name=".AlarmBroadcastReceiver"/> 

    <service android:name=".BootService"/> 

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

RestartAlarmsReceiver.java

public class RestartAlarmsReceiver extends BroadcastReceiver { 

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

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

      // It is better to reset alarms using Background IntentService 
      Intent i = new Intent(context, BootService.class); 
      ComponentName service = context.startService(i); 

      if (null == service) { 
       // something really wrong here 
       Log.e(TAG, "Could not start service "); 
      } 
      else { 
       Log.e(TAG, "Successfully started service "); 
      } 

     } else { 
     Log.e(TAG, "Received unexpected intent " + intent.toString()); 
     } 
    } 
} 

BootService.java

public class BootService extends IntentService { 

    public BootService() { 
     super("BootService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     // Your code to reset alarms. 
     // All of these will be done in Background and will not affect 
     // on phone's performance 

    } 
} 
+0

ОК спасибо, но в каждом тревожном намерении я установил дополнительный «intent.putExtra» («name», curso); это просто строка, но это имя каждого курса, и мне нужно, чтобы это было – fer

+0

. Это не проблема. Вы можете добавить любое количество Экстра в свои намерения. Если вы найдете этот ответ полезным, пожалуйста, Примите и отпустите его. :) – Marat

0

Вы можете слушать перезагрузку событий, а затем делать то, что вы хотите, когда перезагрузка телефона

В вашем манифеста

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

... 

<receiver android:name=".YourBootReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

Ваш Java код

public class YourBootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //do what you want 
    } 
} 
+0

этот <приемник android: name = ".YourBootReceiver "> Мне нужно создать новый приемник, или я должен изменить свой <приемник android: name =". AlarmReceiver "android: enabled =" true "> – fer

+0

public void onReceive (контекстный контекст, намерение намерения) { // делать то, что вы хотите } в этой части мне нужны данные с дополнительного места, как я могу получить его. – fer

+0

YourBootReceiver - это новый ресивер, который получает перезагрузку телефона. И onReceive происходит, когда перезагрузка телефона завершена , в этой функции вы можете снова установить будильник.Я не знаю, какие данные вам нужно получить там? – Fuyuba

0

Ядро вызывает тревогу, когда ваш время срабатывания будильника, но после перезагрузки он не может сохранить состояние вашего будильника. Поэтому вы должны перезагрузить будильник, если пользователь перезагрузит устройство.

Android разработчик дает свой ответ here

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