2012-06-10 10 views
2

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

Вот мой код:

Класс настройки будильника:

//FIXME - rename (ie BackgroundSave; more descriptive) 
public class AlarmReceiver extends Service{ 

    //FIXME - make sure you kill the service 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(getApplication().getApplicationContext(), "Service onCreate called", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(getApplication().getApplicationContext(), "Service started", Toast.LENGTH_SHORT).show(); 
     setAlarm(AlarmReceiver.this); 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     return START_STICKY; 
    } 

    public void setAlarm(Context c) { 
     AlarmManager alarmManager = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(c, Alarm.class); 
     PendingIntent pi = PendingIntent.getBroadcast(c, 0, i, 0); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 1000, 1000, pi); 
     Toast.makeText(c.getApplicationContext(), "setAlarm called", Toast.LENGTH_SHORT).show(); 
    } 

    public void cancelAlarm(Context context) { 
     Intent intent = new Intent(context, Alarm.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

Вот это BroadcastReceiver:

public class Alarm extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm", Toast.LENGTH_SHORT).show(); 
    } 

} 

И вот мой манифест:

<!-- Alarm --> 
     <service android:name="com.xxxx.android.tools.AlarmReceiver" android:enabled="true" /> 
     <receiver android:name="com.xxxx.android.tools.Alarm" ></receiver> 

Тревога onReceive никогда не срабатывает.

ответ

1

Вы должны использовать android.os.SystemClock.elapsedRealtime() в качестве основного времени при использовании AlarmManager.ELAPSED_REALTIME_WAKEUP.

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

Посмотрите на Handler.postAtTime().

+0

Г-н Мориц, вот и все. Я ценю направление. Откуда вы столкнулись с этой информацией? Было ли это в API-интерфейсах где-то, и я замалчивал его (ужасная привычка, которую мне нужно и нужно сломать). Что касается AlarmManager, то он запускается только тогда, когда пользователь не может сохранить свой контент из-за сетевых проблем. Я надеюсь, что это запустится в фоновом режиме, сохраните, когда сеть будет доступна, а затем выключится. Я буду исследовать Handler.postAtTime(). Опять же, я ценю помощь. –

+0

Отлично. Подумайте о принятии ответа. :) Подробности для флага можно найти в javadocs: http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME_WAKEUP – Moritz

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