오늘은 DeskClock App에서 Alram  Event를 발생시키는 부분과 Alram BroadCast 처리하는 부분을 살펴 보려고 한다.

최초에 생각은 Process를 띄워서 Alaram BroadCast를 Generating 시킬것이라고 생각했었는데,
소스를 보고나선 역시나... 그따위로 할리가 없었다ㅋㅋㅋ

Android Package 중에 AlaramManager(android.app.AlarmManager)라는 녀석이 있어서, 그 서비스를 이용하는것이다. 

DeskClock 소스내에
com.android.deskclock.Alarams 가 실제로 AlaramManager를 이용하여, Alaram서비스를 등록한다.

    public static long addAlarm(Context context, Alarm alarm) {

        ContentValues values = createContentValues(alarm);

        Uri uri = context.getContentResolver().insert(

                Alarm.Columns.CONTENT_URI, values);

        alarm.id = (int) ContentUris.parseId(uri);


        long timeInMillis = calculateAlarm(alarm);

        if (alarm.enabled) {

            clearSnoozeIfNeeded(context, timeInMillis);

        }

        setNextAlert(context);

        return timeInMillis;

    


addAlaram() Method가 실제로 알람을 추가 하는데,
여기선 직접적으로 AlramManager도 사용하지 않고, Data Handling도 하지 않는다.
단순히, ContentResolver를 통해서 Data를 삽입하고, setNextAlert()을 통해서 다음 알람을 세팅한다.

setNextAlram()는 alram이 있냐 없냐를 봐서 없으면 Disable , 있으면 Enable시키는데, 
일단 관심은 AlaramManager를 사용하는 파트 임으로, 제끼고 
enableAlert() Method를 보도록 하자.

 private static void enableAlert(Context context, final Alarm alarm,

            final long atTimeInMillis) {

        AlarmManager am = (AlarmManager)

                context.getSystemService(Context.ALARM_SERVICE);


        if (Log.LOGV) {

            Log.v("** setAlert id " + alarm.id + " atTime " + atTimeInMillis);

        }


        Intent intent = new Intent(ALARM_ALERT_ACTION);


        Parcel out = Parcel.obtain();

        alarm.writeToParcel(out, 0);

        out.setDataPosition(0);

        intent.putExtra(ALARM_RAW_DATA, out.marshall());


        PendingIntent sender = PendingIntent.getBroadcast(

                context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);


        am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);


        setStatusBarIcon(context, true);


        Calendar c = Calendar.getInstance();

        c.setTimeInMillis(atTimeInMillis);

        String timeString = formatDayAndTime(context, c);

        saveNextAlarm(context, timeString);

    }


보면 사실 별것은 없고,  AlramManager Object를 얻어오고, Intent를 만들고,
Alram에서 넘어온 시간 값 함꼐 am.set으로 넘겨 주는 이정도 이다.

실제로 사용하는건 참 간단하다고 볼 수 있다.

다음번에는 AlramManager가 trig 하는 BroadCast를 어떻게 받아서 처리 하는지 보면
기본적으로 Alaram Service 사용을 알 수 있다.

내 생각에 추가로 ContentResoulver() 쪽만 스터디 하고 나면, 
Alram App 하나정도는 금방 만들수 있지 않을까 생각한다.


+ Recent posts