Content Provider Content Provider H oon D roidContent Provider DataBase □ a Application □ b Application DATA 데이터 베이스 접근 다른 Application 이 특정 Application 의 데이터베이스 (DB) 에 직접 접근하는 것은 불가능하다 . H oon D roidContent Provider ◎ Content Provider Content Provider 는 데이터를 제공하는 역할을 수행하며 File, DB , memory 등과 같은 저장소를 각각의 Application 에서 공통된 인터페이스로 접근 가능하도록 지원하는 Component 이다 . URI DataBase Content Provider Content Resolver 데이터 베이스 접근 데이터 획득 ○ Content Resolver Content Provider 의 주소 (URI) 를 통해 해당 Content Provider 에 접근할 수 있다 . H oon D roidContent Provider ○ URI(Uniform Resource Identifier) Content Provider 에 접근하기 위해서는 정보의 위치를 나타내는 URI 를 사용해야 한다 . 누가 어떤 정보를 제공하는지 , 또 어떤 정보를 원하는지에 대한 정보가 URI 에 작성된다 . content://authority/path/id content:// : URI 임을 나타내는 접두어 . a uthority : 정보 제공자의 명칭이되 중복되면 안되므로 보통 package name 을 사용한다 . path : 정보의 종류를 지정하는 가상의 경로 . ( 데이터의 경로 ) id : 구체적으로 어떤 정보를 원하는지를 지정한다 . Content Resolver 를 통해 Content Provider 에 제공받는 데이터는 하나의 데이터일 수 도 있고 , 어떤 유형의 데이터 목록일 수 도 있다 . H oon D roidContent Provider ○ Content Provider 사용하기 . H oon D roidContent Provider ◎ Content Provider Content Resolver URI DataBase Content Provider □ a Application □ b Application DATA H oon D roid{nameOfApplication=Show}
Activity Intent Activity H oon D roid◎ Activity Activity Component 는 사용자와 Application 간의 상호작용을 할 수 있도록 다이얼이나 웹 브라우저 같은 가시적인 화면을 제공하는 역할을 수행한다 . □ Application Activity Activity Activity Service Component H oon D roid◎ Activity Activity 는 사용자 인터페이스를 구성하지만 그 자체는 출력 기능이 없으므로 직접적으로 보이지 않는다 . 사용자 눈에 실제로 보이는 것은 View 이며 , Activity 는 View 나 ViewGroup 을 가져야 한다 . setContentView (view) 를 통해 화면에 출력할 View 를 설정할 수 있다 . Activity H oon D roid◎ Activity Lifecycle Activity H oon D roidActivity ○ onCreate ( ) 최초 Activity 가 생성될 때 호출되며 , Activity 를 초기화하거나 UI 를 구성하는데 사용된다 . ○ onStart ( ) Activity 의 내용이 화면에 출력되기 직전에 호출된다 . ○ onRestart ( ) 최초 onCreate ( ) 가 호출된 상태에서 생명주기가 다시 시작될 때 onCreate ( ) 대신 호출된다 . ○ onResume ( ) Activity 가 화면에 출력되었지만 아직 사용자와 상호작용하기 전 상태이다 . Activity 가 실행 상태 전에 호출이 보장된다 . 어떤 동작을 재개 할 때 onResume ( ) 을 이용하여 구현하는 경우가 많다 . Ex) 음악이 중단되어 다시 시작할 경우 onResume ( ) 단계에서 다시 Play 하도록 설정 . ◎ Activity Lifecycle H oon D roidActivity ○ onPause ( ) Activity 가 종료 / 중단 되었을 경우 무조건 호출이 보장된다 . 종료 시점의 호출을 보장함으로써 Activity 종료 시 저장해야 할 데이터를 처리하거나 , 음악이 재생 중이라면 중단 하는 등 종료시점에 해당하는 작업을 수행한다 . ○ onStop ( ) Activity 가 화면에 보이지 않는 상태가 되는 경우 호출 . ex) 다른 Activity 실행 , Home 으로 이동 ○ onDestroy ( ) Activity 가 종료될 때 호출된다 . onStop ( ), onDestroy ( ) - 종료 시 무조건 호출되지 않을 수 있으므로 특정한 상황이 아니면 사용하지 않는다 . ◎ Activity Lifecycle H oon D roidActivityActivity □ Application 실 행 □ Home 버튼 선택 □ Application 재 실행 □ Application back 버튼을 이용한 종료 ◎ Activity LifecycleActivity □ MainActivity - ActivityB □ back 버튼을 이용하여 ActivityB - MainActivity □ Application back 버튼을 이용한 종료 ◎ Activity LifecycleActivity □ Application 실 행 □ Home 버튼 선택 □ Activity 재 실행 □ Application 종료 ◎ Activity Lifecycle◎ Intent Activity Activity 간에 호출을 하기 위해서는 통신을 위한 장치가 필요한데 이 장치가 바로 Intent 이다 . Intent 는 Activity 뿐만 아니라 Service, Broadcast Receiver 에서도 사용이 가능하다 . 즉 Intent 는 Component 들을 활성화하고 제어하기 위한 규격화 된 정보 . □ 패키지 A Intent □ 패키지 B Activity Service BroadcastReceiver 활성화 될 Component 정보 전달할 데이터 □ Intent 정보 Activity Service BroadcastReceiver H oon D roid◎ Intent Activity 호출하는 메소드의 종류에 따라 활성화되는 Component 의 종류가 달라진다 . □ 패키지 A □ 패키지 B Activity Service BroadcastReceiver □ Intent 정보 Activity Service BroadcastReceiver startActivity ( ) startActivityForResult ( ) startService ( ) bindService ( ) sendBroadcast ( ) sendStikyBroadcast ( ) Intent H oon D roid◎ Intent Activity □ 패키지 A Intent A Component 활성화 요청 ① ActivityManager Intent ② ③ Intent 에 담긴 활성화 될 Component 정보 ( 명칭 ) 추출 설치된 패키지 리스트를 검색하여 활성화 될 패키지의 Component 를 찾는다 . PackageManager ④ Component 정보 요청 Component 정보 전달 ⑤ 해당 Component 활성화 처리 ⑥ A Component Intent ⑦ ⑧ 활성화 H oon D roidActivity ◎ Activity Component 활성화 ○ 명시적 Intent ○ 암시 적 Intent H oon D roidActivity ◎ Activity Component 활성화 ○ 명시적 Intent 활성화할 패키지명과 Component 명을 정확히 지칭하여 Component 를 활성화하는 방법 . H oon D roid◎ Activity 추가하기 Activity 새로운 Activity 를 추가할 경우 AndroidManifest.xml 에 새로운 Activity 정보를 추가해야 한다 . H oon D roidActivity ◎ Activity Component 활성화 ○ 암시 적 Intent 암시적 Intent 는 명시적 Intent 처럼 호출할 대상을 직접 지정하지 않고 웹 사이트를 보고 싶다거나 , 전화를 걸고 싶다는 의도만을 지정하여 호출한다 . H oon D roidActivity ◎ Activity Component 활성화 ○ 암시 적 Intent H oon D roidActivity ◎ Activity Component 활성화 ○ 암시 적 Intent H oon D roidActivity ◎ Activity Component 활성화 ○ 암시 적 Intent H oon D roidActivity ◎ Activity 간의 통신 Activity B MainActivity startActivityForResult (Intent, resultCode ) Finish( ) onActivityResult ( ) setResult ( ) Intent putExtra ( key , value ); H oon D roidActivity ◎ Activity 간의 통신 ① H oon D roidActivity ◎ Activity 간의 통신 ② ③ H oon D roidActivity ◎ Activity 간의 통신 ④ H oon D roid{nameOfApplication=Show}
Services Service H oon D roid◎ Services 서비스는 사용자 인터페이스를 제공하지 않으며 , 백그라운드에서 작업을 수행하는 컴포넌트이다 . 또 다른 Application component 에서 서비스를 시작할 수 있으며 , 사용자가 다른 프로그램으로 전환해도 서비스는 백그라운드에서 계속 실행된다 . 또한 , 구성 요소와 상호작용할 수 있으며 심지어 프로세스 간 통신 (IPC) 을 할 수 있는 서비스에 바인딩 할 수 있다 . Ex) 뮤직 플레이어 , 다운로드 서비스 등 Service H oon D roid◎ Services 의 두 가지 흐름 ○ Started ○ Bound Application component 에서 (Activity 등 ) startService ( ) 를 호출하여 서비스가 시작된다 . 한번 실행되면 구성요소가 destroyed 된 경우에도 서비스는 백그라운드에서 계속적으로 작업을 수행할 수 있다 . 일반적으로 Started Service 는 하나의 연산을 수행한 후 caller 에게 결과를 반환하지 않는다 . 예를 들어 네트워크를 통해 파일을 다운로드 하거나 업 로드 할 경우 작업이 완료되면 서비스는 스스로 중지할 수 있다 . Service H oon D roid◎ Services 의 두 가지 흐름 “bound” 는 Application Component 가 bindService ( ) 를 호출하여 바인딩 할 수 있다 . 또한 Bound service 는 프로세스 간 통신 (IPC) 를 할 수 있도록 지원한다 . ○ Bound Service H oon D roid◎ Service 실행 startService (Intent Service) Plus Call 에서 사용된 Service 실행 Service H oon D roid◎ Service 중지 stopService (Intent Service) Plus Call 에서 사용된 Service 중지 Service H oon D roid◎ Service lifecycle Service H oon D roid서비스가 처음 만들어 질 때 가장먼저 호출되며 , 서비스가 이미 실행되고 있는 경우 호출되지 않는다 . 서비스를 실행 시 onCreate ( ) 가 무조건 호출되지 않기 때문에 서비스가 실행될 때마다 처리해야 할 일이 있다면 onStartCommand ( ) 에서 정의해야 한다 . ○ onCreate ( ) ○ onStartCommand ( ) 서비스가 실행되기 직전에 호출되며 , 서비스 실행도중 startService ( ) 를 호출할 경우 onCreate ( ) 가 호출되지 않고 onStartCommand ( ) 가 호출된다 . 서비스가 시작되면 백그라운드에서 계속적으로 작업을 수행할 수 있으며 , 해당작업이 완료되면 stopSelf ( ), StopService ( ) 를 호출하여 서비스를 중지해야 한다 . ◎ StartService Service H oon D roidServiceTest Manifest MainActivity○ onStartCommand ( ) □ START_STICKY Service 가 강제 종료되었을 경우 시스템이 다시 Service 를 재 시작 시켜 주지만 , Intent 값을 null 로 초기화 시켜서 재 시작 한다 . □ START_NOT_STICKY 강제로 종료된 Service 가 재 시작 하지 않는다 . 시 스템에 의해 강제 종료 되어도 상관없는 작업을 진행 할 때 사용된다 . □ START_REDELIVER_INTENT Service 가 강제 종료되었을 경우 시스템이 다시 Service 를 재 시작 시켜 주지만 , Intent 값을 그대로 유지 시켜 준다 . onStartCommand ( ) 는 아래와 같이 3 가지 리턴 타입을 갖게 된다 . Service H oon D roid○ onStartCommand ( ) □ START_STICKY □ START_NOT_STICKY □ START_REDELIVER_INTENT Service H oon D roid○ Service 를 이용한 MP3 파일 재생 □ onCreate ( ) Service H oon D roid○ Service 를 이용한 MP3 파일 재생 □ startCommand ( ) ◎ startService Service H oon D roid○ Service 를 이용한 MP3 파일 재생 Android 의 모든 Component 는 Main Thread 안에 실행된다 . Main Thread 는 UI 작업을 처리해주는 Thread 이다 . 그렇기 때문에 서비스가 어떤 작업을 실행하기 위해서는 별도의 Thread 를 생성해야 한다 . □ Runnable task Service H oon D roid○ Service 를 이용한 MP3 파일 재생 □ onDestory ( ) Service H oon D roid○ RPC(Remote Procedure Call) RPC 는 컴퓨터 프로그램이 다른 주소공간에서 원격제어를 위해 함수나 프로시져의 실행을 허용하는 기술 . int Result = sum (10, 20); □ Com.test.processA int sum ( int a, int b){ return a + b; } □ Com.test.processB ◎ bindService Service H oon D roid□ Com.test.processA □ Com.test.processB Kernel Space User Space 공유 불가능 공유 가능 Process 간 메모리 공유가 가능하면 Process A 에 문제로 Process B 에 영향을 주어 예기치 못한 일이 발생할 수 있기 때문에 Linux 커널은 하나의 Process 가 다른 Process 에 영향을 줄 수 없도록 메모리 공유를 절대적으로 차단한다 . Kernel Space User Space IPC 통신 사용 Service H oon D roid○ IPC(Inter-process Communication) 프로세스들 사이에 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이나 경로를 뜻함 . □ Com.test.processA □ Com.test.processB int Result = sum (10, 20); ① ② ③ ⑤ ⑦ AIDL 조립 / 분해 설명서 분해 및 직렬화 함수명 “sum” arg1 10 arg2 20 “Sum” 10 20 Kmalloc ( ) 커널 메모리 생성 “Sum” 10 20 커널 메모리 커널 메모리 씀 ( mmap ) ④ 커널 메모리 읽음 ( mmap ) “Sum” 10 20 int sum (10, 20) 조 립 int sum ( int a, int b){ return a + b; } ⑥□ Com.test.processA □ Com.test.processB int Result = sum (10, 20); 분해 및 직렬화 함수명 “sum” arg1 10 arg2 20 “Sum” 10 20 “Sum” 10 20 커널 메모리 “Sum” 10 20 int sum (10, 20) 조 립 int sum ( int a, int b){ return a + b; } RPC 영역 분해와 조립 후 다른 프로세스 함수를 호출할 수 있도록 한다 . (Remote Procedure Call) IPC 영역 Process 간 통신을 가능토록 한다 . (Inter-Process Communication)○ AIDL(Android Interface Description Language) Android 에서 사용하는 인터페이스 정의 언어 . Service H oon D roid○ AIDL(Android Interface Description Language) Service H oon D roid○ AIDL(Android Interface Description Language) 분해 조립 분해 및 직렬화 함수명 “sum” arg1 10 arg2 20 “Sum” 10 20 “Sum” 10 20 int sum (10, 20) 조 립 ServiceServices H oon D roidService 앞서 생성한 AIDL 을 Client 에 추가한다 . ○ Client H oon D roid□ com.example.mission.serviestest.SERVICE2 Client Service ① ② ③ ④ ⑤ ⑥{nameOfApplication=Show}
Broadcast Receiver Broadcast receiver H oon D roidBroadcast Receiver ◎ BR(Broadcast Receiver) Broadcast Receiver 는 어떠한 특정 작업이 벌어질 경우 , 그것을 받고자 하는 곳에 알려주는 기능을 수행함 . sendBroadcast (Ti2) □ Package Broadcast □ Package A Action : SMS Action : Ti2 Action : CALL □ Package B □ Package C 특정 패키지 Component 에서 sendBroadcast ( 메시지 ) 를 통해서 전역방송을 보냄 . Receiver Component Receiver Component Receiver Component sendBroadcast ( ) 에 의해 전송된 Intent 들을 Receive 하기 위한 Base Class. H oon D roidBroadcast Receiver ◎ BR(Broadcast Receiver) sendBroadcast (intent) □ Broadcast Component 해당하는 Action 을 등록한 모든 Receiver 들을 하나씩 활성화 시킨다 . □ Activity Manager Service onReceive ( ) □ Receiver 1. 처 리 실행시간 : 12 초 활성화 됨 . ANR 발생 Time Out □ ActivityManagerService.java H oon D roidBroadcast Receiver ◎ BR(Broadcast Receiver) □ CallReceiver.java H oon D roidBroadcast Receiver ◎ Receiver ○ 정적 Receiver ○ 동 적 Receiver - 정적 Receiver 는 Receiver 를 고정해서 등록해 놓고 원하는 방송에 반응하는 Receiver - 동적 Receiver 는 특정 Component 에서 Broadcast Receiver 객체를 동적으로 생성하여 Receiver 를 등록 H oon D roidBroadcast Receiver ◎ Receiver ○ 정적 Receiver AndroidManifest.xml 에 receiver 엘리먼트를 등록 receiver 에 등록된 Broadcast 가 발생하여 onReceive ( ) 가 호출됨 . H oon D roidBroadcast Receiver ◎ receiver SYNTAX : Example H oon D roidBroadcast Receiver ◎ receiver Attributes □ android: enabled □ android: exported Broadcast Receiver 가 외부의 소스 ( 다른 Application) 로 부터 메시지를 전달 받을 수 있는지에 대한 여부 Default 값은 Broadcast Receiver 가 intent-filter 를 포함하고 있는지에 따라 달라진다 . intent-filter 가 있는 경우는 외부 Application 으로부터 intent 를 받을 준비가 되었다는 의미로 Default 값은 true 로 설정된다 . 반대로 intent-filter 가 없다는 것은 intent 에 명시적으로 class 이름을 넣어주어야 한다는 것이고 ( 정확한 클래스 이름을 지정하는 intent object 에 의해서만 호출될 수 있다는 것을 의미 , 일반적으로 클래스 이름을 알 수 가 없기 때문에 ) 이는 외부 Application 으로부터 Intent 를 받을 수 없다는 의미로 Default 값은 false 로 설정된다 . Broadcast Receiver 가 System 에 의해 인스턴스화 될 수 있는지에 대한 여부 Default 값은 true 로 설정됨 . Broadcast Receiver 가 활성화 될 수 있게 하기 위해서는 application 과 receiver 의 속성이 모두 true 로 설정되어야 한다 . 만약 어느 것 하나가 false 로 설정되었을 경우 비활성화 되어 인스턴스화 할 수 없다 . H oon D roidBroadcast Receiver □ android: icon □ android: label Broadcast Receiver 에 대한 사용자가 읽을 수 있는 label 을 설정 Label 을 설정하지 않은 경우 전체 Application 을 위한 라벨 설정이 대신 사용된다 . ( application 의 label ) Label 은 문자열 리소스에 대한 레퍼런스로 설정 되어야 하지만 , 편의상 원시 문자열로서 설정될 수 있다 . Broadcast Receiver 를 나타내는 아이콘 . □ android: name Broadcast Receiver 의 서브클래스를 구현하는 클래스의 이름을 설정 , 정확한 전체 클래스 이름이어야 한다 . (“ com.example.projext.ReportReceiver ” 와 같이 ), 하지만 축약 하여 (. ReportReceiver ) 사용할 경우 manifest 엘리멘트에 지정된 패키지 이름 끝에 붙여진다 . ◎ receiver Attributes H oon D roidBroadcast Receiver □ android: permission □ android: process Broadcast Receiver 가 실행될 Process 의 이름 . 보통 모든 Application Component 는 같은 Application Process 에서 작동한다 . 일반적으로 Application 의 Process 이름은 Application Package 명과 같다 . 하지만 각각의 Component 는 자신의 Process Attribute 를 사용해서 Default 를 오버라이드 할 수 있다 . Process 이름이 콜론 (:) 으로 시작한다면 , Application 에 Private 한 Process 에서 작동하게 된다 . Broadcast 가 Broadcast Receiver 에게 메시지를 보내기 위해 가져야 하는 Permission 의 이름 . 만약 Permission 을 설정되지 않을 경우 application 엘리먼트의 Permission 에 설정된 값이 Receiver 에 적용된다 . 만약 둘 모두 permission 이 설정되지 않았을 경우 receiver 는 permission 에 의해 보호되지 않는다 . ◎ receiver Attributes H oon D roidBroadcast Receiver ○ 정적 Receiver 를 이용한 예제 1. AndroidManifest.xml H oon D roidBroadcast Receiver ○ 정적 Receiver 를 이용한 예제 2. Call_Receiver.java H oon D roidBroadcast Receiver ◎ Receiver ○ 동 적 Receiver Intent registerReceiver ( BroadcastReceiver receiver, IntentFilter filter); Void unregisterReceiver ( BroadcastReceiver ); H oon D roidBroadcast Receiver H oon D roidBroadcast Receiver Receiver 가 더 이상 사용할 필요가 없을 경우 반드시 unregisterReceiver ( ) 를 호출하여 등록을 해제해야 한다 . unregisterReceiver ( ) 를 통해 Receiver 를 해제하지 않을 경우 메모리를 계속 잡고 있어 메모리 누수가 발생한다 . 또한 한번 등록된 Receiver 를 중복해서 다시 등록하는 일이 없어야 한다 . H oon D roidBroadcast Receiver ◎ Broadcast Receiver 에 관련된 Intent Flag ○ FLAG_RECEIVER_REGISTERED_ONLY ○ FLAG_RECEIVER_REPLACE_PENDING ○ FLAG_INCLUDE_STOPPED_PACKAGES H oon D roidBroadcast Receiver ◎ Broadcast Receiver 에 관련된 Intent Flag ○ FLAG_RECEIVER_REGISTERED_ONLY ○ FLAG_RECEIVER_REPLACE_PENDING ○ FLAG_INCLUDE_STOPPED_PACKAGES 현재 활성화 된 패키지에게만 전달하기 위해 사용되며 오직 동적 Receiver 에게만 전달 된다 . H oon D roidBroadcast Receiver ◎ Broadcast Receiver 에 관련된 Intent Flag ○ FLAG_RECEIVER_REGISTERED_ONLY ○ FLAG_RECEIVER_REPLACE_PENDING ○ FLAG_INCLUDE_STOPPED_PACKAGES 현재 활성화 된 패키지에게만 전달하기 위해 사용되며 오직 동적 Receiver 에게만 전달 된다 . 특정 패키지에서 같은 Broadcast 를 동시에 여러 번 보낼 경우 중복된 Broadcast 를 하나로 교체하여 한번만 실행될 수 있도록 한다 . H oon D roidBroadcast Receiver ○ FLAG_RECEIVER_REPLACE_PENDING □ Broadcast Component □ ActivityManagerService ArrayList Broadcast 목록 5 4 3 2 1 □ 해당 Receiver Component onReceiver ( ) 처 리 1 H oon D roidBroadcast Receiver ○ FLAG_RECEIVER_REPLACE_PENDING □ Broadcast Component □ ActivityManagerService ArrayList Broadcast 목록 5 4 3 2 1 □ 해당 Receiver Component onReceiver ( ) 처 리 1 비교 동일시 대체 H oon D roid{nameOfApplication=Show}