2012-06-10 5 views
2

백그라운드에서 실행되어 저장 이벤트를 트리거하는 알람을 설정하려고합니다. 지금이 코드를 단추에 첨부하기 만하면됩니다. 버튼을 누르면 토스트 메시지가 작동 중임을 알리기 위해 알람이 시작됩니다. 현재는 BroadcastReceiver에서 onReceive가 실행되는 것을 제외하고는 모든 것이 실행됩니다. 브로드 캐스트 리시버 여기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; 
    } 
} 

된다 : 알람을 설정

클래스 : 여기

내 코드입니다

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

AlarmManager.ELAPSED_REALTIME_WAKEUP을 사용할 때 android.os.SystemClock.elapsedRealtime()을 기본 시간으로 사용해야합니다.

그건 내가 당신의 저장 목적으로 AlarmManager를 사용하는 것이 가장 좋은 방법이 아니라고 생각합니다. 알람 관리자는 상당히 헤비급입니다. 간단한 처리기를 사용하여 저장 작업을 트리거하는 것을 고려해야합니다.

Handler.postAtTime()을 살펴보십시오.

+0

모리츠 씨. 나는 그 방향에 감사한다. 이 정보를 어디서 발견 했습니까? API가 어딘가에 있었는데, 내가 썼다. (끔찍한 습관이 있었고 깨뜨릴 필요가있다.) AlarmManager는 네트워크 문제로 인해 사용자가 콘텐츠를 저장할 수없는 경우에만 시작된다. 네트워크를 사용할 수있을 때를 제외하고 백그라운드에서 실행되도록 한 다음 자체적으로 종료하는 것이 좋습니다. Handler.postAtTime()을 조사 할 것입니다. 다시 한 번 도움을 주시면 감사하겠습니다. –

+0

위대한 도움이되었습니다. 대답을 수락하십시오. :) 플래그에 대한 세부 정보는 javadocs에서 확인할 수 있습니다. http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME_WAKEUP – Moritz

관련 문제