Accessibility Menu : 스크린샷 찍기나 한손 탐색 같은 일반 동작들이 장애가 있는 사용자에게 더 쉬워짐.
Select to Speak : 카메라에서 OCR 지원하여 텍스트 선택 및 읽기 지원
Sound amplifier : 다양한 환경에서의 오디오 기능 향상을 위해 100개 이상의 설정을 할 수 있음.
Battery & Brightness
Battery Saver : Always-0n 디스플레이와 같은 기능을 끄고 충전시간 유지 가능.
Adaptive Battery : machine learning을 통해 사용할 앱과 그렇지 않을 앱을 예측하여 배터리 전원을 사용.
Adaptive Brightness : 다양한 조명 환경에서 화면 밝기 설정하는 방법을 배워서 자동으로 조정해줌.
Background restrictions : 배터리 사용량이 너무 많은 특정 앱을 제한하는 권장사항이 표시되어 배터리를 효율적으로 제어함.
Camera
Multi-camera 지원
External camera 지원 (USB/UVC)
Digital Wellbeing
Do Not Disturb : 모든 알림과 시각적 기능이 침묵. 별표 표시된 연락처는 전달됨.
App dashboard : 폰에서 보낸 시간들을 확인 및 앱 사용 빈도와 알림 수르 확인.
Wind Down : 일일 일정을 설정하여 폰을 잠자게 함. 회색으로 화면을 표시하고 알림을 조용히 시킴.
App timers : 앱의 일일 시간 제한을 설정하여 한도에 도달시 앱이 일시 중지됨.
Display
Display cutout : 컷 아웃이 있는 장치 지원함.
Edge-to-edge screens : 18:9 이상의 비율이나 컷 아웃이 있는 장치를 지원함.
Enterprise
Multiple users on dedicated devices : 교대 근무자나 공용 키오스크에 적합한 단일 장치를 쉽게 공유할 수 있음.
Work tab in launcher : 작업용 앱을 시각적으로 분리 후 작업 탭을 탭하여 한 곳에서 볼 수 있음
Postpone Over-the-air(OTA) updates : 엔터프라이즈 IT 관리자가 Android OS 업데이트를 못하도록 최대 90일의 동결 기간을 정의할 수 있음.
Media
Multiple Bluetooth connections : 최대 5개의 장치에 연결하고 수신 전화는 가능한 모든 장치로 전송됨.
Sound delay reporting : 해당 기능이 있는 헤드셋을 지원하여 비디오와 헤드셋의 오디오 동기화 상태를 유지함.
Volume memory per Bluetooth device : 각 장치에 대해 마지막으로 설정한 불륨을 기어함.
HDR(High Dynamic Range) : HDR VP9 프로파일 2에 대한 지원 내장. 유튜브 등에서 HDR 지원 영화 볼 수 있음.
HD Audio : 향상된 성능과 HD 오디오 지원.
HEIF : HEIF 사진을 지원함.
Notifications
Notification enhancements for messaging : 메시징 앱 알림에 smart replies를 제안할 수 있어 탭으로 회신 가능함. 이동한 경우 모든 인라인 답장 초안이 안사라지며, 알림에서 받은 이미지를 볼 수 있음.
Manage Notifications : 앱에서 알림을 신속하게 끌 수 있음.
Privacy & Security
Android Backups : 클라이언트 측 비밀번호(기기 PIN, 패턴 또는 비밀번호)로 백업 암호화 가능.
Android biometric prompt : 표준 생체 인증 프롬프트를 포함하고, 다양한 새로운 보안 기능을 도입함.
Android Protected Confirmation : 호환 가능한 하드웨어에서 앱은 보안 하드웨어가 제어하는 UI를 사용하여 결제와 같은 민감한 거래의 확인을 받을 수 있음.
StrongBox : 호환 가능한 하드웨어에서 앱은 개인 키를 보호하기 위해 변조 방지 하드웨어를 활용할 수 있음.
Privacy enhancements : 앱이 idle이나 백그라운드에서 실행 중일때 폰의 마이크, 카메라, 기타 센서에 대한 액세스를 제한함. (앱이 센서에 액세스해야 하는 경우 폰에 알림 표시됨.) 모든 웹 통신을 보호하고 개인 웹 서핑을 제공하는 중요한 개선 기능을 제공함.
System Usability Enhancements
At-a-Glance on Always-on-Display : 락스크린 및 Always-on-Display에서 캘린더 이벤트나 날씨를 볼 수 있음.
Redesigned Quick Settings : 모든 토글을 포함한 퀵 셋팅의 보다 일관된 사용자 환경. 시각 디자인 업데이트 및 설명문구 추가.
Volume controls : 더 간단하고 볼륨 컨트롤을 통해 미디어/통화/알림 불륨 등을 바로 제어할 수 있음.
Screenshots : 파워메뉴에서 스크린 샷을 쉽게 가져와서 빠르게 그리기, 주석달기, 짜르기 등을 할 수 있음.
Rotation : 방향을 고정한 경우에도 기기의 회전을 언제 변경할 것인지 확인하는 간단한 버튼으로 제어 가능.
New system navigation : 앱 간 이동이나 검색을 보다 쉽게 만듦. 어디서든 위로 스와이프시 최근 사용한 앱의 전체화면 프리뷰를 볼 수 있음.
App Actions : 사용자의 맥락을 기반으로 다음 원하는 것을 예측하여 표시해줌.
Slices : 좋아하는 앱의 반응형 조각을 구글 검색과 같은 다른 곳에서 볼 수 있음.
Overview Selection : Overview 모드에서 선택한 텍스트나 이미지를 길게 누르면 선택한 항목 기반으로 한 작업을 볼 수 있음.
Accessibility Menu : 스크린샷 찍기나 한손 탐색 같은 일반 동작들이 장애가 있는 사용자에게 더 쉬워짐.
Select to Speak : 카메라에서 OCR 지원하여 텍스트 선택 및 읽기 지원
Sound amplifier : 다양한 환경에서의 오디오 기능 향상을 위해 100개 이상의 설정을 할 수 있음.
Battery & Brightness
Battery Saver : Always-0n 디스플레이와 같은 기능을 끄고 충전시간 유지 가능.
Adaptive Battery : machine learning을 통해 사용할 앱과 그렇지 않을 앱을 예측하여 배터리 전원을 사용.
Adaptive Brightness : 다양한 조명 환경에서 화면 밝기 설정하는 방법을 배워서 자동으로 조정해줌.
Background restrictions : 배터리 사용량이 너무 많은 특정 앱을 제한하는 권장사항이 표시되어 배터리를 효율적으로 제어함.
Camera
Multi-camera 지원
External camera 지원 (USB/UVC)
Digital Wellbeing
Do Not Disturb : 모든 알림과 시각적 기능이 침묵. 별표 표시된 연락처는 전달됨.
App dashboard : 폰에서 보낸 시간들을 확인 및 앱 사용 빈도와 알림 수르 확인.
Wind Down : 일일 일정을 설정하여 폰을 잠자게 함. 회색으로 화면을 표시하고 알림을 조용히 시킴.
App timers : 앱의 일일 시간 제한을 설정하여 한도에 도달시 앱이 일시 중지됨.
Display
Display cutout : 컷 아웃이 있는 장치 지원함.
Edge-to-edge screens : 18:9 이상의 비율이나 컷 아웃이 있는 장치를 지원함.
Enterprise
Multiple users on dedicated devices : 교대 근무자나 공용 키오스크에 적합한 단일 장치를 쉽게 공유할 수 있음.
Work tab in launcher : 작업용 앱을 시각적으로 분리 후 작업 탭을 탭하여 한 곳에서 볼 수 있음
Postpone Over-the-air(OTA) updates : 엔터프라이즈 IT 관리자가 Android OS 업데이트를 못하도록 최대 90일의 동결 기간을 정의할 수 있음.
Media
Multiple Bluetooth connections : 최대 5개의 장치에 연결하고 수신 전화는 가능한 모든 장치로 전송됨.
Sound delay reporting : 해당 기능이 있는 헤드셋을 지원하여 비디오와 헤드셋의 오디오 동기화 상태를 유지함.
Volume memory per Bluetooth device : 각 장치에 대해 마지막으로 설정한 불륨을 기어함.
HDR(High Dynamic Range) : HDR VP9 프로파일 2에 대한 지원 내장. 유튜브 등에서 HDR 지원 영화 볼 수 있음.
HD Audio : 향상된 성능과 HD 오디오 지원.
HEIF : HEIF 사진을 지원함.
Notifications
Notification enhancements for messaging : 메시징 앱 알림에 smart replies를 제안할 수 있어 탭으로 회신 가능함. 이동한 경우 모든 인라인 답장 초안이 안사라지며, 알림에서 받은 이미지를 볼 수 있음.
Manage Notifications : 앱에서 알림을 신속하게 끌 수 있음.
Privacy & Security
Android Backups : 클라이언트 측 비밀번호(기기 PIN, 패턴 또는 비밀번호)로 백업 암호화 가능.
Android biometric prompt : 표준 생체 인증 프롬프트를 포함하고, 다양한 새로운 보안 기능을 도입함.
Android Protected Confirmation : 호환 가능한 하드웨어에서 앱은 보안 하드웨어가 제어하는 UI를 사용하여 결제와 같은 민감한 거래의 확인을 받을 수 있음.
StrongBox : 호환 가능한 하드웨어에서 앱은 개인 키를 보호하기 위해 변조 방지 하드웨어를 활용할 수 있음.
Privacy enhancements : 앱이 idle이나 백그라운드에서 실행 중일때 폰의 마이크, 카메라, 기타 센서에 대한 액세스를 제한함. (앱이 센서에 액세스해야 하는 경우 폰에 알림 표시됨.) 모든 웹 통신을 보호하고 개인 웹 서핑을 제공하는 중요한 개선 기능을 제공함.
System Usability Enhancements
At-a-Glance on Always-on-Display : 락스크린 및 Always-on-Display에서 캘린더 이벤트나 날씨를 볼 수 있음.
Redesigned Quick Settings : 모든 토글을 포함한 퀵 셋팅의 보다 일관된 사용자 환경. 시각 디자인 업데이트 및 설명문구 추가.
Volume controls : 더 간단하고 볼륨 컨트롤을 통해 미디어/통화/알림 불륨 등을 바로 제어할 수 있음.
Screenshots : 파워메뉴에서 스크린 샷을 쉽게 가져와서 빠르게 그리기, 주석달기, 짜르기 등을 할 수 있음.
Rotation : 방향을 고정한 경우에도 기기의 회전을 언제 변경할 것인지 확인하는 간단한 버튼으로 제어 가능.
New system navigation : 앱 간 이동이나 검색을 보다 쉽게 만듦. 어디서든 위로 스와이프시 최근 사용한 앱의 전체화면 프리뷰를 볼 수 있음.
App Actions : 사용자의 맥락을 기반으로 다음 원하는 것을 예측하여 표시해줌.
Slices : 좋아하는 앱의 반응형 조각을 구글 검색과 같은 다른 곳에서 볼 수 있음.
Overview Selection : Overview 모드에서 선택한 텍스트나 이미지를 길게 누르면 선택한 항목 기반으로 한 작업을 볼 수 있음.
Manifest merger failed : Attribute application@allowBackup value=(true) from AndroidManifest.xml:5:9-35
is also present at [:base_module] AndroidManifest.xml:28:9-36 value=(false).
Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:4:5-10:43 to override.
apk_module/src/main/AndroidManifest.xml의 allowBackup 옵션을 base_module과 동일하게 설정
<applicationandroid:allowBackup="false"
... />
gradle sync 후 apk_module 빌드 및 run 시켜서 동작 확인 아래와 같은 에러들이 발생할 경우 있음.
Compilation failed; see the compiler error output for details.
error: constant expression required
보통 아래와 같은 구문에서 오류로 base_module로 변경된 부분들에서 주로 발생함. 이유는 안드로이드 리소스 id를 switch ~ case 문으로 비교 처리하는 부분인데, base_module로 변경되며 기존 application 모듈이 feature 모듈로 변경되었고, 이에 R.java 값들이 final로 선언되지 않기 때문에 if ~ else로 변경해야 함. (라이브러리 프로젝트에서 주로 발생하는 문제)
switch문 앞에 커서를 놓고 alt + Enter 후 Replace 'switch' with 'if' 선택
링크 클릭시나 프로그래밍 요청으로 웹 URI 인텐트가 호출되면 안드로이드 시스템에서 아래 동작을 순차적으로 시도함.
URI가 지정된 경우 URI 처리 가능한 사용자 기본 설정 앱을 실행
URI를 처리할 수 있는 앱 실행
다이얼로그에서 선택 가능한 앱들에서 사용자가 선택
수신 링크를 위한 인텐트 필터 추가
<action> : ACTION_VIEW 인텐트 액션 지정.
<data> : 하나 이상의 <data> 태그 추가.
각 태그는 URI 형식을 나타내며, 최소한 android:scheme 속성이 포함되어야 함.
속성들을 이용하여 URI 유형을 구체화 할 수 있음. android:path, pathPattern, pathPrefix 등
<category> : BROWSABLE 카테고리 포함. Intent 필터가 웹 브라우저에서 접근하기 위해 필요함.
DEFAULT 카테고리도 포함. 앱이 암시적 인텐트에도 응답할 수 있음.
이 방법이 아니라면 인텐트가 앱 구성 요소명을 지정하는 경우에만 적용이 가능함.
<activityandroid:name="com.example.android.GizmosActivity"android:label="@string/title_gizmos" >
<intent-filterandroid:label="@string/filter_view_http_gizmos">
<actionandroid:name="android.intent.action.VIEW" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<categoryandroid:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
<dataandroid:scheme="http"android:host="www.example.com"android:pathPrefix="/gizmos" />
<!-- note that the leading "/" is required for pathPrefix-->
</intent-filter>
<intent-filterandroid:label="@string/filter_view_example_gizmos">
<actionandroid:name="android.intent.action.VIEW" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<categoryandroid:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos” -->
<dataandroid:scheme="example"android:host="gizmos" />
</intent-filter>
</activity>
위 2개의 인텐트 필터는 <data> 요소에 의해서만 서로 다름.
동일한 필터에 여러 개의 <data> 요소를 포함할 수 있지만 고유한 URL을 선언하려는 경우 별도의 필터로 만들어야 함.
Status : 앱의 현재 링크 처리 설정 표시. 인증을 통과했고, 매니페스트에 android:autoVerify=true 가 포함된 앱은 always를 표시함. 이 이후의 16진수는 시스템의 사용자 앱 연결 환경설정에 대한 기록이며, 이 값이 확인이 성공했는지 여부를 나타내지는 않음.
테스트
앱의 인텐트 필터를 지정하고 앱 링크 기준을 충족하는 모든 웹 사이트로 앱을 인증할 수 있어야 함.
"General" 탭의 "Launch Options"에서 "Launch" 값을 "URL" 선택
"General" 탭의 "Launch Options"에서 "URL" 값을 실행할 액티비티의 매핑 URL로 입력
멀티태스킹 화면 등에서 아이콘에 번개표시로 인스턴트 앱 확인
인스턴트 앱 링크 연결
Android 앱 링크를 설정하여 앱에서 직접 링크의 특정 콘텐츠로 이동하는 용도로 Deep Link와 App Link가 사용됨.
Deep Link
앱의 특정 콘텐츠로 바로 연결하는 URL. 인텐트 필터를 추가하여 인텐트에서 데이터를 추출하여 처리함.
App Link
Android 6.0 (API 23) 이상에서 앱이 주어진 유형의 링크의 기본 처리기로 지정되도록 허용함.
앱 링크는 소유하고 웹 사이트 도메인에 연결되는 HTTP URL을 사용하므로 다른 앱이 링크 사용 불가 (Google 웹 사이트 연결 방법 중 하나를 통해 도메인 소유권 확인 필요)
웹 사이트와 앱의 동일한 콘텐츠에 대해 하나의 HTTP URL을 사용. 앱이 없을 경우 웹 사이트로 이동됨.
인스턴트 앱 지원을 하기 위해 앱 링크 설정
모바일 브라우저, Google 검색 앱, Android 화면 검색, Google Assistant를 통해 Google 에서 URL을 클릭하여 열 수 있음.
Android App Link 추가하기
특정 컨텐츠에 대한 딥링크를 앱에 생성. (위 내용 중 "인스턴트 앱 접근을 위한 URL 제공" 참조)
딥링크 확인 추가. 인스턴트 앱에서 사용할 URL의 실제 웹 링크 소유자 확인. (Google Search Console에서 소유자 확인한 사이트에 Digital Asset Links JSON 파일이 있어야 함.) (Developers 문서에는 위와 같지만, Google Search Console에 대한 부분은 안해도 인스턴트 앱이 되긴 했음.) 참조 : https://developer.android.com/training/app-links/
데이터 바인딩에 임의의 POJO(Plain Old Java Object)를 사용 가능하지만, POJO를 수정하더라도 UI가 업데이트 되지는 않음. 데이터가 변경될 때 이를 알려주는 기능을 데이터 객체에 부여해야 데이터 바인딩을 제대로 활용할 수 있음. Observable 객체, 필드, 컬렉션이라는 세 가지 다른 데이터 변경 알림 매커니즘이 있음.
이러한 Observable 데이터 객체 중 하나가 UI에 바인딩되어 있고 데이터 객체 속성이 변경되면 UI가 업데이트 됨.
Observable 객체
Observable 인터페이스를 구현하는 클래스를 사용하면 바인딩이 바인딩된 객체 단일 리스너를 연결.
Observable 인터페이스에는 리스너를 추가/제거하는 매커니즘이 있지만, 알림은 개발자의 선택에 따라 결정됨.
더 쉽게 개발하도록 BaseObservable을 만들어 리스너 등록 매커니즘 구현함. 속성이 변할 때 이를 알릴 책임은 데이터 클래스 구현자에게 있으며, getter에 Bindable 주석을 할당하고 setter에서 이를 알림
View 가 View.OnAttachStateChangeListener에 대한 set 메서드를 사용하는 대신 리스너에 대한 add와 remove를 사용하기 때문에 위 예시는 좀 더 복잡함.
ListenerUtil 클래스는 Binding Adapter에서 이전의 리스너를 제거할 수 있도록 이들을 추적하는 데 도움이 됨.
인터페이스 OnViewDetachedFromWindow와 OnViewAttachedToWindow에 @TargetApi(VERSION_CODES.HONEYCOMB_MR1) 주석을 추가하면 데이터 바인딩 코드 생성기가 addOnAttachStateChangeListener(View.OnAttachStateChangeListener) 에 의해 지원되는 같은 버전인 HoneyComb MR1과 새 기기에서 실행 시 리스너만 생성되어야 한다는 점을 인식하게 됨.
변환기
객체 변환
바인딩 식에서 Object가 반환되면 자동 setter, 이름이 바뀐 setter, 맞춤 setter 중에서 setter가 선택됨.
android:text='@{map["firstName"]}'
or
android:text="@{map[`firstName`]}"
android:text="@{map['firstName']}"
리소스
일반적인 구문을 사용하는 식의 일부로 리소스에 액세스할 수 있음.
<!-- 일부로 리소스에 액세스할 수 있음 -->
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
<!-- 매개변수를 제공하여 형식 문자열과 복수형을 평가할 수 있음 -->
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
<!-- 복수형이 여러 매개변수를 취할 때는 모든 매개변수가 전달되어야 함 -->
Have an orange
Have %d oranges
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
변수 형식은 컴파일 시에 검사되므로, 변수가 android.databinding.Observable을 구현하거나 변수가 Observable 컬렉션인 경우 그 점이 형식에 반영되어야 함. 변수가 기본 클래스거나 Observable* 인터페이스를 구현하지 않은 경우 변수가 식별되지 않음.
다양한 구성(예: 가로/세로 모드)에 대한 다양한 레이아웃 파일이 있을 경우 변수들이 결합하므로 충동하는 변수 정의가 없어야 함.
생성되는 바인딩 클래스는 설명되어 있는 변수마다 각각 setter와 getter가 있음. 변수는 setter가 호출될 때까지 기본 Java 값을 취함. 즉, 참조 형식에는 null, int에는 0, boolean 에는 false 값을 취함.
필요에 따라 바인딩 식에 사용하기 위해 context 로 명명된 별도의 변수가 생성됨. context는 루트 View의 getContext()에서 가져온 값임. context 변수는 그 이름을 가진 명시적 변수 선언으로 재정의 됨.
사용자 지정 바인딩 클래스 이름
기본적인 Binding 클래스 : 레이아웃 파일명을 바탕으로 생성되며 파스칼 표기법으로 바꾼 후 "Binding"이 접미사로 붙음. 이 클래스는 모듈 패키지 아래 데이터 바인딩 패키지에 배치됨.
예를 들면
레이아웃 파일 : contact_item.xml
바인딩 클래스 : ContactItemBinding
모듈 패키지 : com.example.my.app
배치 위치 : com.example.my.app.databinding
data 요소의 class 특성을 조정하여 바인딩 클래스명을 바꾸거나 다른 패키지에 배치할 수 있음.
<!-- 바인딩클래스명 변경 -->
<dataclass="ContactItem">
...
</data>
or
<!-- 모듈 패키지 내에서 다른 패키지에 배치할 경우 -->
<dataclass=".ContactItem">
...
</data>
or
<!-- 전체 패키지가 제공될 경우 어떤 패키지든 사용 가능 -->
<dataclass="com.example.ContactItem">
...
</data>
Include
특성에 앱 네임스페이스와 변수 이름을 사용하여 포함하는 레이아웃에서 포함되는 레이아웃의 바인딩으로 변수를 전달할 수 있음.
애플리케이션 구성 요소가 시작되고, 앱에 실행 중인 다른 구성 요소가 없으면 하나의 실행 스레드로 앱의 Linux 프로세스 시작함. 기본적으로 같은 애플리케이션의 모든 구성 요소는 같은 프로세스와 스레드에서 실행됨. 하지만 여러가지 구성 요소가 각자 별도의 프로세스에서 실행되도록 할 수도 있고, 어느 프로세스에든 추가 스레드를 만들 수 있음.
프로세스
기본적으로 같은 앱의 모든 구성 요소는 같은 프로세스와 스레드에서 실행되고 이를 바꾸면 안됨. 그러나 어느 프로세스가 특정 구성 요소에 속하는지 확인해야 할 경우 매니페스트 파일에서 확인 가능.(android:process 속성)
지원하는 요소 : <application>, <activity>, <service>, <receiver>, <provider>
안드로이드 시스템에서 어느 프로세스를 삭제할지 결정할 때, 이들의 상대적 중요성을 가늠함.
프로세스 수명 주기
안드로이드 시스템은 프로세스에서 실행되는 구성 요소와 해당 구성 요소의 상태에 기초하여 각 프로세스에 "중요 계층"을 부여함. 중요도가 낮은 프로세스가 먼저 제거됨.
중요 계층 5가지
포그라운드 프로세스 : 사용자가 현재 진행하는 작업에 필요한 프로세스 (Activity나 Foreground Service)
사용자가 상호작용하는 Activity를 호스팅할 경우
사용자와 상호작용하는 액티비티에 바인드된 Service를 호스팅할 경우
포그라운드에서 실행되는 Service를 호스팅할 경우
수명 주기 콜백 중 하나를 실행하는 Service를 호스팅할 경우 (onCreate(), onStart() 또는 onDestroy() )
가시적 프로세스 : 포그라운드 구성 요소는 없지만 사용자가 화면에서 보는 것에 영향을 미칠 수 있는 프로세스
맨 앞에 있지는 않지만 사용자에게 보이는 Activity 를 호스팅할 경우
눈에 보이는 액티비티에 바인딩된 Service 호스팅할 경우
서비스 프로세스 : startService() 메서드로 시작되었지만, 위 경우에 들어가지 않는 서비스를 실행 중인 프로세스일 경우
백그라운드 프로세스 : 현재 사용자에게 보이지 않는 액티비티를 보유한 프로세스. 이러한 프로세스는 LRU(최저 사용 빈도) 목록에 보관하여 사용자가 가장 최근에 본 액티비티가 있는 프로세스가 가장 마지막에 중단되도록 함.
빈 프로스세스 : 활성 앱 구성 요소를 보유하지 않은 프로세스.
프로세스의 등급은 다른 프로세스가 이에 의존할 경우 상승 가능.(의존 대상의 중요도가 의존할 대상과 같거나 높음)
스레드
앱이 시작되면 앱에 대한 실행의 스레드를 생성하며, 메인 스레드라 함. 이 스레드는 드로어블 이벤트를 포함한 UI 위젯에 이벤트를 발송하는 역할을 맡기도 하여 UI 스레드라고도 함.
시스템은 구성 요소의 각 인스턴스에 대해 별도의 스레드를 생성하지 않음. 같은 프로세스에서 실행되는 모든 구성 요소는 UI 스레드에서 시작되고, 구성 요소를 호출하는 시스템이 해당 스레드에서 발송됨.
시스템 콜백에 응답하는 메서드(onKeyDown()이나 생명주기 메서드 등)는 항상 프로세스의 UI 스레드에서 실행됨.
UI 스레드에서 DB 쿼리 등의 긴 작업을 수행하면 사용자가 보기에 앱이 중단된 것처럼 보이며, 약 5초이상 진행되면 ANR 대화상자가 표시됨.
어떤 경우에는 구현하는 메서드가 하나 이상의 스레드에서 호출되는 일이 있어 안전하게 작성해야 함.
주로 원격으로 호출할 수 있는 메서드이 있음. 바인드된 서비스 등.
IBinder에서 구현된 메서드가 IBinder가 실행되는 프로세스에서 호출될 경우, 해당 메서드는 호출자의 스레드에서 실행됨. 호출이 다른 프로세스에서 발생하면, 해당 메서드는 시스템이 IBinder 와 같은 프로세스에 유지하는 스레드 풀에서 선택된 스레드에서 실행됨.(프로세스의 UI 스레드에서 실행되지 않음)
위와 같은 이유로 스레드로부터 안전한 구현이 필요함.
프로세스 간 통신
안드로이드는 원격 프로시저 호출(RPC)을 사용한 프로세스 간 통신(IPC) 매커니즘을 제공함.
여기서 메서드는 액티비티나 다른 앱 구성 요소에 호출되지만 원격으로 실행되고, 결과는 모두 호출자에게 되돌려 보냄.
메서드 호출과 데이터는 운영 체제가 이해할 수 있는 수준으로 분해되고, 로컬 프로세스와 주소 공간에서 원격 프로세스와 주소 공간으로 전송되어 다시 결합되어 호출에 응답하게 됨. 그런 다음 반환 값이 반대 방향으로 전송됨.
안드로이드가 이와 같은 IPC 트랜잭션을 수행하는데 필요한 코드를 제공하므로, 개발자는 RPC 프로그래밍 인터페이스를 정의하고 구현하는 데만 집중하면 됨.