API 수준: 16
Android 4.1 (JELLY_BEAN
)은 향상된 성능과 향상된 사용자 환경을 제공하는 플랫폼의 발전입니다. 사용자와 앱 개발자를 위한 새로운 기능이 추가되었습니다. 이 문서에서는 앱 개발자를 위한 가장 주목할 만하고 유용한 새 API를 소개합니다.
앱 개발자는 SDK Manager에서 Android 4.1을 Android Emulator와 앱을 빌드할 수 있는 SDK 플랫폼에서 실행할 수 있는 시스템 이미지로 사용할 수 있습니다. Android 4.1에서 앱을 빌드하고 테스트하려면 가능한 한 빨리 시스템 이미지와 플랫폼을 다운로드해야 합니다.
Android 4.1을 실행하는 기기에서 앱을 더 효과적으로 최적화하려면 targetSdkVersion
를 "16"
로 설정하고 Android 4.1 시스템 이미지에 설치하고 테스트한 다음 이 변경사항으로 업데이트를 게시해야 합니다.
minSdkVersion
에서 지원하지 않는 API를 실행하기 전에 시스템 API 수준을 확인하는 조건을 코드에 추가하여 이전 버전을 지원하면서 Android 4.1의 API를 사용할 수 있습니다.
이전 버전과의 호환성 유지에 관한 자세한 내용은 이전 버전과 호환되는 UI 만들기를 참고하세요.
API 수준의 작동 방식에 관한 자세한 내용은 API 수준이란 무엇인가요?에서 확인할 수 있습니다.
앱 구성요소
격리된 서비스
<service>
태그에 android:isolatedProcess="true"
를 지정하면 Service
이 자체 권한이 없는 격리된 자체 사용자 ID 프로세스로 실행됩니다.
메모리 관리
TRIM_MEMORY_RUNNING_LOW
및 TRIM_MEMORY_RUNNING_CRITICAL
와 같은 새로운 ComponentCallbacks2
상수는 시스템이 onLowMemory()
를 호출하기 전에 포그라운드 프로세스에 메모리 상태에 관한 자세한 정보를 제공합니다.
새로운 getMyMemoryState(ActivityManager.RunningAppProcessInfo)
메서드를 사용하면 일반 메모리 상태를 검색할 수 있습니다.
콘텐츠 제공자
새로운 메서드인 acquireUnstableContentProviderClient()
를 사용하면 '불안정'할 수 있는 ContentProviderClient
에 액세스할 수 있으므로 콘텐츠 제공자가 다운되더라도 앱이 비정상 종료되지 않습니다. 이 기능은 별도의 앱에서 콘텐츠 제공업체와 상호작용할 때 유용합니다.
라이브 배경화면
라이브 배경화면 미리보기 활동을 직접 실행하는 새로운 인텐트 프로토콜로, 사용자가 앱을 강제 종료하지 않고 홈 배경화면 선택 도구를 통해 이동하지 않고도 라이브 배경화면을 쉽게 선택할 수 있도록 지원합니다.
라이브 배경화면 선택 도구를 실행하려면 ACTION_CHANGE_LIVE_WALLPAPER
를 사용하는 Intent
및 라이브 배경화면 ComponentName
를 EXTRA_LIVE_WALLPAPER_COMPONENT
의 문자열로 지정하는 추가 항목으로 startActivity()
를 호출합니다.
앱 스택 탐색
Android 4.1에서는 위로 탐색의 적절한 디자인 패턴을 훨씬 더 쉽게 구현할 수 있습니다.
매니페스트 파일의 각 <activity>
요소에 android:parentActivityName
를 추가하기만 하면 됩니다. 시스템은 사용자가 작업 모음에서 위로 버튼을 누르면 (현재 활동을 완료하는 동시에) 이 정보를 사용하여 적절한 활동을 엽니다. 따라서 각 활동의 android:parentActivityName
를 선언하면 onOptionsItemSelected()
메서드가 없어도 작업 모음의 앱 아이콘의 클릭 이벤트를 처리할 수 있습니다. 이제 시스템에서 이벤트를 처리하고 적절한 활동을 재개하거나 생성합니다.
이는 사용자가 알림이나 다른 앱의 인텐트와 같은 '심층 분석' 인텐트를 통해 앱 활동 중 하나를 시작하는 시나리오에 특히 유용합니다 (앱 간 이동의 디자인 가이드에 설명되어 있음). 사용자가 이런 방식으로 활동을 시작하면 사용자가 위로 이동할 때 재개할 수 있는 활동의 백 스택이 앱에 없을 수 있습니다. 그러나 활동에 android:parentActivityName
속성을 제공하면 시스템에서 앱에 상위 활동의 백 스택이 이미 포함되어 있는지 인식하고, 포함되어 있지 않으면 모든 상위 활동을 포함하는 합성 백 스택을 구성합니다.
참고: 사용자가 앱에 딥 활동을 입력하고 앱의 새 작업을 만들면 시스템은 실제로 상위 활동 스택을 작업에 삽입합니다. 따라서 뒤로 버튼을 누르면 상위 활동의 스택도 뒤로 이동합니다.
시스템이 앱의 합성 백 스택을 생성하면 기본 Intent
를 빌드하여 각 상위 활동의 새 인스턴스를 생성합니다. 따라서 사용자가 각 활동을 자연스럽게 탐색했을 것으로 예상되는 방식으로 상위 활동의 저장된 상태가 없습니다. 상위 활동에서 일반적으로 사용자의 컨텍스트에 종속된 UI를 표시하는 경우 이 컨텍스트 정보는 누락되므로 사용자가 스택을 다시 탐색할 때 컨텍스트 정보를 전달해야 합니다. 예를 들어 사용자가 음악 앱에서 앨범을 보고 있는 경우 위로 탐색하면 선택한 음악 장르의 모든 앨범을 나열하는 활동으로 이동할 수 있습니다. 이 경우 스택을 만들어야 한다면 상위 활동에 현재 앨범이 속한 장르를 상위 활동에 알려야 합니다. 그래야 상위 활동이 사용자가 실제로 이 활동에서 비롯된 것처럼 적절한 목록을 표시할 수 있습니다. 이러한 정보를 합성 상위 활동에 전달하려면 onPrepareNavigateUpTaskStack()
메서드를 재정의해야 합니다. 그러면 상위 활동을 합성하기 위해 시스템에서 만든 TaskStackBuilder
객체가 제공됩니다. TaskStackBuilder
에는 시스템에서 각 상위 활동을 만드는 데 사용하는 Intent
객체가 포함됩니다. onPrepareNavigateUpTaskStack()
구현에서는 적절한 Intent
를 수정하여 상위 활동이 적절한 컨텍스트를 결정하고 적절한 UI를 표시하는 데 사용할 수 있는 추가 데이터를 추가할 수 있습니다.
시스템이 TaskStackBuilder
를 생성하면 시스템은 활동 트리 맨 위부터 시작하여 논리적 순서로 상위 활동을 생성하는 데 사용되는 Intent
객체를 추가합니다. 따라서 내부 배열에 추가된 마지막 Intent
는 현재 활동의 직접적인 상위 요소입니다. 활동의 상위 요소 Intent
를 수정하려면 먼저 getIntentCount()
로 배열 길이를 결정하고 값을 editIntentAt()
에 전달합니다.
앱 구조가 더 복잡하다면 위로 탐색의 동작을 처리하고 합성 백 스택을 완전히 맞춤설정할 수 있는 다른 API를 사용할 수 있습니다. 추가로 제어할 수 있는 API는 다음과 같습니다.
onNavigateUp()
- 사용자가 위로 버튼을 누를 때 맞춤 작업을 실행하도록 이를 재정의합니다.
navigateUpTo(Intent)
- 현재 활동을 종료하고 제공된
Intent
가 나타내는 활동으로 이동하려면 이 메서드를 호출합니다. 활동이 백 스택에 있지만 가장 가까운 상위 활동이 아닌 경우 현재 활동과 인텐트로 지정된 활동 사이의 다른 모든 활동도 종료됩니다. getParentActivityIntent()
- 이 메서드를 호출하여 현재 활동의 논리적 상위 요소를 시작할
Intent
를 가져옵니다. shouldUpRecreateTask(Intent)
- 위로 이동하기 위해 합성 백 스택을 만들어야 하는지 쿼리하려면 이 메서드를 호출합니다. 합성 스택을 만들어야 하면 true를 반환하고, 적절한 스택이 이미 있으면 false를 반환합니다.
finishAffinity()
- 현재 활동에 연결된 동일한 작업 어피니티를 가진 모든 상위 활동과 현재 활동을 종료하려면 이 메서드를 호출합니다.
onNavigateUp()
와 같은 기본 동작을 재정의하는 경우 위로 탐색 시 합성 백 스택을 만들 때 이 메서드를 호출해야 합니다. onCreateNavigateUpTaskStack
- 합성 작업 스택이 생성되는 방식을 완전히 제어해야 하는 경우 이를 재정의합니다. 단순히 백 스택의 인텐트에 데이터를 추가하려면
onPrepareNavigateUpTaskStack()
를 재정의해야 합니다.
그러나 대부분의 앱은 이러한 API를 사용하거나 onPrepareNavigateUpTaskStack()
를 구현할 필요가 없지만 각 <activity>
요소에 android:parentActivityName
를 추가하기만 하면 올바른 동작을 실행할 수 있습니다.
멀티미디어
미디어 코덱
MediaCodec
클래스를 사용하면 미디어를 인코딩 및 디코딩하는 하위 수준 미디어 코덱에 액세스할 수 있습니다. createEncoderByType()
를 호출하여 미디어를 인코딩하거나 createDecoderByType()
를 호출하여 미디어를 디코딩하여 MediaCodec
를 인스턴스화할 수 있습니다. 각 메서드는 인코딩 또는 디코딩하려는 미디어 유형의 MIME 유형(예: "video/3gpp"
또는 "audio/vorbis"
)을 취합니다.
MediaCodec
인스턴스를 만들면 configure()
를 호출하여 미디어 형식 또는 콘텐츠 암호화 여부와 같은 속성을 지정할 수 있습니다.
미디어를 인코딩하든 디코딩하든 상관없이 MediaCodec
를 만든 후 나머지 프로세스는 동일합니다. 먼저 getInputBuffers()
를 호출하여 입력 ByteBuffer
객체의 배열을 가져오고 getOutputBuffers()
를 호출하여 출력 ByteBuffer
객체의 배열을 가져옵니다.
인코딩하거나 디코딩할 준비가 되면 dequeueInputBuffer()
를 호출하여 소스 미디어에 피드하는 데 사용해야 하는 ByteBuffer
의 색인 위치 (입력 버퍼 배열에서)를 가져옵니다. ByteBuffer
를 소스 미디어로 채운 후 queueInputBuffer()
를 호출하여 버퍼의 소유권을 해제합니다.
출력 버퍼의 경우에도 마찬가지로 dequeueOutputBuffer()
를 호출하여 결과를 수신할 ByteBuffer
의 색인 위치를 가져옵니다. ByteBuffer
의 출력을 읽은 후 releaseOutputBuffer()
를 호출하여 소유권을 해제합니다.
일반 queueInputBuffer()
대신 MediaCrypto
API와 함께 queueSecureInputBuffer()
를 호출하여 코덱에서 암호화된 미디어 데이터를 처리할 수 있습니다.
코덱 사용 방법에 관한 자세한 내용은 MediaCodec
문서를 참고하세요.
큐에서 오디오 녹음
새로운 메서드 startRecording()
를 사용하면 MediaSyncEvent
에서 정의한 큐를 기반으로 오디오 녹음을 시작할 수 있습니다.
MediaSyncEvent
는 완료되면 오디오 녹음기가 녹음을 시작하도록 트리거하는 오디오 세션(예: MediaPlayer
에서 정의된 세션)을 지정합니다. 예를 들어 이 기능을 사용하여 녹음 세션의 시작을 나타내는 오디오 톤을 재생하면 톤과 녹음 시작을 수동으로 동기화하지 않아도 녹음이 자동으로 시작됩니다.
시간이 지정된 텍스트 트랙
이제 MediaPlayer
가 대역 내 및 대역 외 텍스트 트랙을 모두 처리합니다.
대역 내 텍스트 트랙은 MP4 또는 3GPP 미디어 소스 내에서 텍스트 트랙으로 제공됩니다. 대역 외 텍스트 트랙은 addTimedTextSource()
메서드를 통해 외부 텍스트 소스로 추가할 수 있습니다. 모든 외부 텍스트 트랙 소스가 추가된 후 데이터 소스에서 사용 가능한 모든 트랙의 새로고침된 목록을 가져오려면 getTrackInfo()
를 호출해야 합니다.
트랙을 MediaPlayer
와 함께 사용하도록 설정하려면 사용하려는 트랙의 색인 위치를 사용하여 selectTrack()
를 호출해야 합니다.
텍스트 트랙을 재생할 준비가 되었을 때 알림을 받으려면 MediaPlayer.OnTimedTextListener
인터페이스를 구현하여 setOnTimedTextListener()
에 전달합니다.
오디오 효과
AudioEffect
클래스는 이제 오디오를 캡처할 때 추가 오디오 전처리 유형을 지원합니다.
AcousticEchoCanceler
를 사용하는 AEC (Acoustic Echo Canceler)는 캡처된 오디오 신호에서 원격 당사자로부터 수신한 신호의 기여도를 제거합니다.AutomaticGainControl
를 통한 자동 입력 신호량 제어 (AGC)는 캡처된 신호의 출력을 자동으로 정규화합니다.NoiseSuppressor
가 있는 노이즈 제거기 (NS)는 캡처된 신호에서 배경 소음을 제거합니다.
AudioEffect
서브클래스 중 하나를 사용하여 AudioRecord
로 캡처된 오디오에 이러한 전처리기 효과를 적용할 수 있습니다.
참고: 모든 기기가 이러한 효과를 지원한다고 보장할 수는 없으므로 항상 먼저 상응하는 오디오 효과 클래스에서 isAvailable()
를 호출하여 사용 가능 여부를 확인해야 합니다.
끊김 없는 재생
이제 두 개의 개별 MediaPlayer
객체 간에 끊김 없는 재생을 실행할 수 있습니다. 첫 번째 MediaPlayer
가 완료되기 전에 언제든지 setNextMediaPlayer()
를 호출하면 Android는 첫 번째 플레이어가 중지되는 순간에 두 번째 플레이어 시작을 시도합니다.
카메라
자동 초점 이동
새 인터페이스 Camera.AutoFocusMoveCallback
를 사용하면 자동 초점 이동의 변경사항을 수신 대기할 수 있습니다. setAutoFocusMoveCallback()
로 인터페이스를 등록할 수 있습니다. 그런 다음 카메라가 연속 자동 초점 모드 (FOCUS_MODE_CONTINUOUS_VIDEO
또는 FOCUS_MODE_CONTINUOUS_PICTURE
)에 있으면 자동 초점이 움직이기 시작했는지 또는 움직임이 중지되었는지 알려주는 onAutoFocusMoving()
호출을 수신합니다.
카메라 소리
MediaActionSound
클래스는 카메라 또는 기타 미디어 작업에서 만든 표준 사운드를 생성하는 간단한 API 세트를 제공합니다. 맞춤 스틸 카메라나 동영상 카메라를 빌드할 때 적절한 사운드를 재생하려면 이러한 API를 사용해야 합니다.
사운드를 재생하려면 MediaActionSound
객체를 인스턴스화하고 load()
를 호출하여 원하는 사운드를 미리 로드한 다음 적절한 시점에 play()
를 호출하면 됩니다.
연결
Android Beam
이제 Android BeamTM은 블루투스를 통한 대규모 페이로드 전송을 지원합니다. 새로운 setBeamPushUris()
메서드 또는 새 콜백 인터페이스 NfcAdapter.CreateBeamUrisCallback
를 사용하여 전송할 데이터를 정의하면 Android는 더 빠른 전송 속도를 달성하기 위해 블루투스 또는 다른 대체 전송으로 데이터 전송을 전달합니다. 이는 특히 이미지 및 오디오 파일과 같은 대용량 페이로드에 유용하며 기기 간에 눈에 띄는 페어링이 필요하지 않습니다. 앱에서 블루투스를 통한 전송을 활용하기 위해 추가 작업이 필요하지 않습니다.
setBeamPushUris()
메서드는 앱에서 전송할 데이터를 지정하는 Uri
객체의 배열을 취합니다. 또는 setBeamPushUrisCallback()
를 호출하여 활동에 지정할 수 있는 NfcAdapter.CreateBeamUrisCallback
인터페이스를 구현할 수 있습니다.
콜백 인터페이스를 사용할 때 시스템은 사용자가 Android Beam을 사용하여 공유할 때 인터페이스의 createBeamUris()
메서드를 호출하므로, 개발자는 공유 시간에 공유할 URI를 정의할 수 있습니다.
이는 공유할 URI가 활동 내의 사용자 컨텍스트에 따라 다를 수 있는 경우에 유용하지만 setBeamPushUris()
호출은 공유할 URI가 변경되지 않고 미리 안전하게 정의할 수 있는 경우에 유용합니다.
네트워크 서비스 검색
Android 4.1에는 멀티캐스트 DNS 기반 서비스 검색 지원이 추가되었습니다. 이를 통해 휴대기기, 프린터, 카메라, 미디어 플레이어, 로컬 네트워크에 등록된 기타 등 Wi-Fi를 통해 피어 기기에서 제공하는 서비스를 찾아 연결할 수 있습니다.
새 패키지 android.net.nsd
에는 로컬 네트워크에서 서비스를 브로드캐스트하고 네트워크에서 로컬 기기를 검색하며 기기에 연결할 수 있는 새로운 API가 포함되어 있습니다.
서비스를 등록하려면 먼저 NsdServiceInfo
객체를 만들고 setServiceName()
, setServiceType()
, setPort()
와 같은 메서드로 서비스의 다양한 속성을 정의해야 합니다.
그런 다음 NsdManager.RegistrationListener
를 구현하여 NsdServiceInfo
와 함께 registerService()
에 전달해야 합니다.
네트워크에서 서비스를 검색하려면 NsdManager.DiscoveryListener
를 구현하여 discoverServices()
에 전달합니다.
NsdManager.DiscoveryListener
가 찾은 서비스에 관한 콜백을 수신하면 resolveService()
를 호출하여 서비스를 확인하고 검색된 서비스에 관한 정보가 포함된 NsdServiceInfo
객체를 수신하는 NsdManager.ResolveListener
의 구현에 전달하여 연결을 시작해야 합니다.
Wi-Fi P2P 서비스 검색
Wi-Fi P2P API는 Android 4.1에서 개선되어 WifiP2pManager
에서 사전 연결 서비스 검색을 지원합니다. 이렇게 하면 Wi-Fi P2P를 사용하는 서비스로 주변 기기를 검색하고 필터링할 수 있는 반면, 네트워크 서비스 검색을 사용하면 기존에 연결된 네트워크 (예: 로컬 Wi-Fi 네트워크)에서 서비스를 검색할 수 있습니다.
다른 기기에서 앱을 검색하고 연결할 수 있도록 Wi-Fi를 통해 앱을 서비스로 브로드캐스트하려면 앱 서비스를 설명하는 WifiP2pServiceInfo
객체를 사용하여 addLocalService()
를 호출합니다.
Wi-Fi를 통한 근처 기기 검색을 시작하려면 먼저 Bonjour 또는 Upnp를 사용하여 통신할지 결정해야 합니다. Bonjour를 사용하려면 먼저 WifiP2pManager.DnsSdServiceResponseListener
및 WifiP2pManager.DnsSdTxtRecordListener
를 모두 사용하는 setDnsSdResponseListeners()
로 콜백 리스너를 설정합니다. Upnp를 사용하려면 WifiP2pManager.UpnpServiceResponseListener
를 사용하는 setUpnpServiceResponseListener()
를 호출하세요.
로컬 기기에서 서비스 검색을 시작하려면 addServiceRequest()
도 호출해야 합니다. 이 메서드에 전달하는 WifiP2pManager.ActionListener
가 성공적인 콜백을 수신하면 discoverServices()
를 호출하여 로컬 기기에서 서비스 검색을 시작할 수 있습니다.
로컬 서비스가 검색되면 Bonjour와 Upnp 중 어느 것을 사용하도록 등록했는지에 따라 WifiP2pManager.DnsSdServiceResponseListener
또는 WifiP2pManager.UpnpServiceResponseListener
의 콜백을 수신합니다. 두 경우 모두 수신된 콜백에는 피어 기기를 나타내는 WifiP2pDevice
객체가 포함됩니다.
네트워크 사용량
새로운 메서드 isActiveNetworkMetered()
를 사용하면 기기가 현재 데이터 전송량 제한이 있는 네트워크에 연결되어 있는지 확인할 수 있습니다. 집약적인 네트워크 트랜잭션을 실행하기 전에 이 상태를 확인하면 사용자에게 비용이 발생할 수 있는 데이터 사용량을 관리하고, 지금 또는 나중에 (예: 기기가 Wi-Fi에 연결되었을 때) 트랜잭션을 실행할지에 관한 정보에 입각한 결정을 내릴 수 있습니다.
접근성
접근성 서비스 API
Android 4.1에서 접근성 서비스 API의 도달범위가 크게 증가했습니다. 이제 AccessibilityEvent
, AccessibilityNodeInfo
, AccessibilityRecord
클래스에 추가하여 onGesture()
및 기타 입력 이벤트를 사용하는 복잡한 동작과 같은 더 많은 입력 이벤트를 모니터링하고 응답하는 서비스를 빌드할 수 있습니다.
접근성 서비스는 performAction
및 setMovementGranularities
를 사용하여 텍스트 클릭, 스크롤, 단계별 실행과 같은 작업을 사용자를 대신하여 실행할 수도 있습니다. 또한 performGlobalAction()
메서드를 사용하면 서비스에서 뒤로, 홈, 최근 앱 및 알림 열기와 같은 작업을 실행할 수 있습니다.
맞춤설정 가능한 앱 탐색
Android 앱을 빌드할 때 이제 findFocus()
및 focusSearch()
를 사용하여 포커스 가능 요소와 입력 위젯을 찾아 탐색 스키마를 맞춤설정하고 setAccessibilityFocused()
를 사용하여 포커스를 설정할 수 있습니다.
접근성이 개선된 위젯
새로운 android.view.accessibility.AccessibilityNodeProvider
클래스를 사용하면 접근성 서비스에 복잡한 맞춤 뷰를 표시하여 더 액세스하기 쉬운 방식으로 정보를 표시할 수 있습니다. android.view.accessibility.AccessibilityNodeProvider
를 사용하면 캘린더 그리드와 같은 고급 콘텐츠가 포함된 사용자 위젯이 위젯의 레이아웃 구조와 완전히 분리된 접근성 서비스의 논리적 시맨틱 구조를 표시할 수 있습니다. 접근성 서비스는 이러한 시맨틱 구조를 통해 시각 장애가 있는 사용자에게 더 유용한 상호작용 모델을 제공할 수 있습니다.
복사하여 붙여넣기
인텐트를 사용하여 복사 및 붙여넣기
이제 setClipData()
메서드를 사용하여 ClipData
객체를 Intent
와 연결할 수 있습니다.
여러 문서를 공유하는 경우와 같이 인텐트를 사용하여 여러 content:
URI를 다른 애플리케이션으로 전송하는 경우 특히 유용합니다. 이 방법으로 제공된 content:
URI는 인텐트의 플래그를 고려하여 읽기 또는 쓰기 액세스 권한을 제공하므로 인텐트의 여러 URI에 대한 액세스 권한을 부여할 수 있습니다. ACTION_SEND
또는 ACTION_SEND_MULTIPLE
인텐트를 시작할 때 이제 인텐트에 제공된 URI가 자동으로 ClipData
에 전파되어 수신기에 액세스 권한이 부여될 수 있습니다.
HTML 및 문자열 스타일 지원
이제 ClipData
클래스에서 스타일이 지정된 텍스트 (HTML 또는 Android 스타일 문자열로)를 지원합니다. newHtmlText()
를 사용하여 ClipData
에 HTML 스타일 텍스트를 추가할 수 있습니다.
Renderscript
Renderscript 계산 기능은 다음 기능으로 개선되었습니다.
- 하나의 스크립트 내에서 여러 커널을 지원합니다.
- 새 스크립트 API
rsSample
에서 컴퓨팅의 필터링된 샘플러를 사용하여 할당에서 읽기를 지원합니다. #pragma
에서 다양한 수준의 FP 정밀도가 지원됩니다.- 컴퓨팅 스크립트에서 RS 객체의 추가 정보 쿼리를 지원합니다.
- 다양한 성능 개선사항
새 pragmas를 사용하여 컴퓨팅 Renderscript에 필요한 부동 소수점 정밀도를 정의할 수도 있습니다. 이를 통해 전체 IEEE 754-2008 표준으로는 불가능했던 빠른 벡터 수학 연산과 같은 작업을 CPU 경로에서 사용 설정할 수 있습니다.
참고: 실험용 Renderscript 그래픽 엔진은 이제 지원 중단되었습니다.
애니메이션
활동 실행 애니메이션
이제 확대/축소 애니메이션 또는 자체 맞춤 애니메이션을 사용하여 Activity
를 실행할 수 있습니다. 원하는 애니메이션을 지정하려면 ActivityOptions
API를 사용하여 Bundle
를 빌드한 다음 활동을 시작하는 메서드(예: startActivity()
)에 전달할 수 있습니다.
ActivityOptions
클래스에는 활동이 열릴 때 표시할 수 있는 애니메이션 유형별로 다른 메서드가 포함되어 있습니다.
makeScaleUpAnimation()
- 화면의 지정된 시작 위치와 지정된 시작 크기에서 활동 창을 확장하는 애니메이션을 만듭니다. 예를 들어 Android 4.1의 홈 화면에서는 앱을 열 때 이 이름이 사용됩니다.
makeThumbnailScaleUpAnimation()
- 지정된 위치 및 제공된 썸네일 이미지에서 시작하여 활동 창을 확장하는 애니메이션을 만듭니다. 예를 들어 Android 4.1의 최근 앱 창에서 앱으로 돌아갈 때 이 창을 사용합니다.
makeCustomAnimation()
- 자체 리소스로 정의한 애니메이션을 만듭니다. 하나는 활동 열기의 애니메이션을 정의하고 다른 하나는 중지 중인 활동의 애니메이션을 정의합니다.
시간 애니메이터
새 TimeAnimator
는 애니메이션의 모든 프레임에 관해 알리는 TimeAnimator.TimeListener
가 포함된 간단한 콜백 메커니즘을 제공합니다. 이 애니메이터에는 지속 시간, 보간 유형 또는 객체 값 설정이 없습니다. 리스너의 콜백은 총 경과 시간과 이전 애니메이션 프레임 이후의 경과 시간을 비롯한 각 프레임의 정보를 수신합니다.
사용자 인터페이스
알림
Android 4.1에서는 더 큰 콘텐츠 영역, 큰 이미지 미리보기, 여러 작업 버튼, 구성 가능한 우선순위를 사용하여 알림을 만들 수 있습니다.
알림 스타일
새로운 메서드 setStyle()
를 사용하면 각각 더 큰 콘텐츠 영역을 제공하는 알림에 새로운 세 가지 스타일 중 하나를 지정할 수 있습니다. 큰 콘텐츠 영역의 스타일을 지정하려면 setStyle()
에 다음 객체 중 하나를 전달합니다.
Notification.BigPictureStyle
- 큰 이미지 첨부파일이 포함된 알림에 사용합니다.
Notification.BigTextStyle
- 하나의 이메일과 같이 많은 텍스트가 포함된 알림
Notification.InboxStyle
- 여러 이메일의 스니펫과 같은 문자열 목록이 포함된 알림에 사용됩니다.
알림 작업
알림에서 일반 스타일을 사용하든 더 큰 스타일을 사용하든 상관없이 이제 알림 메시지 하단에 표시되는 최대 두 개의 작업 버튼이 지원됩니다.
작업 버튼을 추가하려면 addAction()
를 호출합니다. 이 메서드는 아이콘의 드로어블 리소스, 버튼의 텍스트, 수행할 작업을 정의하는 PendingIntent
, 이렇게 세 가지 인수를 사용합니다.
우선순위
이제 우선순위를 setPriority()
로 설정하여 알림이 목록의 알림 순서에 영향을 미치는 것이 얼마나 중요한지 시스템에 암시할 수 있습니다. Notification
클래스의 PRIORITY_*
상수로 정의된 다섯 가지 우선순위 수준 중 하나를 전달할 수 있습니다. 기본값은 PRIORITY_DEFAULT
이며 두 개의 상위 수준과 하위 두 개가 있습니다.
높은 우선순위 알림은 사용자가 일반적으로 빠르게 응답하기를 원하는 알림입니다(예: 새로운 채팅 메시지, 문자 메시지 또는 임박한 이벤트 알림). 우선순위가 낮은 알림에는 만료된 캘린더 일정이나 앱 프로모션 등이 있습니다.
시스템 UI 컨트롤
Android 4.0(Ice Cream Sandwich)에는 시스템 UI 요소의 가시성을 제어하는 새 플래그가 추가되었습니다(예: 시스템 표시줄의 모양을 어둡게 하거나 핸드셋에서 완전히 사라짐).
Android 4.1에는 setSystemUiVisibility()
를 호출하고 다음 플래그를 전달하여 이러한 요소와 관련하여 시스템 UI 요소 및 활동 레이아웃의 모양을 추가로 제어할 수 있는 플래그가 몇 개 더 추가되었습니다.
SYSTEM_UI_FLAG_FULLSCREEN
- 중요하지 않은 시스템 UI (예: 상태 표시줄)를 숨깁니다.
활동이 오버레이 모드에서 작업 모음을 사용하는 경우 (
android:windowActionBarOverlay
사용 설정) 이 플래그는 작업 모음도 숨깁니다. 작업 모음 두 개를 숨기거나 표시할 때는 조정된 애니메이션을 사용하여 작업 모음을 숨깁니다. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- 시스템 UI 요소가 계속 표시되어 있더라도
SYSTEM_UI_FLAG_FULLSCREEN
를 사용 설정한 경우 사용 가능한 것과 동일한 화면 영역을 사용하도록 활동 레이아웃을 설정합니다. 레이아웃의 일부가 시스템 UI에 의해 오버레이되지만 이는 앱에서SYSTEM_UI_FLAG_FULLSCREEN
를 사용하여 시스템 UI를 자주 숨기고 표시하는 경우 유용합니다. 이렇게 하면 시스템 UI가 숨기거나 표시할 때마다 레이아웃이 새 레이아웃 경계로 조정되지 않기 때문입니다. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- 시스템 UI 요소가 계속 표시되어 있더라도
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(Android 4.0에서 추가됨)를 사용 설정했을 때 사용 가능한 것과 동일한 화면 영역을 사용하도록 활동 레이아웃을 설정합니다. 레이아웃의 일부가 탐색 메뉴에 의해 오버레이되지만 이 방법은 앱에서SYSTEM_UI_FLAG_HIDE_NAVIGATION
를 사용하여 탐색 메뉴를 자주 숨기고 표시하는 경우에 유용합니다. 이렇게 하면 탐색 메뉴가 숨기거나 표시될 때마다 레이아웃이 새 레이아웃 경계로 조정되지 않기 때문입니다. SYSTEM_UI_FLAG_LAYOUT_STABLE
- 뷰에서
fitSystemWindows()
를 호출할 때 사용 가능한 화면 공간과 관련하여 정의된 경계가 일관되게 유지되도록 하기 위해SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
또는SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
를 사용하는 경우 이 플래그를 추가할 수 있습니다. 즉, 이 플래그를 설정하면 모든 시스템 UI를 숨긴 후에도fitSystemWindows()
는 시스템 UI 요소의 공개 상태가 변경되지 않는 것처럼 작동합니다.
다른 관련 시스템 UI 플래그에 관한 자세한 내용은 Android 4.0에 추가된 플래그를 참조하세요.
원격 뷰
GridLayout
및 ViewStub
는 이제 원격 뷰이므로 앱 위젯 및 알림 맞춤 레이아웃의 레이아웃에서 사용할 수 있습니다.
글꼴 모음
Android 4.1에는 Roboto 글꼴 스타일의 여러 변형이 추가되어 총 10개의 변형이 추가되었으며, 이러한 변형은 모두 앱에서 사용할 수 있습니다. 이제 앱에서 밝은 변형과 압축 변형의 전체 세트에 액세스할 수 있습니다.
사용 가능한 Roboto 글꼴 변형의 전체 집합은 다음과 같습니다.
- 일반
- 기울임꼴
- 굵게
- 굵은 기울임꼴
- 밝게
- 연한 기울임꼴
- 축약 일반
- 축약 기울임꼴
- 좁게 굵게
- 축약된 굵은 기울임꼴
이 중 하나를 새 fontFamily
속성과 textStyle
속성과 조합하여 적용할 수 있습니다.
지원되는 fontFamily
값은 다음과 같습니다.
- 일반 Roboto의 경우
"sans-serif"
"sans-serif-light"
: Roboto Light"sans-serif-condensed"
: Roboto 압축
그런 다음 textStyle
값 "bold"
및 "italic"
을 사용하여 굵게 또는 기울임꼴을 적용할 수 있습니다. 두 가지 모두 android:textStyle="bold|italic"
와 같이 적용할 수 있습니다.
Typeface.create()
도 사용할 수 있습니다.
예를 들면 다음과 같습니다. Typeface.create("sans-serif-light", Typeface.NORMAL)
입력 프레임워크
다중 입력 기기
새로운 InputManager
클래스를 사용하면 현재 연결된 입력 기기 세트를 쿼리하고 새 기기가 추가, 변경 또는 삭제될 때 알림을 받도록 등록할 수 있습니다. 이는 여러 플레이어를 지원하는 게임을 빌드하고 있으며 연결된 컨트롤러의 수와 컨트롤러 수가 변경되는 시점을 감지하려는 경우에 특히 유용합니다.
getInputDeviceIds()
를 호출하여 연결된 모든 입력 기기를 쿼리할 수 있습니다. 이렇게 하면 각각 다른 입력 장치의 ID인 정수 배열이 반환됩니다. 그런 다음 getInputDevice()
를 호출하여 지정된 입력 기기 ID의 InputDevice
를 획득할 수 있습니다.
새 입력 기기가 연결, 변경, 연결 해제될 때 알림을 받으려면 InputManager.InputDeviceListener
인터페이스를 구현하고 registerInputDeviceListener()
로 등록하세요.
입력 컨트롤러의 진동
연결된 입력 기기에 자체 진동 기능이 있는 경우 이제 InputDevice
에서 getVibrator()
를 호출하여 기존 Vibrator
API를 사용하여 이러한 기기의 진동을 제어할 수 있습니다.
권한
새로운 권한은 다음과 같습니다.
READ_EXTERNAL_STORAGE
- 외부 저장소에 대해 보호된 읽기 액세스를 제공합니다. Android 4.1에서는 기본적으로 모든 애플리케이션에 여전히 읽기 액세스 권한이 있습니다. 향후 출시에서 애플리케이션이 이 권한을 사용하여 읽기 액세스를 명시적으로 요청해야 하도록 변경될 예정입니다. 애플리케이션에 이미 쓰기 액세스 권한을 요청한 경우 자동으로 읽기 액세스 권한도 부여됩니다. 읽기 액세스 제한을 사용 설정하는 새로운 개발자 옵션이 있습니다. 이 옵션을 사용하면 개발자가 향후 Android 동작과 비교하여 애플리케이션을 테스트할 수 있습니다.
- android.Manifest.permission.READ_USER_DICTIONARY
- 애플리케이션이 사용자 사전을 읽도록 허용합니다. 이는 IME 또는 설정 앱과 같은 사전 편집기에서만 요구해야 합니다.
READ_CALL_LOG
- 애플리케이션이 수신 및 발신 전화에 관한 정보가 포함된 시스템의 통화 기록을 읽도록 허용합니다.
WRITE_CALL_LOG
- 애플리케이션이 휴대전화에 저장된 시스템의 통화 기록을 수정하도록 허용합니다.
- android.Manifest.permission.WRITE_USER_DICTIONARY
- 애플리케이션이 사용자의 단어 사전에 쓸 수 있도록 허용합니다.
기기 기능
Android 4.1에는 텔레비전 화면에 사용자 인터페이스를 표시하는 전용 기기의 새로운 기능 선언인 FEATURE_TELEVISION
가 포함되어 있습니다. 앱에 텔레비전 인터페이스가 필요하다고 선언하려면 <uses-feature>
요소를 사용하여 매니페스트 파일에서 이 기능을 선언합니다.
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
이 기능은 '텔레비전'을 대형 화면에 표시되는 일반적인 거실 텔레비전 환경으로 정의합니다. 사용자가 멀리 앉아서 주요 입력 형식은 D패드와 같고 일반적으로 터치나 마우스/포인터 기기를 통하지 않습니다.