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 벡터 그래픽에 기초한 애니메이션 및 비애니메이션 드로어블

앱에 Material Design 기능을 추가하는 방법에 관한 자세한 내용은 Material Design을 참고하세요.

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

이전 출시에서 최근 화면은 사용자가 가장 최근에 상호작용한 앱마다 하나의 작업만 표시할 수 있었습니다. 이제 앱에서 문서의 추가 동시 활동에 필요한 작업을 필요에 따라 더 많이 열 수 있습니다. 이 기능은 사용자가 최근 화면에서 개별 활동과 문서 간에 빠르게 전환할 수 있도록 하여 멀티태스킹을 용이하게 하고 모든 앱에서 일관된 전환 환경을 제공합니다. 이러한 동시 작업의 예로는 웹브라우저 앱의 열린 탭, 생산성 앱의 문서, 게임에서의 동시 대결, 메시지 앱의 채팅이 포함될 수 있습니다. 앱은 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의 잠금 화면에는 알림을 표시하는 기능이 있습니다. 사용자는 설정에서 민감한 알림 콘텐츠가 보안 잠금 화면에 표시되도록 허용할지 선택할 수 있습니다.

앱은 안전한 잠금 화면에 알림을 표시할 때 표시되는 세부정보 수준을 제어할 수 있습니다. 공개 상태를 제어하려면 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용 자바 인터페이스는 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 외에도 이 출시는 자바 인터페이스와 고급 그래픽 기능에 관한 기본 지원이 포함된 확장 프로그램 팩을 제공합니다. 이러한 확장 프로그램은 Android에서 단일 패키지로 취급됩니다. ANDROID_extension_pack_es31a 확장 프로그램이 있으면 앱은 패키지의 모든 확장 프로그램이 있다고 가정하고 단일 #extension 문으로 셰이딩 언어 기능을 사용 설정할 수 있습니다.

확장 기능 팩 지원 항목:

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

확장 프로그램 팩용 자바 인터페이스는 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는 버스트에서 단일 장면 또는 여러 이미지를 촬영하도록 구성할 수 있습니다.

새 이미지가 캡처될 때 알림을 받으려면 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.Token 객체를 지정하면 앱이 지정된 MediaSession와 상호작용할 수 있습니다. MediaController.TransportControls 메서드를 사용하여 play(), stop(), skipToNext(), setRating()와 같은 명령어를 전송하여 해당 세션에서 미디어 재생을 제어할 수 있습니다. 컨트롤러를 사용하여 MediaController.Callback 객체를 등록하여 세션의 메타데이터 및 상태 변경사항을 수신 대기할 수도 있습니다.

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

미디어 탐색

Android 5.0에는 앱이 새로운 android.media.Dataproc 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 기기가 블루투스 LE 주변기기 역할을 할 수 있습니다. 앱은 이 기능을 사용하여 근처 기기에 존재를 알릴 수 있습니다. 예를 들어 기기가 만보계 또는 건강 모니터 역할을 하도록 허용하고 데이터를 다른 블루투스 저전력 기기와 통신할 수 있는 앱을 빌드할 수 있습니다.

새로운 android.bluetooth.le API를 사용하면 앱에서 광고를 브로드캐스트하고 응답을 검색하며 근처 블루투스 LE 기기와 연결을 형성할 수 있습니다. 새로운 광고 및 스캔 기능을 사용하려면 매니페스트에 BLUETOOTH_ADMIN 권한을 추가합니다. 사용자가 Play 스토어에서 앱을 업데이트하거나 다운로드할 때 앱에 다음 권한을 부여하라는 메시지가 표시됩니다. '블루투스 연결 정보: 앱이 블루투스를 제어하도록 허용합니다. 여기에는 근처 블루투스 기기에 관한 정보를 브로드캐스트하거나 가져오는 것이 포함됩니다.'

다른 기기에서 앱을 검색할 수 있도록 블루투스 LE 광고를 시작하려면 startAdvertising()를 호출하고 AdvertiseCallback 클래스의 구현을 전달합니다. 콜백 객체는 광고 작업의 성공 또는 실패에 관한 보고서를 수신합니다.

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

NFC 강화

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

  • 이제 Android Beam을 공유 메뉴에서 사용할 수 있습니다.
  • 앱은 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)

Java

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은 엔터프라이즈 환경에서 앱을 실행하기 위한 새로운 기능을 제공합니다. 사용자에게 기존 개인 계정이 있는 경우 기기 관리자는 관리 프로비저닝 프로세스를 시작하여 기기에 공동이지만 별도의 관리 프로필을 추가할 수 있습니다. 관리 프로필과 연결된 앱은 사용자의 런처, 최근 화면, 알림에서 비관리 앱과 함께 표시됩니다.

관리 프로비저닝 프로세스를 시작하려면 Intent에서 ACTION_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()를 호출할 때까지 앱에 잠긴 상태로 유지됩니다.
  • 기기 소유자가 아닌 다른 앱이나 사용자가 직접 화면 고정을 활성화한 경우 사용자는 뒤로 버튼과 최근 버튼을 모두 길게 눌러 화면 고정을 종료할 수 있습니다.

인쇄 프레임워크

PDF를 비트맵으로 렌더링

이제 새 PdfRenderer 클래스를 사용하여 PDF 문서 페이지를 인쇄할 비트맵 이미지로 렌더링할 수 있습니다. 시스템이 인쇄 가능한 콘텐츠를 작성하는 검색 가능한 ParcelFileDescriptor를 지정해야 합니다. 즉, 콘텐츠를 무작위로 액세스할 수 있습니다. 앱은 openPage()로 렌더링할 페이지를 가져온 다음 render()를 호출하여 열린 PdfRenderer.Page를 비트맵으로 변환할 수 있습니다. 문서의 일부만 비트맵 이미지로 변환하려는 경우 (예: 문서를 확대하기 위해 타일 렌더링을 구현하려는 경우) 추가 매개변수를 설정할 수도 있습니다.

새 API를 사용하는 방법의 예는 PdfRendererBasic 샘플을 참고하세요.

시스템

앱 사용량 통계

이제 새로운 android.app.usage API를 사용하여 Android 기기에서 앱 사용 기록에 액세스할 수 있습니다. 이 API는 지원 중단된 getRecentTasks() 메서드보다 더 자세한 사용량 정보를 제공합니다. 이 API를 사용하려면 먼저 매니페스트에서 "android.permission.PACKAGE_USAGE_STATS" 권한을 선언해야 합니다. 또한 사용자는 설정 > 보안 > 앱에서 사용 기록에 액세스할 수 있도록 이 앱에 액세스를 사용 설정해야 합니다.

시스템은 앱별로 사용 데이터를 수집하여 매일, 매주, 매월, 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에 액세스하는 데 필요한 권한을 선언합니다.