* AlarmManager로 슬립 깨우기

PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,
		new Intent(this, UpdaterReceiver.class),
		PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
		60*60, pendingIntent);

알람 매니저를 사용해서 슬립 상태를 깨울 수 있다. 하지만 반복해서 UI를 갱신하는 작업을 할 때 알람 매니저를 사용한다면 펜딩 인텐트에 브로드캐스트 리시버를 등록하고 리시버는 다시 액티비티에 등록된 브로드캐스트 리시버로 이벤트를 보내야 한다. 많이 번거롭다. 대안으로 onResume()에서 기존 지연 Message를 제거하고 새로 실행하는 것이다. 화면이 ON 될 때, 지연 시간이 이미 지났으면 화면을 즉시 업데이트하고 지연 시간이 아직 남았으면 재계산한다. 다음은 그에 관한 코드이다.

private TextView title;

@Override 
protected void onCreate(Bundle saveInstanceState){
	....
	registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
}

@Override
protected void onDestroy(){
	unregisterReceiver(receiver);
	super.onDestroy();
}

private static final int DELAY_TIME = 2*60*1000;
private long executedRealtime;

private BroadcastReceiver receiver = new BroadcastReceiver(){
	@Override
	public void onReceive(Context context, Intent intent){
		long diff = SystemClock.elapsedRealtime() - executedRealtime;
		handler.removeCallbacks(updateTImeTask);
		handler.postDelayed(updateTimeTask,
				diff>=DELAY_TIME ? 0 : DELAY_TIME - diff);
	}
};

private Runnable updateTimeTask = new Runnable(){
	@Override
	public void run(){
		executedRealtime = SystemClock.elapsedRealtime();
		title.setText(new Date().toString());
		handler.postDelayed(this, DELAY_TIME);
	}
};

public void onCLickButton(View view){
	handler.post(updateTimeTask);
}

화면을 OFF 하면 onStop까지 호출되기 때문에 브로드캐스트 리시버 등록과 해제는 onCreate와 onDestroy에서 했다. 


* 참고로 AlarmManager는 전원이 꺼지면 제거된다. 따라서 알람을 사용한다면 알람 데이터를 DB에 저장하고 ACTION_BOOT_COMPLETED 액션을 받는 브로드캐스트 리시버를 만들어서 부팅시 알람을 다시 등록해야 한다.

* 앱을 업데이트하면 재부팅 하지 않는 한 업데이트 전에 등록한 알람이 유지된다.

+ Recent posts