▶ Alarm Service

실행화면

 초기 화면                                                             Start Alarm Service 실행화면

  알람 서비스 수행화면                                             알람 서비스 정지


알람을 서비스로 실행하는 방법

소스 위치 : src/com/example/android/apis/app/AlarmService.java, AlarmService_Service.java

▦ AlarmService
IntentSender를 생성, 알람 메니져에 예정되어 있는 서비스를 실행할것이다.

    private PendingIntent mAlarmSender;
  
        mAlarmSender = PendingIntent.getService(AlarmService.this,
                0, new Intent(AlarmService.this, AlarmService_Service.class), 0); 

PendingIntent getService (Context context, int requestCode, Intent intent, int flags)
Context.startService()를 호출하는것 처럼 서비스를 시작할 PendingIntent를 반환한다.
Intent의 특별값(Extras)으로부터 서비스 시작 인자값들은 준다.
매개변수
  context : 어떤 PendingIntent에 의해 서비스를 시작하는 Context
  requestCode : 보낸 사람에 대한 비공개 요청 코드(현재 사용하지 않음)
  intent : 시작된 서비스를 나타내는 Intent
  flags :  FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT 또는 Intent.fillIn()에 의해 지원되는
       다른 flag들. 실제 전달될때 제공되는 Intent의 어떤 불특정 부분을 제어할수 있다.
반환값 : 주어진 매개변수와 일치하는 PendingIntent를 새로 생성하거나 존재할때 반환. FLAG_NO_CREATE 가 제공될경우에만 null을 반환할수 있다.

AlarmService
Class와 매치되는 XML은 alarm_service.xml (AlarmService.java)

        setContentView(R.layout.alarm_service);

button Listener 설정 (AlarmService.java)
        Button button = (Button)findViewById(R.id.start_alarm);
        button.setOnClickListener(mStartAlarmListener);
        button = (Button)findViewById(R.id.stop_alarm);
        button.setOnClickListener(mStopAlarmListener);

Start Alarm button Listener 설정 (AlarmService.java)
현재 시간으로부터 30초 뒤에 알람 서비스 수행
    private OnClickListener mStartAlarmListener = new OnClickListener() {
        public void onClick(View v) {
            // 현재 시간 가져옴
            long firstTime = SystemClock.elapsedRealtime();

            // 알람 설정
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                            firstTime, 30*1000, mAlarmSender);

            Toast.makeText(AlarmService.this, R.string.repeating_scheduled,
                    Toast.LENGTH_LONG).show();
        }
    };

Stop Alarm button Listener 설정 (AlarmService.java)
알람 서비스 취소
    private OnClickListener mStopAlarmListener = new OnClickListener() {
        public void onClick(View v) {
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.cancel(mAlarmSender);

            Toast.makeText(AlarmService.this, R.string.repeating_unscheduled,
                    Toast.LENGTH_LONG).show();
        }
    };

▦ AlarmService_Service
생성시 Notification Manager 설정, 상태바에 아이콘 보여주기, 서비스 스레드 실행
    NotificationManager mNM;

    @Override
    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        // 상태바에 아이콘 보여주기
        showNotification();

        // 서비스 스레드 시작.  
        // 일반적으로 서비스는 메인 스레드 안에서 수행되는데 블럭되지 않기를 원하기에 별도로 스레드를 분리하여 생성하였다.
        Thread thr = new Thread(null, mTask, "AlarmService_Service");
        thr.start();
    }

ShowNotification 함수
    private void showNotification() {
        // In this sample, we'll use the same text for the ticker and the expanded notification
        CharSequence text = getText(R.string.alarm_service_started);

        // 아이콘, 스크롤되는 텍스트, 시간 설정 하여 통지
        Notification notification = new Notification(R.drawable.stat_sample, text,
                System.currentTimeMillis());

        // 사용자가 Activity에서 통지를 선택한다면 PandingIntent 실행한다
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, AlarmService.class), 0);

        // Set the info for the views that show in the notification panel.
        // 통지 패널안에서 보여지는 뷰에대한 정보를 설정
        notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
                       text, contentIntent);

        // 통지를 보낸다.
        // 고유한 번호인 레이아웃 ID를 사용한다, 나중에 취소 할때 사용한다.
        mNM.notify(R.string.alarm_service_started, notification);
    }

void setLatestEventInfo (Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
표준 "최근 이벤트" 레이아웃에 대한 View의 contentView 필드를 설정한다.
icon 과 when 필드를 사용하여 View 안의 아이콘과 시간 필드를 설정한다.

매개변수
  context : 어플리케이션 / 액티비티에 대한 context
  contentTitle : 타이틀 확장 항목에 지정
  contentText : 텍스트 확장 항목에 지정
  contentIntent : 사용자가 확장된 통지를 클릭할때 인텐트를 실행한다. 만약 액티비티라면, 반드시 FLAG_ACTIVITY_NEW_TASK 플래그를 포함해야 한다. Application Fundamentals: Activities and Tasks 에 설명된 데로 작업 관리를 할 필요가 있다.

Binder
클라이언트와 상호작용하는 Object. 더 자세한 예를 보려면 RemoteService를 보라
    private final IBinder mBinder = new Binder() {
        @Override
  protected boolean onTransact(int code, Parcel data, Parcel reply,
          int flags) throws RemoteException {
            return super.onTransact(code, data, reply, flags);
        }
    };

Binder
참고 http://www.flowdas.com/blog/android-binder-kandroid-4th-seminar


안드로이드 바인더(Android Binder) – 안드로이드 RPC 메커니즘의 이해
안드로이드 바인더(Android Binder)가 탄생하기 까지
boolean transact (int code, Parcel data, Parcel reply, int flags)
객체에 대해 일반적으로 작업을 수행한다.

매개변수
  code : 동작을 수행. FIRST_CALL_TRANSACTIONLAST_CALL_TRANSACTION 사이의 숫자를 사용 
  data : 정렬된(마샬링) 데이터를 대상에 보낸다 .반드시 Null이 아니어야 한다. 만약 어떤 데이터를 보낼수 없다면, 비어있는 Parcel(꾸러미)를 여기에 설정
  reply : 정렬된(마샬링) 데이터를 대상으로 부터 받는다. 만약 반환값에 관련이 없는 경우 Null이도 괜찮다.
  flags : 운영 플래그를 추가한다. 기본 RPC에 대한 0 또는 하나의 RPC에 대한 FLAG_ONEWAY 중의 하나

스레드 함수 수행. 15초 동안 슬립.
    Runnable mTask = new Runnable() {
        public void run() {
            // 일반적인 작업을 처리, 예를 들면 30초 동안 Sleep
            long endTime = System.currentTimeMillis() + 15*1000;
            while (System.currentTimeMillis() < endTime) {
                synchronized (mBinder) {
                    try {
                        mBinder.wait(endTime - System.currentTimeMillis());
                    } catch (Exception e) {
                    }
                }
            }

            // 마무리 작업 처리, 서비스 정지
            AlarmService_Service.this.stopSelf();
        }
    };
신고

'Android > ApiDemos' 카테고리의 다른 글

App - Intents  (0) 2010.04.20
App - Dialog  (0) 2010.04.20
App - Alarm - Alarm Service  (0) 2010.04.19
App - Alarm - Alarm Controller  (1) 2010.04.08
App - Activity - Wallpaper  (0) 2010.04.08
App - Activity - Translucent Blur  (1) 2010.04.08
Posted by 까칠코더.


티스토리 툴바