* 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 액션을 받는 브로드캐스트 리시버를 만들어서 부팅시 알람을 다시 등록해야 한다.
* 앱을 업데이트하면 재부팅 하지 않는 한 업데이트 전에 등록한 알람이 유지된다.
'안드로이드 > 기본' 카테고리의 다른 글
마커(Marker) 인터페이스, 어노테이션(Annotation) 활용 (0) | 2017.08.03 |
---|---|
안드로이드 태스크, launchMode, Intent 플래그 총정리 (0) | 2017.08.03 |
안드로이드 액티비티(Activity) 생명주기 총정리 (0) | 2017.08.02 |
minSdkVersion, targetSdkVersion, compileSdkVersion 란? (0) | 2017.07.30 |
이해하기 쉬운 RecyclerView (1) | 2017.07.27 |