Android 5.0 API

API 레벨: 21

Android 5.0(LOLLIPOP)은 사용자와 앱 개발자에게 새로운 기능을 제공합니다. 이 문서에서는 가장 주목할 새로운 API를 소개합니다.

앱을 게시했다면 앱에서 고려해야 할 Android 5.0 동작 변경 사항을 확인하세요. 이러한 동작 변경 사항은 새로운 API를 사용하거나 새로운 기능을 대상으로 하지 않더라도 Android 5.0 기기에 영향을 미칠 수 있습니다.

새로운 플랫폼 기능을 개괄적으로 살펴보려면 Android Lollipop 하이라이트를 참조하세요.

개발 시작

Android 5.0용 앱의 빌드를 시작하려면 먼저 Android SDK를 다운로드해야 합니다. SDK Manager를 사용하여 Android 5.0 SDK 플랫폼과 시스템 이미지를 다운로드합니다.

대상 API 레벨 업데이트

Android 5.0이 실행되는 기기에서 앱을 더욱 최적화하려면 targetSdkVersion"21"로 설정하고 Android 5.0 시스템 이미지에 앱을 설치, 테스트한 다음 이 변경을 적용하여 업데이트한 앱을 게시합니다.

minSdkVersion이 지원하지 않는 API를 실행하기 전에 시스템 API 레벨을 확인하는 코드에 조건을 추가하여 이전 버전을 지원하면서도 Android 5.0 API를 사용할 수 있습니다. 이전 버전과의 호환성을 유지하는 방법에 관한 자세한 정보를 보려면 다양한 플랫폼 버전 지원을 참조하세요.

API 레벨이 작동하는 방식에 관한 자세한 정보는 API 레벨이란?을 참조하세요.

중요한 동작 변경 사항

이전에 Android용 앱을 게시한 적이 있는 경우, Android 5.0에서의 변경으로 인해 앱이 영향을 받을 수 있다는 점을 유의하세요.

자세한 내용은 Android 5.0 변경 사항을 참조하세요.

사용자 인터페이스

머티리얼 디자인 지원

Android 5.0은 Android의 새로운 머티리얼 디자인 스타일 지원을 추가합니다. 시각적으로 역동적이고 사용자가 자연스럽게 느끼는 UI 요소 전환이 있는 머티리얼 디자인으로 앱을 제작할 수 있습니다. 이 지원에는 다음 사항이 포함됩니다.

  • 머티리얼 테마
  • 그림자 보기
  • RecyclerView 위젯
  • 드로어블 애니메이션과 스타일링 효과
  • 머티리얼 디자인 애니메이션과 액티비티 전환 효과
  • 뷰 상태에 따른 뷰 속성의 애니메이션
  • 개발자가 제어하는 색상 팔레트가 포함된 사용자 지정 가능한 UI 위젯과 앱 모음
  • XML 벡터 그래픽에 기초한 애니메이션 및 비애니메이션 드로어블

앱에 머티리얼 디자인 기능을 추가하기 위한 자세한 정보는 머티리얼 디자인을 참조하세요.

최근 화면의 동시 문서 및 액티비티

이전 릴리스에서 최근 화면은 사용자가 가장 최근에 상호작용한 각 앱에서 하나의 작업만 표시할 수 있었습니다. 이제 앱에서 문서의 추가 동시 액티비티에 필요한 작업을 필요에 따라 더 많이 열 수 있습니다. 이 기능은 사용자가 최근 화면에서 개별 액티비티와 문서 사이를 신속히 전환할 수 있도록 하여 멀티태스킹을 용이하게 하고, 모든 앱에서 일관적인 전환 경험을 제공합니다. 이런 동시 작업의 예에는 웹 브라우저 앱의 열린 탭이나 생산성 앱의 문서, 게임에서의 동시 매치 또는 메시징 앱에서의 채팅이 포함됩니다. 여러분의 앱은 이런 작업을 ActivityManager.AppTask 클래스를 통해 관리할 수 있습니다.

논리적인 중단을 삽입하여 시스템이 액티비티를 새 작업으로 처리하도록 하려면, startActivity()로 액티비티를 시작할 때 FLAG_ACTIVITY_NEW_DOCUMENT를 사용합니다. 또한, 매니페스트에서 <activity> 요소의 documentLaunchMode 특성을 "intoExisting"이나 "always"로 설정하여 이 동작을 수행할 수 있습니다.

최근 화면이 어수선해지지 않게 하려면 화면에 나타날 수 있는 최대 작업 개수를 앱에서 설정할 수 있습니다. 이렇게 하려면 <application> 특성 android:maxRecents를 설정하세요. 현재 지정할 수 있는 최대값은 사용자당 작업 50개(RAM이 낮은 기기의 경우 25개)입니다.

최근 화면의 작업은 재부팅 시에도 지속되도록 설정할 수 있습니다. 영구 동작을 제어하려면 android:persistableMode 특성을사용합니다. 또한, 액티비티의 색상, 레이블, 아이콘 등의 시각적 액티비티 속성을 최근 화면에서 변경하려면 setTaskDescription() 메서드를 호출합니다.

WebView 업데이트

Android 5.0은 WebView 구현을 Chromium M37로 업데이트하면서 보안과 안정성을 강화하고 버그를 수정했습니다. Android 5.0에서 실행되는 WebView의 기본 사용자 에이전트 문자열은 버전 번호 37.0.0.0을 포함하도록 업데이트되었습니다.

이 릴리스에는 PermissionRequest 클래스가 새롭게 추가되었습니다. 이 클래스를 통해 앱은 getUserMedia()와 같은 웹 API를 통해 카메라나 마이크 등의 보호된 리소스에 액세스할 수 있는 WebView 권한을 부여할 수 있습니다. 앱이 WebView에 권한을 부여하려면 이러한 리소스에 대한 적절한 Android 권한이 있어야 합니다.

새로운 onShowFileChooser() 메서드를 사용하여 이제 WebView에서 입력 양식 필드를 사용하고 파일 선택기를 시작하여 Android 기기에서 이미지와 파일을 선택할 수 있습니다.

또한, 이 릴리스는 WebAudio, WebGLWebRTC 오픈 표준을 지원합니다. 이 릴리스에 포함된 새로운 기능에 대한 자세한 정보는 Android용 WebView를 참조하세요.

화면 캡처 및 공유

Android 5.0은 새로운 android.media.projection API로 앱에 화면 캡처 및 공유 기능을 추가할 수 있게 합니다. 예를 들어 화상회의 앱에서 화면 공유를 활성화하고 싶을 때 유용하게 사용할 수 있는 기능입니다.

새로운 createVirtualDisplay() 메서드는 앱이 메인 화면의 콘텐츠(기본 디스플레이)를 Surface 객체에 캡처할 수 있게 합니다. 여기서 앱은 네트워크 전체에 콘텐츠를 전송할 수 있습니다. API는 시스템 오디오가 아니라 비보안 화면 콘텐츠의 캡처만 허용합니다. 화면 캡처를 시작하려면 먼저 createScreenCaptureIntent() 메서드를 사용하여 얻은 Intent를 사용하여 화면 캡처 대화상자를 열어서 사용자에게 권한을 요청해야 합니다.

새로운 API를 사용하는 방법의 예시는 샘플 프로젝트의 MediaProjectionDemo 클래스를 참조하세요.

알림

잠금 화면 알림

Android 5.0의 잠금 화면에는 알림을 표시하는 기능이 있습니다. 사용자는 Settings에서 민감한 알림 콘텐츠가 안전한 잠금 화면 위에 표시되도록 할지를 선택할 수 있습니다.

앱은 안전한 잠금 화면에 알림을 표시할 때 보이는 세부정보 수준을 제어할 수 있습니다. 정보 공개 수준을 제어하려면 setVisibility()를 호출한 후 다음 값 중 하나를 지정합니다.

  • VISIBILITY_PRIVATE: 알림 아이콘 등의 기본 정보는 표시하지만 알림의 전체 콘텐츠는 숨깁니다.
  • VISIBILITY_PUBLIC: 알림의 전체 내용을 표시합니다.
  • VISIBILITY_SECRET: 알림 아이콘을 제외하고 아무 것도 표시하지 않습니다.

정보 공개 수준이 VISIBILITY_PRIVATE인 경우 개인적 세부정보를 숨기는 알림 콘텐츠의 편집된 버전을 제공할 수도 있습니다. 예를 들어, SMS 앱에서 "3개의 새 문자 메시지가 있습니다."라고 표시하되, 문자 메시지의 내용과 발신자는 숨길 수 있습니다. 이 대체 알림을 제공하려면, 우선 Notification.Builder를 사용하여 대체 알림을 생성합니다. 그런 다음 비공개 알림 객체를 생성할 때 setPublicVersion() 메서드를 통해 대체 알림을 이에 첨부합니다.

알림 메타데이터

Android 5.0은 앱 알림과 관련된 메타데이터를 사용하여 알림을 더욱 지능적으로 정렬합니다. 메타데이터를 설정하려면 알림을 구성할 때 Notification.Builder에서 다음 메서드를 호출합니다.

  • setCategory(): 기기가 우선 순위 모드일 때 앱 알림을 처리하는 방법을 시스템에 전달합니다(예를 들어, 알림이 수신 전화나 채팅 메시지, 알람 등을 나타낼 경우).
  • setPriority(): 알림을 일반 알림보다 더 중요하거나 덜 중요하다고 표시합니다. 우선 순위 필드가 PRIORITY_MAX 또는 PRIORITY_HIGH로 설정된 알림은 해당 알림에 소리나 진동도 포함되어 있을 경우 작은 부동 창에 표시됩니다.
  • addPerson(): 알림과 관련이 있는 한 명 이상의 사람을 추가할 수 있습니다. 개발자의 앱은 이 신호를 사용하여 시스템에 지정된 사람들로부터 받은 알림을 함께 그룹화해야 한다고 알리거나 이런 사람들로부터 받은 알림을 더욱 중요한 것으로 순위를 높일 수 있습니다.

그래픽

OpenGL ES 3.1 지원

Android 5.0은 Java 인터페이스와 OpenGLES 3.1의 기본 지원을 추가합니다. OpenGL ES 3.1에서 제공되는 주요 새로운 기능에는 다음이 포함됩니다.

  • 컴퓨트 셰이더
  • 개별 셰이더 객체
  • 간접 드로우 명령
  • 다중 샘플 및 스텐실 텍스처
  • 셰이딩 언어 개선
  • 고급 혼합 모드 및 디버깅을 위한 확장 기능
  • OpenGL ES 2.0 및 3.0의 구 버전 호환성

Android의 OpenGL ES 3.1용 Java 인터페이스는 GLES31로 제공됩니다. OpenGL ES 3.1을 사용할 때는 <uses-feature> 태그와 android:glEsVersion 특성을 사용하여 매니페스트 파일에서 이를 선언해야 합니다. 예를 들어 다음과 같이 합니다.

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

런타임에서 기기의 지원 OpenGL ES 버전을 확인하는 방법을 포함하여, OpenGL ES 사용에 관한 자세한 정보를 보려면 OpenGL ES API 가이드를 참조하세요.

Android 확장 기능 팩

이 릴리스는 OpenGL ES 3.1 외에도 Java 인터페이스와 고급 그래픽 기능에 대한 기본 지원이 포함된 확장 기능 팩을 제공합니다. 이러한 확장 기능은 Android에서 단일 패키지로 취급됩니다. (ANDROID_extension_pack_es31a 확장 기능이 있으면 앱은 패키지 내의 모든 확장 기능이 존재하는 것으로 간주하고 단일 #extension 구문으로 셰이딩 언어 기능을 활성화할 수 있습니다.)

확장 기능 팩 지원 항목:

  • 셰이더 저장소 버퍼, 이미지, 원자성에 대한 보증된 프래그먼트 셰이더 지원(프래그먼트 셰이더 지원은 OpenGL ES 3.1에서 선택 항목임)
  • 조각화 및 기하학 셰이더
  • ASTC(LDR) 텍스처 압축 형식
  • 샘플당 보간 및 셰이딩
  • 프레임 버퍼에서 각 색상 첨부에 대한 다양한 혼합 모드

확장 기능 팩용 Java 인터페이스는 GLES31Ext로 제공됩니다. 앱 매니페스트에서 앱이 확장 기능 팩을 지원하는 기기에만 설치되어야 한다고 선언할 수 있습니다. 예를 들어 다음과 같이 합니다.

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

미디어

고급 카메라 기능용 Camera API

Android 5.0은 새로운 android.hardware.camera2 API를 도입하여 섬세한 사진 캡처와 이미지 처리를 용이하게 합니다. 이제 getCameraIdList()로 시스템에서 사용할 수 있는 카메라 기기에 프로그래밍 방식으로 액세스하고 openCamera()로 특정 기기에 연결할 수 있습니다. 이미지 캡처를 시작하려면 CameraCaptureSession을 생성하고 캡처된 이미지를 전송하는 Surface 객체를 지정합니다. CameraCaptureSession은 셔터를 한 번 누를 때 사진을 1장 또는 여러 장 촬영하도록 구성할 수 있습니다.

새로운 이미지가 캡처되었을 때 알림을 받으려면 CameraCaptureSession.CaptureCallback 리스너를 구현하고 캡처 요청에서 설정합니다. 이제 시스템이 이미지 캡처 요청을 완료하면 CameraCaptureSession.CaptureCallback 리스너가 onCaptureCompleted()의 호출을 수신하고, CaptureResult에서 이미지 캡처 메타데이터를 제공합니다.

CameraCharacteristics 클래스는 앱이 기기에서 사용 가능한 카메라 기능을 확인하게 해 줍니다. 객체의 INFO_SUPPORTED_HARDWARE_LEVEL 속성은 카메라의 기능 수준을 나타냅니다.

  • 모든 기기는 적어도 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 하드웨어 수준을 지원합니다. 이는 사용이 중단된 Camera API의 하드웨어 수준과 비슷합니다.
  • INFO_SUPPORTED_HARDWARE_LEVEL_FULL 하드웨어 수준을 지원하는 기기는 캡처와 후처리를 수동으로 제어하고, 높은 프레임 속도에서 고해상도 이미지를 캡처할 수 있습니다.

업데이트된 Camera API 사용 방법을 보려면 이 릴리스의 Camera2BasicCamera2Video 구현 샘플을 참조하세요.

오디오 재생

이 릴리스에는 다음과 같은 AudioTrack 변경 사항이 포함되어 있습니다.

  • 이제 앱은 부동 소수점 형식의 오디오 데이터(ENCODING_PCM_FLOAT)를 제공할 수 있습니다. 이에 따라 더욱 큰 동적 범위, 더욱 일관된 정확도 및 더욱 큰 위쪽 공간이 허용됩니다. 특히, 부동 소수점 산술 연산은 중간 계산 시 유용합니다. 재생 엔드포인트는 오디오 데이터에 정수 형식을 사용하고 비트 깊이가 상대적으로 낮습니다. (Android 5.0에서 내부 파이프라인의 부분은 아직 부동 소수점이 아님)
  • 이제 앱은 오디오 데이터를 MediaCodec이 제공하는 것과 같은 형식의 ByteBuffer로 제공할 수 있습니다.
  • WRITE_NON_BLOCKING 옵션은 일부 앱의 버퍼링과 멀티스레딩을 단순화할 수 있습니다.

미디어 재생 컨트롤

새로운 알림과 미디어 API를 사용하여 시스템 UI가 미디어 재생에 대해 알고 앨범 아트를 추출, 표시할 수 있게 합니다. UI와 서비스에서 미디어 재생을 제어하는 작업이 이제 새로운 MediaSessionMediaController 클래스가 도입되면서 더욱 쉬워졌습니다.

새로운 MediaSession 클래스는 사용이 중단된 RemoteControlClient 클래스를 대체하고 전송 컨트롤 및 미디어 버튼 처리용 단일 콜백 세트를 제공합니다. 앱이 미디어 재생을 제공하고 Android TVWear 플랫폼에서 실행된다면, MediaSession 클래스로 같은 콜백 메서드를 사용하여 전송 컨트롤을 처리하세요.

이제 새로운 MediaController 클래스로 미디어 컨트롤러 앱을 빌드할 수 있습니다. 이 클래스는 앱 UI 프로세스에서 미디어 재생을 모니터링하고 제어할 수 있는 스레드로부터 안전한 방법을 제공합니다. 컨트롤러를 생성할 때는 MediaSession.Token 객체를 지정하여 앱이 주어진 MediaSession과 상호작용할 수 있게 합니다. MediaController.TransportControls 메서드를 사용하여, play(), stop(), skipToNext()setRating() 등의 명령을 전송하고 해당 세션에서 미디어 재생을 제어할 수 있습니다. 컨트롤러를 사용하여 MediaController.Callback 객체를 등록하고 세션의 메타데이터와 상태 변화를 수신 대기할 수도 있습니다.

또한, 새로운 Notification.MediaStyle 클래스로 미디어 세션과 연결된 재생 컨트롤을 허용하는 리치 알림을 생성할 수 있습니다.

미디어 탐색

Android 5.0에는 새로운 android.media.browse API를 통해 앱에서 다른 앱의 미디어 콘텐츠 라이브러리를 탐색하는 기능이 추가되었습니다. 앱의 미디어 콘텐츠를 노출하려면 MediaBrowserService 클래스를 확장합니다. MediaBrowserService의 구현에서는 앱이 서비스를 통해 제공되는 미디어 콘텐츠를 재생할 수 있도록 MediaSession.Token에 대한 액세스를 제공해야 합니다.

미디어 브라우저 서비스와 상호작용하려면 MediaBrowser 클래스를 사용합니다. MediaBrowser 인스턴스를 생성할 때는 MediaSession의 구성 요소 이름을 지정합니다. 그 브라우저 인스턴스를 사용하여 앱이 연결된 서비스에 연결하고 MediaSession.Token 객체를 획득하여 이 서비스를 통해 노출된 콘텐츠를 재생할 수 있습니다.

저장소

디렉터리 선택

Android 5.0은 저장소 액세스 프레임워크를 확장하여 사용자가 전체 디렉터리 하위 트리를 선택하여 각 항목에 대한 사용자의 확인을 일일이 요구하지 않고도 모든 포함된 문서에 대한 읽기/쓰기 액세스 권한을 앱에 부여할 수 있도록 합니다.

디렉터리 하위 트리를 선택하려면 OPEN_DOCUMENT_TREE 인텐트를 빌드하고 전송합니다. 시스템이 하위 트리 선택을 지원하는 모든 DocumentsProvider 인스턴스를 표시하여 사용자가 디렉터리를 탐색 및 선택할 수 있도록 합니다. 반환된 URI는 선택된 하위 트리에 대한 액세스를 나타냅니다. 그러면 buildChildDocumentsUriUsingTree()buildDocumentUriUsingTree()query()와 함께 사용하여 하위 트리를 탐색할 수 있습니다.

새로운 createDocument() 메서드를 사용하면 하위 트리 내부 어디에나 새로운 문서 또는 디렉터리를 생성할 수 있습니다. 기존 문서를 관리하려면 renameDocument()deleteDocument()를 사용합니다. COLUMN_FLAGS를 검사하여 호출하기 전에 이 호출에 대한 제공자 지원을 확인합니다.

DocumentsProvider를 구현하고 하위 트리 선택을 지원하려면 isChildDocument()를 구현하고 COLUMN_FLAGSFLAG_SUPPORTS_IS_CHILD를 포함합니다.

또한, Android 5.0에서는 공유된 저장소에 새로운 패키지별 디렉터리가 추가되었습니다. 앱은 MediaStore에 포함할 미디어 파일을 이 디렉터리에 추가할 수 있습니다. 새로운 getExternalMediaDirs()는 모든 공유된 저장소 기기에서 이러한 디렉터리에 대한 경로를 반환합니다. getExternalFilesDir()과 마찬가지로, 반환된 경로에 액세스할 때는 앱에 추가 권한이 필요 없습니다. 이 플랫폼은 이 디렉터리에서 주기적으로 새로운 미디어를 스캔하지만, MediaScannerConnection을 사용하여 명시적으로 새 콘텐츠를 스캔할 수 있습니다.

무선 및 연결

다중 네트워크 연결

Android 5.0은 앱이 특정 기능으로 이용 가능한 네트워크를 동적으로 스캔하게 해주는 새로운 다중 네트워킹 API를 제공하고 스캔된 네트워크와의 연결을 설정합니다. 이 기능은 앱이 SUPL, MMS 또는 이동통신사 청구 네트워크 등의 전문 네트워크를 요구하거나 특정 유형의 전송 프로토콜로 데이터를 전송하고자 할 때 유용합니다.

앱에서 네트워크를 동적으로 선택하고 연결하려면 다음 단계를 따릅니다.

  1. ConnectivityManager를 생성합니다.
  2. NetworkRequest.Builder 클래스를 사용하여 NetworkRequest 객체를 생성하고 앱과 관련된 네트워크 기능과 전송 유형을 지정합니다.
  3. 적절한 네트워크를 스캔하기 위해 requestNetwork() 또는 registerNetworkCallback()을 호출하고 NetworkRequest 객체와 ConnectivityManager.NetworkCallback의 구현에 전달합니다. 적절한 네트워크가 감지되었을 때 해당 네트워크로 능동적으로 전환하려면 requestNetwork() 메서드를 사용합니다. 능동적 전환 없이 스캔한 네트워크에 대한 알림만 수신하려면 대신 registerNetworkCallback() 메서드를 사용합니다.

시스템이 적절한 네트워크를 감지하면 해당 네트워크로 연결하고 onAvailable() 콜백을 호출합니다. 이 콜백의 Network 객체를 사용하여 네트워크에 관한 추가 정보를 얻거나 트래픽을 돌려서 선택된 네트워크를 사용할 수 있습니다.

블루투스 저전력

Android 4.3은 중심적 역할로 블루투스 저전력(Bluetooth LE)에 대한 플랫폼 지원을 도입했습니다. Android 5.0에서는 Android 기기가 블루투스 저전력 주변 기기 역할을 할 수 있게 되었습니다. 앱은 이 기능을 사용하여 근처 기기에 존재를 알릴 수 있습니다. 예를 들어, 기기가 계보기나 건강 모니터 역할을 하도록 허용하고 데이터를 다른 블루투스 저전력 기기에 전달하는 앱을 빌드할 수 있습니다.

새로운 android.bluetooth.le API는 앱이 광고를 브로드캐스트하고, 응답을 스캔하고, 근처 블루투스 저전력 기기와 연결을 설정하게 해줍니다. 새로운 광고 및 스캔 기능을 사용하려면 매니페스트에 BLUETOOTH_ADMIN 권한을 추가합니다. 사용자가 Play 스토어에서 앱을 업데이트하거나 다운로드할 때 앱에 다음과 같은 권한을 부여하라는 요청을 받습니다. "블루투스 연결 정보: 근처 블루투스 기기에 대한 정보를 브로드캐스팅하거나 수집하는 작업을 포함하여 앱이 블루투스를 제어하도록 허용합니다."

블루투스 저전력을 광고하여 다른 기기가 여러분의 앱을 발견할 수 있게 하려면 startAdvertising()을 호출하고 AdvertiseCallback 클래스 구현에 전달합니다. 이 콜백 객체는 광고 작업의 성공 또는 실수에 관한 보고서를 수신합니다.

Android 5.0은 ScanFilter 클래스를 도입하여 앱이 그와 관련된 특정 유형의 기기만 스캔할 수 있게 합니다. 블루투스 저전력 기기 스캔을 시작하려면 startScan()을 호출하고 필터 목록에 전달합니다. 메서드 호출에서 ScanCallback의 구현을 제공하여 블루투스 저전력 광고를 찾았을 때 보고해야 합니다.

NFC 강화

Android 5.0에는 NFC를 더욱 폭넓고 유연하게 사용할 수 있도록 하는 다음과 같은 향상된 기능이 추가되었습니다.

  • 이제 Android Beam을 share 메뉴에서 사용할 수 있게 되었습니다.
  • invokeBeam()을 호출하면 앱이 사용자 기기에서 Android Beam을 호출하고 데이터를 공유할 수 있습니다. 이렇게 하면 사용자가 데이터 전송을 완료하기 위해 다른 NFC 기능이 있는 기기와 자신의 기기를 직접 부딪칠 필요가 없습니다.
  • 새로운 createTextRecord() 메서드를 사용하여 NDEF 레코드가 포함된 UTF-8 텍스트 데이터를 생성할 수 있습니다.
  • 결제 앱을 개발 중이라면 registerAidsForService()를 호출하여 동적으로 NFC 애플리케이션 ID(AID)를 등록할 수 있습니다. setPreferredService()를 사용하여 특정 액티비티가 포그라운드에 있을 때 사용해야 하는 선호 카드 에뮬레이션 서비스를 설정할 수 있습니다.

프로젝트 Volta

Android 5.0은 새로운 기능 외에 배터리 수명의 개선도 강조합니다. 새로운 API와 도구를 사용하여 앱의 전력 소비를 이해하고 최적화합니다.

작업 예약

Android 5.0은 나중이나 특정 조건(예: 기기 충전 시)에서 비동기적으로 시스템을 실행하는 작업을 정의하여 배터리 수명을 최적화하는 새로운 JobScheduler API를 제공합니다. 작업 예약은 다음과 같은 상황에 유용합니다.

  • 앱에 차별화가 가능한 사용자 비대면 작업이 있을 경우.
  • 앱에 기기의 플러그가 꽂혀 있을 때 수행하는 것을 선호하는 작업이 있을 경우.
  • 앱에 네트워크 액세스나 Wi-Fi연결이 필요한 작업이 있을 경우.
  • 앱에 정기적 일정에 따라 일괄 실행하고자 하는 작업이 여러 개 있을 경우.

작업 단위는 JobInfo 객체에 의해 캡슐화됩니다. 이 객체는 예약 기준을 지정합니다.

JobInfo.Builder 클래스를 사용하여 예약된 작업을 실행하는 방식을 구성합니다. 작업을 예약하여 다음과 같은 특정 조건에서 실행할 수 있습니다.

  • 기가가 충전 중일 때 시작
  • 기기가 무제한 네트워크에 연결되었을 때 시작
  • 기기가 유휴 상태일 때 시작
  • 특정 마감 전에 또는 최소한의 지연으로 종료

예를 들어 다음과 같은 코드를 추가하여 무제한 네트워크에서 작업을 실행할 수 있습니다.

JobInfo uploadTask = new JobInfo.Builder(mJobId,
                                         mServiceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

기기에 안정적으로 전원이 공급된다면(2분 이상 플러그가 꽂혀 있고 배터리가 건강한 수준에 있음), 시스템은 작업 마감이 만료되지 않았더라도 실행할 준비가 된 모든 예약된 작업을 실행합니다.

JobScheduler API 사용 방법 예시를 보려면 이 릴리스의 JobSchedulerSample 구현 샘플을 참조하세요.

배터리 사용량을 위한 개발자 도구

새로운 dumpsys batterystats 명령은 고유 사용자 ID(UID)로 구성되는 기기의 배터리 사용량에 대한 흥미로운 통계 데이터를 생성합니다. 이러한 통계 데이터에는 다음이 포함됩니다.

  • 배터리 관련 이벤트 내역
  • 기기의 전역 통계
  • UID와 시스템 구성 요소당 대략적인 전력
  • 각 앱의 패킷당 모바일 ms
  • 시스템 UID 전체 통계
  • 앱 UID 전체 통계

필요에 맞게 출력을 지정하는 데 사용할 수 있는 다양한 옵션에 대한 자세한 내용을 보려면 --help 옵션을 사용하세요. 예를 들어, 기기가 마지막으로 충전된 이후 특정 앱 패키지의 배터리 사용량 통계를 출력하려면 다음 명령을 실행합니다.

$ adb shell dumpsys batterystats --charged <package-name>

dumpsys 명령 출력 시에 Battery Historian 도구를 사용하여 로그에서 전력 관련 이벤트의 HTML 가상화를 생성할 수 있습니다. 이 정보는 배터리 관련 문제를 쉽게 이해하고 진단할 수 있게 해 줍니다.

직장과 교육용 Android

관리된 프로비저닝

Android 5.0은 기업 환경에서 앱을 실행하기 위한 새로운 기능을 제공합니다. 사용자에게 기존 개인 계정이 있으면, 기기 관리자가 관리된 프로비저닝 프로세스를 시작하여 공존하지만 별개의 관리된 프로필을 기기에 추가합니다. 관리된 프로필과 연결된 앱이 사용자 런처, 최근 화면, 알림에서 비관리 앱과 함께 나타납니다.

관리된 프로비저닝 프로세스를 시작하려면 IntentACTION_PROVISION_MANAGED_PROFILE을 전송합니다. 호출이 성공적인 경우, 시스템은 onProfileProvisioningComplete() 콜백을 트리거합니다. 그러면 setProfileEnabled()를 호출하여 이 관리된 프로필을 활성화할 수 있습니다.

기본적으로 관리된 프로필에서는 앱의 작은 하위 세트만 활성화됩니다. enableSystemApp()을 호출하여 관리된 프로필에서 추가 앱을 설치할 수 있습니다.

런처 앱을 개발 중이라면 새로운 LauncherApps 클래스를 사용하여 현재 사용자와 모든 관련 관리된 프로필의 시작 가능 액티비티 목록을 받을 수 있습니다. 런처는 작업 배지를 드로어블 아이콘에 첨부하여 관리된 앱을 시각적으로 눈에 띄게 할 수 있습니다. 배지 아이콘을 검색하려면 getUserBadgedIcon()을 호출합니다.

새로운 기능 사용 방법을 보려면 이 릴리스에서 BasicManagedProfile 구현 샘플을 참조하세요.

기기 소유자

Android 5.0에서는 기기 소유자 앱을 배포하는 기능을 새롭게 제공합니다. 기기 소유자는 특수한 형태의 기기 관리자로, 보조 사용자를 생성 및 삭제하고 기기에서 전역 설정을 구성하는 추가 기능이 있습니다. 기기 소유자 앱은 DevicePolicyManager 클래스의 메서드를 사용하여 관리된 기기에서 구성, 보안 및 앱을 미세하게 제어합니다. 기기는 한 번에 활성 기기 소유자를 1개만 가질 수 있습니다.

기기 소유자를 배포하고 활성화하려면 기기가 프로비저닝되지 않은 상태일 때 프로그래밍 앱에서 NFC 데이터 전송을 수행해야 합니다. 이 데이터 전송은 관리된 프로비저닝에서 설명하는 프로비저닝 인텐트와 같은 정보를 전송합니다.

화면 고정

Android 5.0에서는 사용자가 작업에서 떠나거나 알림에 의해 작업이 중단되지 못하게 임시로 제한하는 새로운 화면 고정 API를 새롭게 제공합니다. 예를 들어, 이 API는 Android에서 중요한 평가 요구사항이나 단일 목적 또는 키오스크 애플리케이션을 지원하는 교육 앱을 개발할 때 사용할 수 있습니다. 앱이 화면 고정을 활성화하면 사용자는 앱이 화면 고정 모드를 종료할 때까지 알림을 보거나, 다른 앱에 액세스하거나, 홈 화면으로 돌아갈 수 없습니다.

화면 고정을 활성화하는 방법은 2가지가 있습니다.

  • 수동: 사용자는 Settings > Security > Screen Pinning에서 화면 고정을 활성화하고 최근 화면에서 녹색 핀 아이콘을 터치하여 고정하고자 하는 작업을 선택할 수 있습니다.
  • 프로그래밍 방식: 프로그래밍 방식으로 화면 고정을 활성화하려면 앱에서 startLockTask()를 호출합니다. 요청하는 앱이 기기 소유자가 아니라면 사용자에게 확인을 요청하는 메시지가 나타납니다. 기기 소유자 앱은 setLockTaskPackages() 메서드를 호출하여 사용자 확인 단계 없이도 앱 고정을 활성화할 수 있습니다.

작업 잠금이 활성화되면 다음 동작이 발생합니다.

  • 상태 표시줄이 비워지고, 사용자 알림과 상태 정보가 숨겨집니다.
  • Home과 Recent Apps 버튼이 숨겨집니다.
  • 다른 앱이 새로운 액티비티를 시작하지 못합니다.
  • 현재 앱은 새로운 작업을 생성하지 않는 한 새로운 액티비티를 시작할 수 있습니다.
  • 기기 소유자가 화면 고정을 호출하면 사용자는 앱이 stopLockTask()를 호출할 때까지 잠긴 상태로 있게 됩니다.
  • 화면 고정이 기기 소유자가 아닌 다른 앱이나 사용자가 직접 수행하는 액티비티인 경우 사용자는 Back과 Recent 버튼을 동시에 눌러 화면 고정을 종료할 수 있습니다.

인쇄 프레임워크

PDF를 비트맵으로 렌더링

이제 새로운 PdfRenderer 클래스를 사용하여 PDF 문서 페이지를 인쇄용 비트맵 이미지로 렌더링할 수 있습니다. 시스템이 인쇄 가능한 콘텐츠를 작성하는 곳에서 찾을 수 있는(즉, 콘텐츠를 랜덤으로 액세스할 수 있는) ParcelFileDescriptor를 지정해야 합니다. 앱은 openPage()로 렌더링할 페이지를 가져오고 render()를 호출하여 열린 PdfRenderer.Page를 비트맵으로 변환할 수 있습니다. 또한, 문서의 일부만 비트맵 이미지로 변환하고자 할 때 추가 매개변수를 설정할 수 있습니다(예: 타일식 렌더링을 구현하여 문서 확대).

새로운 API를 사용하는 방법의 예시는 PdfRendererBasic 샘플을 참조하세요.

시스템

앱 사용량 통계

이제 새로운 android.app.usage API를 사용하여 Android 기기에서 앱 사용량 기록에 액세스할 수 있습니다. 이 API는 사용이 중단된 getRecentTasks() 메서드보다 더욱 상세한 사용량 정보를 제공합니다. 이 API를 사용하려면 매니페스트에서 "android.permission.PACKAGE_USAGE_STATS" 권한을 선언해야 합니다. 사용자는 Settings > Security > Apps를 통해 앱이 사용량에 액세스하도록 활성화해야 합니다.

시스템이 앱별로 사용량 데이터를 수집하고 하루, 일주일, 한 달, 1년 기준으로 데이터를 취합합니다. 시스템이 이 데이터를 보관하는 최대 기한은 다음과 같습니다.

  • 일일 데이터: 7일
  • 주간 데이터: 4주
  • 월간 데이터: 6개월
  • 연간 데이터: 2년

각 앱에서 시스템은 다음 데이터를 기록합니다.

  • 앱을 마지막으로 사용한 시간
  • 해당 시간 간격(일, 주, 월 또는 년)에서 앱이 포그라운드에 있던 전체 시간
  • 구성 요소(패키지와 액티비티 이름으로 식별)가 하루 중 포그라운드나 백그라운드로 이동했을 때 캡처한 타임스탬프
  • 기기 구성이 변경되었을 때(예: 회전으로 인한 기기 방향 변경) 캡처한 타임스탬프

테스트 및 접근성

테스트 및 접근성 개선

Android 5.0은 테스트와 접근성을 위해 다음 지원을 추가합니다.

  • 새로운 getWindowAnimationFrameStats()getWindowContentFrameStats() 메서드는 창 애니메이션과 콘텐츠의 프레임 통계를 캡처합니다. 이 메서드를 사용하면 앱이 원활한 사용자 경험을 제공할 만큼 충분한 새로 고침 빈도에서 프레임을 렌더링하고 있는지 평가하기 위한 계측 도구를 작성할 수 있습니다.
  • 새로운 executeShellCommand() 메서드를 사용하면 계측 테스트에서 쉘 명령을 실행할 수 있습니다. 이 명령 실행은 기기에 연결된 호스트에서 adb shell을 실행하는 것과 비슷하고, dumpsys, am, content, pm 등과 같은 쉘 기반 도구를 사용할 수 있습니다.
  • 접근성 API(예: UiAutomator)를 사용하는 접근성 서비스와 테스트 도구는 이제 시력이 정상인 사용자가 상호작용할 수 있는 화면에서 창 속성에 관한 상세 정보를 조회할 수 있습니다. AccessibilityWindowInfo 객체의 목록을 조회하려면 새로운 getWindows() 메서드를 호출합니다.
  • 새로운 AccessibilityNodeInfo.AccessibilityAction 클래스를 사용하면 AccessibilityNodeInfo에서 수행하는 표준 또는 사용자 지정 동작을 정의할 수 있습니다. 새로운 AccessibilityNodeInfo.AccessibilityAction 클래스는 이전에 AccessibilityNodeInfo에서 확인된 동작 관련 API를 대체합니다.
  • Android 5.0은 앱에서 텍스트 음성 변환 합성을 미세하게 제어할 수 있는 기능을 제공합니다. 새로운 Voice 클래스를 통해 앱은 특정 로케일, 품질 및 지연 등급과 관련된 음성 프로필 및 텍스트 음성 변환 엔진 관련 매개변수를 사용할 수 있습니다.

IME

입력 언어의 간편한 전환

Android 5.0부터 사용자는 플랫폼이 지원하는 모든 입력 메서드 편집기(IME)를 더욱 쉽게 전환할 수 있습니다. 지정된 전환 동작을 수행하면(일반적으로 소프트 키보드에서 지구 모양 아이콘 터치) 이러한 모든 IME가 순환됩니다. 이 동작 변경은 shouldOfferSwitchingToNextInputMethod() 메서드가 구현합니다.

또한, 이제 프레임워크에서 다음 IME가 전환 메커니즘을 포함하는지(그리고 IME가 그 다음 IME로의 전환을 지원하는지) 확인합니다. 전환 메커니즘이 포함된 IME는 전환 메커니즘이 없는 IME로 순환되지 않습니다. 이 동작 변경은 switchToNextInputMethod() 메서드가 구현합니다.

업데이트된 IME 전환 API를 사용하는 방법의 예시를 보려면 이 릴리스에서 업데이트된 소프트 키보드 구현 샘플을 참조하세요. IME 전환 구현 방식에 관한 자세한 정보는 입력 메서드 생성을 참조하세요.

매니페스트 선언

선언이 필요한 기능

이제 다음 값은 <uses-feature> 요소에서 지원되므로 앱에 필요한 기능을 제공하는 기기에만 앱이 설치되게 할 수 있습니다.

사용자 권한

이제 다음 권한은 <uses-permission> 요소에서 지원되며, 앱이 특정 API 액세스에 요구하는 권한을 선언합니다.

  • BIND_DREAM_SERVICE: API 레벨 21 이상을 대상으로 할 때 Daydream 서비스가 이 권한을 요구하고, 시스템만이 이 권한에 바인딩되도록 합니다.