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, WebGL, WebRTC 오픈 표준을 지원합니다. 이 버전에 포함된 새로운 기능에 관한 자세한 내용은 Android용 WebView를 참고하세요.

화면 캡처 및 공유

Android 5.0에서는 새로운 android.media.projection API를 사용하여 앱에 화면 캡처 및 화면 공유 기능을 추가할 수 있습니다. 예를 들어 화상회의 앱에서 화면 공유를 사용 설정하려는 경우 이 기능이 유용합니다.

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

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

알림

잠금 화면 알림

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

앱은 안전한 잠금 화면에 알림을 표시할 때 보이는 세부정보 수준을 제어할 수 있습니다. 정보 공개 수준을 제어하려면 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 인터페이스와 OpenGL ES 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가 미디어 재생에 관해 인지하고 앨범 아트를 추출하여 표시할 수 있도록 합니다. 이제 새로운 MediaSessionMediaController 클래스를 사용하여 UI와 서비스에서 미디어 재생을 더 쉽게 제어할 수 있습니다.

새로운 MediaSession 클래스는 지원 중단된 RemoteControlClient 클래스를 대체하고 전송 컨트롤 및 미디어 버튼을 처리하기 위한 단일 콜백 메서드 세트를 제공합니다. 앱이 미디어 재생을 제공하고 Android TV 또는 Wear 플랫폼에서 실행되는 경우 MediaSession 클래스를 사용하여 동일한 콜백 메서드를 통해 전송 컨트롤을 처리합니다.

이제 새로운 MediaController 클래스로 자체 미디어 컨트롤러 앱을 빌드할 수 있습니다. 이 클래스는 앱 UI 프로세스에서 미디어 재생을 모니터링하고 제어할 수 있는 스레드로부터 안전한 방법을 제공합니다. 컨트롤러를 만들 때는 앱이 지정된 MediaSession와 상호작용할 수 있도록 MediaSession.Token 객체를 지정합니다. 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은 중심적 역할로 블루투스 저전력(블루투스 LE)에 대한 플랫폼 지원을 도입했습니다. Android 5.0에서는 Android 기기가 블루투스 저전력 주변 기기 역할을 할 수 있게 되었습니다. 앱은 이 기능을 사용하여 근처 기기에 존재를 알릴 수 있습니다. 예를 들어, 기기가 만보계나 건강 모니터 역할을 하도록 허용하고 데이터를 다른 블루투스 저전력 기기와 통신하는 앱을 빌드할 수 있습니다.

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

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

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

NFC 강화

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

  • 이제 Android Beam을 share 메뉴에서 사용할 수 있습니다.
  • invokeBeam()를 호출하면 앱이 사용자 기기에서 Android Beam을 호출하고 데이터를 공유할 수 있습니다. 이렇게 하면 사용자가 데이터 전송을 완료하기 위해 다른 NFC 지원 기기에 기기를 수동으로 탭하지 않아도 됩니다.
  • createTextRecord() 메서드를 사용하여 UTF-8 텍스트 데이터가 포함된 NDEF 레코드를 만들 수 있습니다.
  • 결제 앱을 개발하는 경우 이제 registerAidsForService()를 호출하여 NFC 애플리케이션 ID (AID)를 동적으로 등록할 수 있습니다. setPreferredService()를 사용하여 특정 활동이 포그라운드에 있을 때 사용해야 하는 기본 카드 에뮬레이션 서비스를 설정할 수도 있습니다.

프로젝트 Volta

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

작업 예약

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

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

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

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

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

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

Kotlin

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

자바

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_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가 도입되었습니다. 이 방법은 예를 들어 Android의 중요한 평가 요구사항이나 단일 목적 또는 키오스크 애플리케이션을 지원하는 교육 앱을 개발하는 경우에 사용할 수 있습니다. 앱에서 화면 고정을 활성화하면 사용자는 앱이 화면 고정 모드를 종료할 때까지 알림을 보거나 다른 앱에 액세스하거나 홈 화면으로 돌아갈 수 없습니다.

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

  • 수동: 사용자는 설정 > 보안 > 화면 고정에서 화면 고정을 사용 설정하고 최근 화면에서 녹색 핀 아이콘을 터치하여 고정하고자 하는 작업을 선택할 수 있습니다.
  • 프로그래매틱 방식: 프로그래매틱 방식으로 화면 고정을 활성화하려면 앱에서 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일, 1주, 1개월, 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 서비스가 이 권한을 요구하고, 시스템만이 이 권한에 바인딩되도록 합니다.