380 likes | 540 Views
16. 서비스. 학습목표 서비스는 백그라운드에서 실행되는 프로세스이다 . 사용자와 상호작용 없이 배경에서 지속적으로 실행되는 데몬 제작 방법에 대해 실습하고 데몬이 사용자에게 알림을 보낼 수 있는 통지와 알람 등의 기술을 익힌다 . 내용 통지 BR 서비스. 1. 통지. 백그라운드 알림 통지 ( Notification ) : 백그라운드 프로세스가 사용자와 통신할 수 있는 좀 더 확실한 방법
E N D
16 서비스
학습목표 • 서비스는 백그라운드에서 실행되는 프로세스이다. • 사용자와 상호작용 없이 배경에서 지속적으로 실행되는 데몬 제작 방법에 대해 실습하고 데몬이 사용자에게 알림을 보낼 수 있는 통지와 알람 등의 기술을 익힌다. • 내용 • 통지 • BR • 서비스
1. 통지 • 백그라운드 알림 • 통지(Notification) : 백그라운드 프로세스가 사용자와 통신할 수 있는 좀 더 확실한 방법 • 통지는 최초 잠깐 보이지만 토스트와 달리 사용자가 확인하기 전에는 아이콘이 계속 표시되며, 소리나 진동, 불빛 같은 좀 더 적극적인 방법으로 사용자에게 신호를 보낸다. • 상태란을 아래로 드래그하여 확장하거나 Home화면 메뉴에서 Notification항목을 선택하면 통지에 대한 상세한 정보가 출력된다.
1. 통지 • 백그라운드 알림 • 통지를 출력하려면 통지 관리자(NotificationManager)와 통지 객체(Notification) 둘을 사용해야 하는데 미리 준비해야 할 것이 많아 번거롭다. • 통지 객체의 생성자는 다음과 같다. • Notification(int icon, CharSequencetickerText, long when) • Icon은 상태란에 표시될 작은 그림, tickerText는 통지 영역에 아이콘이 처음 나타날때 잠시 출력될 짧은 문자열이며, when은 통지가 발생한 시간을 지정하여 System.currentTimeMillis메서드로 구한 현재 시간을 지정하는 것이 보통이다. • 생성자로 객체를 생성한 후에도 icon, tickerText, when 등의 필드에 값을 직접 대입하여 통지의 내용을 변경할 수 있다. • 실행 중에도 언제든지 값들은 변경 가능하다.
1. 통지 • 백그라운드 알림 • 필드들에 값을 대입함으로써 통지를 전달하는 방법을 다음과 같이 상세하게 지정한다.
1. 통지 • 백그라운드 알림 • 시스템은 디폴트 소리와 진동 기능을 제공하는데 defaults필드에 어떤 기능을 시스템이 제공하는 디폴트로 사용할 것인가를 다음과 같이 지정한다. • flag 필드에는 통지의 동작 및 관리방법을 다음과 같이 지정한다.
1. 통지 • 백그라운드 알림 • 속성을 설정한 후 확장 상태란에 표시될 정보와 사용자가 통지 객체를 선택했을 때의 반응을 다음 메서드로 지정한다. • void setLatestEventInfo (Context context, CharSequencecontentTitle, CharSequencecontentText, PendingIntentcontentIntent) • 확장 상태란 : 타이틀 영역보다 넒으므로 조금 더 길고 상세한 메시지를 전달할 수 있다. • PendingIntent클래스는 인텐트를래핑하며 다른 응용 프로그램으로 전달하여 실행 권한을 준다는 점에서 보통의 인텐트와 다르다. • Intent는 사용자가 통지 객체를 탭했을 때의 동작을 지정하며, 주로 액티비티를 띄우는데 인텐트에는FLAG_ACTIVITY_NEW_TASK플래그를 지정해야 한다. • 통지 관리자는 시스템이 제공하는 서비스이므로 객체를 직접 생성할 필요 없이 다음 호출문으로 구한다. • getSystemService(NOTIFICATION_SERVICE)
1. 통지 • 통지 출력 • 통지 기능을 이용한 예제를 통해 실습해 보자.
1. 통지 • 통지 출력 • 통지 기능을 이용한 예제를 통해 실습해 보자.
1. 통지 • 커스텀통지 뷰 • 확장된 상태란에 출력되는 문자열들은 setLatesEventInfo메서드로 간편하게 지정할 수 있다.
1. 통지 • 커스텀통지 뷰 • 통상적인 뷰로 생성해서 안되면 프로세스의 경계를 넘어 출력할 수 있는 RemoteView클래스의 객체를 생성해야 한다. • 생성자로 패키지 이름과 레이아웃 리소스의 id를 전달한다. • RemoteViews(String packageName, intlayoutId) • 이미지와 텍스트 내용이 고정적이라면 XML파일에 미리 대입해 놓는 것이 편하며, 통지의 내용에 따라 가변적이라면 다음 메서드로 이미지와 텍스트를 실시간으로 결정해서 대입한다. • setImageViewResource(intviewId, intsrcId) • setTextViewText(intviewId, CharSequence text)
2. BR • 방송 • 방송을 청취하려는 응용 프로그램은 BR(Broadcast Receiver : 방송 수신자)를 작성해 두고 관심 있는 방송을 수신한다. • BR은 안드로이드 응용 프로그램을 구성하는 4개의 컴포넌트 중 하나로서 오로지 방송 수신 대기만 하며 사용자와 직접 대면은 하지 않는다. • BroadcastReceiver클래스로부터 상속받으며 방송을 수신하는 다음 메서드를 재정의 한다. • void onReceive (Context context, Intent intent) • 방송이 수신되면 onReceive메서드가 호출되며, context는 BR이 실행되는 컨텍스트이며 intent는 수신된 방송 내용이다. • BR은 프로세스의 메인 스레드에서 실행된다. • 10초 내로 onReceive메서드가리턴하지 않으면 시스템은 응답이 없는 것으로 판별하여 강제로 죽인다.
2. BR • 방송 • 방송은 응용 프로그램끼리 통신하는 공식적인 수단을 활용하는데 응용 프로그램이 방송을 할 때는 다음 메서드로 호출한다. • void sendBroadcast (Intent intent [, String receiverPermission]) • void sendOrderedBroadcast (Intent intent, String receiverPermission) • Intent인수는 전달하고자 하는 방송 내용이며 액션에 방송의 주 내용을 대입하며 인텐트의 다른 필드에 추가 정보도 전달할 수 있다. • 일반 방송은 비동기적으로 동작하여 호출 시 즉시 리턴한다. • 순서 있는 방송은 인텐트 필터의 android:priority속성이 지정하는 중요도에 따라 수신 순서가 결정되어 차례대로 전달된다.
2. BR • 방송 (실습 예제)
2. BR • 방송 • 액티비티가 실행중인 동안만 방송을 수신하려면 코드에서 BR을 일시적으로 등록 해 놓을 수 있으며, 필요할 때만 방송을 수신하려면 매니페스트에 등록할 필요없이 다음 메서드로 등록 및 해제 한다. • Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter) • void unregisterReceiver (BroadcastReceiver receiver) • 등록 메서드로BR객체와 인텐트 필터를 전달한다. • BR을 등록하는 최적의 시점은 onResume이며 등록을 해제할 최적의 시점은 onPause이다.
2. BR • 방송 (실습 예제2)
2. BR • 방송 (실습 예제2)
2. BR • 배터리감시 • 모바일 장비는 항상 배터리로 동작하며 배터리가 없으면 아무것도 할 수 없으며 배터리의 남은 양은 모든 응용 프로그램이 관을 가져야 할 중요한 정보이다. • 배터리와 관련된 방송들은 다음과 같이 여러 가지가 있다. • 대개의 경우 ACTION_BATTERY_CHANGED방송만 청취해도 변화는 다 알아낼 수 있다.
2. BR • 배터리감시 • 배터리 상태에 대한 상세한 정보는 인텐트의Extras에 실려 방송 수신자에게 전달된다 • 조사 가능한 값들은 BatteryManager클래스에 상수로 정의되어 있다.
2. BR • 배터리감시 (실습 예제)
2. BR • 배터리감시 (실습 예제)
2. BR • 배터리감시 (실습 예제)
2. BR • 배터리감시 • 에뮬레이터는 배터리를 쓰지 않기 때문에 충전의 개념이 없으며 테스트해 보기 쉽지 않으며 항상 충전 중으로 표시되며 충전 레벨은 50%로 고정되어 있다. • 에뮬레이터에서 테스트 해보려면 텔넷으로 에뮬레이터에 접속한 후 배터리의 상태를 인위적으로 변경하는 명령을 다음 실행과 같다. • telnet localhost 5554 • 5554는 에뮬레이터와 연결되는 포트 번호이며 에뮬레이트넌 통상 5554번이다. • 텔넷이 없는 시스템에서는 Zterm이나 putty같은 공개 텔넷 프로그램을 사용할 수 있다.
2. BR • 배터리감시 • Putty로 에뮬레이터에 접속하는 모습은 다음과 같다.
2. BR • 배터리감시 • 텔넷에 접속한 후 다음 명령으로 에뮬레이터의 배터리 상태를 변경해 볼 수 있다.
2. BR • SD 카드 감시 • 안드로이드는SD카드를 외부 저장 장치로 사용하며 데이터 파일은 모두 SD 카드에 저장해야 한다. • SD카드는 장비의 전원이 들어와 있는 상태에서 언제든지 삽입, 분리, 교체가 가능하다. • SD카드와 관련된 방송 액션은 다음과 같다.
2. BR • SD 카드 감시 (실습 예제)
2. BR • SD 카드 감시 (실습 예제)
2. BR • 알람 • 알람은 미리 지정해 놓은 시간에 이벤트를 방생시키는 시스템 장치이다. • 알람은 운영체제가 관리하며 응용 프로그램 외부에서도 설정 가능하다. • 알람은AlarmManager클래스로 관리하며, 시스템 서비스이며 공개된 생성자가 없으므로 직접 생성할 수 없으며 컨텍스트의 다음 메서드로인스턴스를 구한다. • Context.getSystemService(Context.ALARM_SERVICE); • 알람 매니저의 다음 메서드로알람을 등록하며 한번만 동작하는 알람과 주기적으로 반복하는 알람 두 가지 종류가 있다. • void set (int type, long triggerAtTime, PendingIntent operation) • void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) • set메서드는 딱 한번만 동작하는 알람을 등록하며 setRepeating은 주기를 정해 놓고 반복적으로 동작하는 알람을 등록한다.
2. BR • 알람 • 인수type은 예약 시간을 해석하는 방법과 예약 시간에 장비가 슬립 모드일 때 장비의 기동 여부를 지정하는데 다음 4가지 값 중 하나를 사용할 수 있다. • triggerAtTime인수는 알람을 기동할 시간을 지정하는데 포맷은 type에 따라 달라진다.
2. BR • 알람(실습 예제)
2. BR • 알람(실습 예제)
3. 서비스 • 데몬 • 서비스는 백그라운드에서 실행되며 사용자와 직접적인 상호작용은 하지 않는다. • 클라이언트에서 어떤 식으로 호출하는가에 따라 다음 두 가지 사용 방법이 있다. • 백그라운드 데몬 : 배경에서 계속 실행되는 프로세스이다. • 원격 호출 인터페이스 : 클라이언트를 위한 특정한 기능을 제공하는 역할은 한다. • 서비스의 생명주기는 액티비티에 비해서 아주 단순하다.
3. 서비스 • 데몬 (실습 예제)
3. 서비스 • 데몬 (실습 예제)
3. 서비스 • 원격 인터페이스 • 안드로이드는 원격 인터페이스를 정의하는 AIDL이라는 별도의 언어를 제공하며 AIDL컴파일러가 인터페이스 정의를 구현하는 스텁까지 생성해 준다. • AIDL소스를 작성하여 프로젝트에 포함시켜 놓으면 AIDL컴파일러가 인터페이스를 구현하는 자바 파일을 생성하여 gen 폴더에 배치한다. • 다음 소스는 Icalc 인터페이스에 최소 공배수를 조사하는 메서드와 소수 여부를 조사하는 메서드의 원현을 선언하는 예이다.
3. 서비스 • 원격 인터페이스 (실습 예제)