안드로이드 서비스

35
안안안안안 안안안 2012 년 년년년 년년년년년년년년 년년년 년년년년년 년년 년 년년 1

Upload: tana-rutledge

Post on 31-Dec-2015

81 views

Category:

Documents


0 download

DESCRIPTION

안드로이드 서비스. 2012 년 봄학기 정보컴퓨터공학 부 컴퓨터 소프트웨어 설계 및 실험. 목차. Service Notification Alarm 실습. Service. 서비스 (Service). 백그라운드에서 실행되는 프로세스 화면에 보이지 않으며 UI 가 없음 사용자의 입력과는 무관하게 지속적인 처리나 규칙적인 처리 , 또는 이벤트 처리를 수행하는 작업의 경우에 서비스를 이용하면 좋다 . Ex) MP3 Player, 파일 다운로드 사용자와 통신할 수 있는 방법이 필요 Notification. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 안드로이드  서비스

1

안드로이드 서비스2012 년 봄학기

정보컴퓨터공학부

컴퓨터 소프트웨어 설계 및 실험

Page 2: 안드로이드  서비스

2

• Service

• Notification

• Alarm

• 실습

목차

Page 3: 안드로이드  서비스

3

Service

Page 4: 안드로이드  서비스

4

• 백그라운드에서 실행되는 프로세스

• 화면에 보이지 않으며 UI 가 없음

• 사용자의 입력과는 무관하게 지속적인 처리나 규칙적인 처리 , 또는

이벤트 처리를 수행하는 작업의 경우에 서비스를 이용하면 좋다 .

Ex) MP3 Player, 파일 다운로드

• 사용자와 통신할 수 있는 방법이 필요

Notification

서비스 (Service)

Page 5: 안드로이드  서비스

5

• 서비스를 정의하려면 Service 를 확장하는 새로운 클래스를 만들고 4

개의 메서드를 재정의해야 한다 .

void onCreate()

서비스가 처음 생성될 때 수행되는 메서드

void onDestroy()

stopService() 가 호출되거나 stopSelf() 가 호출되었을 때 수행되는 메서드 . 보통 사용했던 자원들을 해제하는 작업을 한다 .

IBinder onBind(Intent intent)

bindService() 가 호출되었을 때 수행되는 메서드 . 이 메서드에서 서비스와 액티비티 간에 연결을 설정하여 액티비티에서 서비스 안의 메서드를 호출할 수 있게 해준다 .

서비스 만들기 (1/3)

Page 6: 안드로이드  서비스

6

Int onStartCommand(Intent intent, int flags, int startId)

startService() 가 호출되었을 때 수행되는 메서드 . 여기서 실제로 처리를 수행할 백그라운드 스레드를 띄우는 작업을 한다 .

리턴값을 통해 서비스의 재시작 방식을 제어할 수 있다 .

서비스 만들기 (2/3)

정의된 상수 설명START_STICKY 표준 방식 . 서비스가 런타임에 의해 종료되면 항상 재시작되며 , 재시작될

때마다 onStartCommand 가 호출된다 . 이때 전달되는 intent 는 null이다 .지속적인 백그라운드 작업이 필요한 경우나 음악 재생 서비스 등에 적합한 방식

START_NOT_STICKY 서비스가 런타임에 의해 종료되어도 startService 를 다시 호출하지 않으면 해당 서비스는 중지된다 .업데이트나 네트워크 폴링과 같이 규칙적인 처리를 다루는 서비스에 적합 (중지되어도 다음 예약 시점에 다시 호출됨 )

START_REDELIVER_INTENT 서비스가 런타임에 의해 종료되면 startService 를 다시 호출하거나 , 프로세스가 stopSelf 를 호출하기 전에 종료된 경우에만 재시작된다 . 후자의 경우에는 onStartCommand 가 호출되며 , 처리가 덜된 초기 In-tent 가 전달됨 .서비스가 요청받은 명령을 반드시 처리완료 해야 하는 경우에 적합한 방식

Page 7: 안드로이드  서비스

7

Int onStartCommand(Intent intent, int flags, int startId)

flags 인자를 통해 서비스가 어떻게 시작됐는지 알아낼 수 있다 .

• 새로운 서비스를 만들고 난 뒤에는 이를 ApplicationManifest.xml

파일에 등록해야 한다 .

<service android:name=“.MyService” android:enabled=“true”/>

서비스 만들기 (3/3)

flag 설명START_FLAG_RETRY 재시작 방식이 START_STICKY 이면서 서비스가 비정상적인

종료를 당한 후에 재시작되었음을 나타냄START_FLAG_REDELIVER 재시작 방식이 START_REDELIVER_INTENT 이면서 서비스가

stopSelf 를 호출하기 전에 비정상적인 종료를 당한 후에 재시작되었음을 나타냄

Page 8: 안드로이드  서비스

8

• 서비스 시작하기 ComponentName startService(Intent intent)

• 서비스 중지하기 boolean stopService(Intent intent)

• 서비스 스스로 종료하기 void stopSelf(int startId)

서비스 시작 , 중지하기

Page 9: 안드로이드  서비스

9

서비스의 Life Cycle

onCreate()

onStartCommand() onBind()

onDestroy()

startSer-vice()

bindService()

onUnBind()

onReBind()

Service 수행

Page 10: 안드로이드  서비스

10

Notification

Page 11: 안드로이드  서비스

11

• 사용자에게 어플리케이션에서 발생한 이벤트를 알리기 위한 방법

Toast Notification

화면에 메시지가 잠깐 표시되고 자동으로 사라지는 알림

백그라운드 서비스의 알림에 적절

사용자의 인터렉션이 요구되는 알림에는 부적절

Status Bar Notification

시스템의 Status Bar 에 표시되는 알림

백그라운드 서비스의 알림에 적절

Dialog Notification

현재 Activity 에서 알림창을 생성하는 알림 .

Progress Bar 나 사용자의 인터렉션을 요구하는 알림에 적합

알림 (Notification)

Page 12: 안드로이드  서비스

12

Status Notification

상태 표시줄

펼쳐진 상태 표시줄 윈도우 알림 표시줄

Page 13: 안드로이드  서비스

13

• 새로운 알림을 생성해주는 클래스

• 생성자 Notification(int icon, CharSequence tickerText, long when)

알림 생성하기 – Notification 클래스

인수 설명icon 상태 표시줄에 표시할 아이콘tickerText 상태 표시줄에 아이콘이 처음 나타날 때 잠시 출력되는 문자열when 알림의 생성 시간

Page 14: 안드로이드  서비스

14

• 알림 표시줄에 나타낼 내용을 설정하는 Notification 클래스의 메소드

• 함수 원형 void setLatestEventInfo(Context context, CharSequence contentTitle,

CharSequence contentText, PendingIntent contentIntent)

알림 생성하기 - setLat-estEventInfo

인수 설명context 컨텍스트를 의미함 . 보통 알림을 호출하는 액티비티contentTitle 알림 표시줄의 제목contentText 알림 표시줄에 표시할 문자열contentIntent 알림 표시줄이 클릭될 경우 호출될 액티비티를 실행하기 위한 인텐트

Page 15: 안드로이드  서비스

15

• 생성된 Notification 객체를 사용해 실제로 알림을 발생시키거나 이미 발생시킨 알림을 업데이트 , 또는 취소하는 알림 관리 클래스 시스템이 제공하는 서비스이므로 객체를 직접 생성할 필요 없음

• 객체 얻기

• 메서드

알림 발생시키기 – Notification-Manager

함수 원형 설명notify(int id, Notification notifica-tion)

알림을 발생시킨다 . id 는 알림을 구분하는 식별자존재하는 알림의 id 를 사용하면 알림이 update 됨

cancle(int id) 주어지는 id 에 해당하는 알림을 취소한다 .

cancleAll() 현재 발생된 모든 알림을 취소한다 .

Page 16: 안드로이드  서비스

16

알림 예제 (1/2)• 코드

Page 17: 안드로이드  서비스

17

알림 예제 (2/2)

Page 18: 안드로이드  서비스

18

• ServiceExample.java

서비스 예제 (1/4)

Page 19: 안드로이드  서비스

19

• MyService.java (1/2)

서비스 예제 (2/4)

Page 20: 안드로이드  서비스

20

• MyService.java (2/2)

서비스 예제 (3/4)

Page 21: 안드로이드  서비스

21

서비스 예제 (4/4)

Page 22: 안드로이드  서비스

22

• 사용자가 설정해둔 기본값을 사용하는 방법 Notification.defaults

Notification.DEFAULT_LIGHTS

Notification.DEFAULT_SOUND

Notification.DEFAULT_VIBRATE

Notification.DEFAULT_ALL

하드웨어 알림 ( 벨소리 , 진동 , LED)(1/3)

Page 23: 안드로이드  서비스

23

• 벨소리 지정하기 Uri Notification.sound

• 진동 설정하기 진동 기능을 사용하려면 권한이 필요

AndroidManifest.xml 에 다음 코드를 추가해야 함 <uses-permission android:name=“android.permission.VIBRATE”/>

long[] Notification.vibrate

하드웨어 알림 ( 벨소리 , 진동 , LED)(2/3)

Page 24: 안드로이드  서비스

24

• LED 설정하기 Int Notification.ledARGB

LED 의 색상을 지정

Int Notification.ledOnMS, Int Notification.ledOffMS

LED 를 켤 시간과 끌 시간을 1/1000 단위로 지정

ledOnMS 를 1 로 , ledOffMS 를 0 으로 설정하면 LED 가 계속 켜져있게 되며 , 둘 다 0 으로 설정하면 LED 가 꺼짐 .

LED 를 사용하려면 Notification.flags 속성에 다음과 같은 플래그를 설정해야 한다 .

Notification.flags |= Notification.FLAG_SHOW_LIGHTS;

하드웨어 알림 ( 벨소리 , 진동 , LED)(3/3)

Page 25: 안드로이드  서비스

25

• Notification.number 속성을 사용하면 상태 표시줄 아이콘이 나타내는 이벤트의 개수를 표시할 수 있다 .

1 보다 큰 값을 설정하면 그 값이 아이콘 위에 겹쳐 표시됨

0 또는 -1 을 설정하면 숫자가 없어짐

• Notification.flags 속성을 통해 알림의 동작 방식을 지정할 수 있다 .

고급 테크닉

플래그 설명FLAG_AUTO_CANCLE 사용자가 아이콘을 탭하면 자동으로 알림을 취소함FLAG_INSISTENT 취소하거나 상태표시줄을 확장하기 전까지 설정된 동작 ( 벨소리 ,

진동 , LED) 를 계속 발생시킴FLAG_NO_CLEAR 사용자가 지우기 (clear all) 를 선택할 때만 취소함FLAG_ONGOING_EVENT 알림을 진행 중 알림으로 만듬FLAG_SHOW_LIGHTS LED 불빛을 출력함

Page 26: 안드로이드  서비스

26

Alarm

Page 27: 안드로이드  서비스

27

• 미리 정해둔 시간과 간격에 따라 인텐트를 발생시키는 기능

• 어플리케이션과 독립적으로 동작함 어플리케이션이 종료되어도 설정된 알람은 정상적으로 수행될 뿐만 아니라 종료된 어플리케이션의

액티비티를 열수도 있음

• 애플리케이션의 리소스 요구사항을 줄이는데 매우 효과적

• 장치가 절전상태에 있어도 활성화되어 있으며 , 옵션으로 장치를 깨울 수도 있다 .

• 장치가 재부팅되면 모든 알람은 취소된다

알람 (Alarm)

Page 28: 안드로이드  서비스

28

• 알람을 생성하고 취소하는 등 알람을 관리하는 알람 관리 클래스 시스템이 제공하는 서비스이므로 객체를 직접 생성할 필요 없음

• 객체 얻기

• 일회성 알람을 발생시키는 메서드 set(int type, long triggerAtTime, PendingIntent operation)

Alarm type 의 종류

알람 관리하기 – AlarmManager

값 설명RTC 지정된 시간에 펜딩인텐트를 발생시키지만 장치를 깨우지는 않는다

RTC_WAKEUP RTC 와 같지만 장치가 절전상태인 경우 장치를 깨운다

ELAPSED_REALTIME 장치가 마지막으로 부팅된 이후로 경과된 시간을 기준으로 시간을 지정한다 . 장치를 깨우지는 않는다

ELAPSED_REALTIME_WAKEUP

ELAPSED_REALTIME 과 같지만 장치가 절정상태인 경우 장치를 깨운다

Page 29: 안드로이드  서비스

29

• 반복 알람을 발생시키는 메서드 setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)

정확하게 지정된 시간간격으로 알람을 발생시키지만 배터리 소모가 상당히 클 수 있다 .

setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent op-

eration)

정확한 간격 대신 AlarmManager 에 정의된 상수들 중 하나를 사용하여 알람을 반복한다 . (배터리 효율이 좋음 )

INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_HALF_DAY, INTERVAL_DAY

• 알람을 취소하는 메서드 cancel (PendingIntent operation)

알람 관리하기 – AlarmManager

Page 30: 안드로이드  서비스

30

• 일반적인 방법 ( 알람 1 개만 발생시킬 때 )

• 알람을 여러 개 발생시킬 때

알람을 여러 개 발생시킬 때는 알람끼리 구분할 구분자가 필요한데 그 구분자가 get-

Broadcast() 함수의 두번째 인자이다 .

• 인텐트에 값을 넣고 그 값이 변경될 일이 많을 때

getBraodcast() 함수의 마지막 인자에 PendingIntent.FLAG_UPDATE_CURRENT

를 넣으면 변경된 intent 의 extra 값을 제대로 받아오는 것을 보장해준다 .

참고 – PendingIntent 만들기

Page 31: 안드로이드  서비스

31

• 알람은 지정된 시간이 되면 설정된 PendingIntent 를 Broadcast

하는데 이것을 수신하여 처리하기 위해 리시버를 구현해야 한다 .

AndroidManifest.xml 에 등록

BroadcastReceiver 를 확장한 리시버 클래스 구현

onReceive() 안에서 원하는 작업을 할 수 있으나 5 초라는 시간제한이 존재하므로 시간이 오래 걸리는 작업의 경우 서비스나 쓰레드 (thread) 를 이용

• 리시버는 목적에 따라 여러 개 만들 수도 있다 .

알람 이벤트 리시버 등록

Page 32: 안드로이드  서비스

32

• 현재 시간 기준으로 설정하기

• 절대 시간으로 설정하기

참고 – 시간 설정

Page 33: 안드로이드  서비스

33

• AlarmTest.java

알람 예제

Page 34: 안드로이드  서비스

34

• AlarmReceiver.java

알람 예제

Page 35: 안드로이드  서비스

35

알람 예제