Android/App개발2009. 8. 4. 14:43
=========================================
                 AlarmManager
=========================================

extends Object
java.lang.Object
  -> android.app.AlarmManager

Class Overview
  system alarm service에 대한 접근을 제공함. 이는 미래의 임의시점에 app의 스케쥴을 조정할수 있도록 해준다. 
알람이 발생하면 이전에 등록해둔 Intent가 system에 의해 broadcast된다. target app가 동작중이 아니라면 자동으로 시작해준다. 등록된 alarm은 device가 sleep일때도 유지된다. 하지만 기기가 꺼지고 재시작되면 사라진다.

  AlarmManager는 alarm receiver의 onReceive()가 수행중인 동안에는 CPU의 wake lock을 유지한다. 이는 당신이 broadcast가 처리완료되기 전에는 다시 sleep이 되지 않도록 해준다. onReceive()가 리턴되면 AlarmManager는 wakelock을 해재한다.  

  onReceive()에서 Context.startService()를 호출한다면 해당 service가 launch되기전에 sleep으로 빠질수 있다. 이런 경우를 막기 위해 BroadcastReceiver와 Service에서 서비스가 활성화되기 전에 sleep으로 넘어가지 않도록 각기 wake lock정책을 구현할 필요가 있다.

이 class는 직접 new하지 않고 아래와 같이 사용해야 한다.



---------------------
AlarmClock 예
---------------------
native application 중 AlarmClock의 예를 들어 자세히 설명하겠다.\

AlarmClock.java : main activity
AlarmProvider.java : Alarm등록, 수정 및 해제관련 DB access
AlarmReceiver.java : receive된 Alarm broadcast를 처리(AlarmAlert activity를 start)

...


=========================================
                 PowerManager
=========================================

device의 power state를 제어할수 있게 해준다. device 배터리사용시간은 이 API의 사용에 따라 영향을 받게 된다. 반드시 필요한 경우가 아니라면 Wakelock을 acquire하지 않는것이 좋다. 가능한 낮은 레벨을 사용하고 사용후에는 바로 release하는것이 좋다.

  Context.getSystemService(Context.POWER_SERVICE); 로 인스턴스를 얻을 수 있다.

아주 기초적인 API인 newWakeLock()를 사용할것이다. 이 API는 PowerManager.WakeLock객체를 만든다. device의 powerstate를 제어하기 위해 이 객체의 method를 사용하게 된다.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
 wl.acquire();
   ..screen will stay on during this section..
 wl.release();
system전원에 영향을 미치는 flag가 아래와 같이 정의되어 있다.

Flag ValueCPUScreenKeyboard
PARTIAL_WAKE_LOCKOn* Off Off
SCREEN_DIM_WAKE_LOCKOn Dim Off
SCREEN_BRIGHT_WAKE_LOCKOn Bright Off
FULL_WAKE_LOCKOn Bright Bright
** partial wakelock을 유지하는 동안 CPU는 계속 run상태로 된다. 어떤 타이머타 사용자가 power button을 누르더라도 상태는 유지가 된다. 나머지 wakelock은 CPU가 run상태가 되지만 사용자가 power button을 눌러서 sleep으로 갈수 있다.

Screen에만 적용되는 2가지 flag가 더 있다. 이 플래그는 PARTIAL_WAKE_LOCK에는 영향을 안준다.

Flag ValueDescription
ACQUIRE_CAUSES_WAKEUPNormal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASEIf this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.


Posted by 삼스