API レベル: 16
Android 4.1(JELLY_BEAN
)は、パフォーマンスとユーザー エクスペリエンスを向上させたプラットフォームの進化版です。ユーザーとアプリ デベロッパー向けの新機能が追加されています。このドキュメントでは、アプリ デベロッパーにとって最も注目すべき新しい API と便利な新しい API の概要について説明します。
アプリのデベロッパーの皆様は、Android 4.1 を SDK Manager から、Android Emulator で実行できるシステム イメージとして、およびアプリをビルドできる SDK プラットフォームとして入手できます。Android 4.1 でアプリをビルドしてテストするには、システム イメージとプラットフォームをできるだけ早くダウンロードする必要があります。
Android 4.1 を搭載している端末向けにアプリを最適化するには、targetSdkVersion
を "16"
に設定し、Android 4.1 システム イメージにアプリをインストールした後、この変更を加えたアップデート済みのアプリを公開します。
Android 4.1 でも API を使用しながらも、以前のバージョンをサポートすることもできます。そのためには、minSdkVersion
でサポートされていない API を実行する前に、システム 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
クラスは、メディアのエンコードとデコードを行うための低レベルのメディア コーデックにアクセスします。MediaCodec
をインスタンス化するには、createEncoderByType()
を呼び出してメディアをエンコードするか、createDecoderByType()
を呼び出してメディアをデコードします。これらのメソッドはそれぞれ、エンコードまたはデコードするメディアの種類の 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)は、リモート側から受信した信号の影響をキャプチャされた音声信号から除去します。AutomaticGainControl
を使用した自動ゲイン コントロール(AGC)は、キャプチャされたシグナルの出力を自動的に正規化します。NoiseSuppressor
を使用したノイズ抑制(NS)は、キャプチャされたシグナルからバックグラウンド ノイズを除去します。
これらのプリプロセッサ エフェクトは、AudioEffect
サブクラスのいずれかを使用して、AudioRecord
でキャプチャした音声に適用できます。
注: すべてのデバイスがこれらのエフェクトをサポートしているわけではありません。そのため、対応状況を最初に確認するには、対応するオーディオ エフェクト クラスで isAvailable()
を呼び出す必要があります。
ギャップレス再生
2 つの個別の MediaPlayer
オブジェクト間でギャップレス再生を実行できるようになりました。最初の MediaPlayer
が完了する前にいつでも setNextMediaPlayer()
を呼び出すと、Android は最初のプレーヤーが停止した瞬間に 2 番目のプレーヤーを開始しようとします。
カメラ
オート フォーカスの移動
新しいインターフェース Camera.AutoFocusMoveCallback
を使用すると、オートフォーカスの動きの変化をリッスンできます。インターフェースは setAutoFocusMoveCallback()
で登録できます。カメラが連続オートフォーカス モード(FOCUS_MODE_CONTINUOUS_VIDEO
または FOCUS_MODE_CONTINUOUS_PICTURE
)になると、onAutoFocusMoving()
への呼び出しが届き、オートフォーカスが動き始めたか、動きを停止したかが通知されます。
カメラの音
MediaActionSound
クラスは、カメラやその他のメディア操作によって生成される標準的なサウンドを生成するためのシンプルな API セットを提供します。カスタムの静止画カメラまたは動画カメラを作成する場合は、これらの API を使用して適切な音声を再生する必要があります。
音声を再生するには、MediaActionSound
オブジェクトをインスタンス化し、load()
を呼び出して目的の音声をプリロードし、適切なタイミングで play()
を呼び出します。
接続
Android ビーム
Android Beam™ で、Bluetooth 経由の大規模なペイロード転送がサポートされるようになりました。新しい setBeamPushUris()
メソッドまたは新しいコールバック インターフェース NfcAdapter.CreateBeamUrisCallback
で転送するデータを定義すると、Android は転送速度を速めるために、Bluetooth または別の代替トランスポートにデータ転送をハンドオフします。これは、画像ファイルや音声ファイルなどの大容量ペイロードに特に便利で、デバイス間のペア設定は必要ありません。Bluetooth 経由の転送を利用するために、アプリで追加の作業は必要ありません。
setBeamPushUris()
メソッドは、アプリから転送するデータを指定する Uri
オブジェクトの配列を受け取ります。または、NfcAdapter.CreateBeamUrisCallback
インターフェースを実装することもできます。このインターフェースは、setBeamPushUrisCallback()
を呼び出してアクティビティに指定できます。
コールバック インターフェースを使用する場合、ユーザーが 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 サービス ディスカバリ
Android 4.1 では Wi-Fi P2P API が拡張され、WifiP2pManager
で関連付け前サービス ディスカバリがサポートされるようになりました。これにより、接続する前に Wi-Fi P2P を使用するサービスごとに付近のデバイスを検出してフィルタリングできます。また、ネットワーク サービス ディスカバリを使用すると、既存の接続済みネットワーク(ローカル Wi-Fi ネットワークなど)上でサービスを検出できます。
他のデバイスがアプリを検出して接続できるように、Wi-Fi 経由でアプリをサービスとしてブロードキャストするには、アプリサービスを記述する WifiP2pServiceInfo
オブジェクトを指定して addLocalService()
を呼び出します。
Wi-Fi 経由で近くのデバイスの検出を開始するには、まず Bonjour と Upnp のどちらを使用して通信するかを決める必要があります。Bonjour を使用するには、まず setDnsSdResponseListeners()
を使用してコールバック リスナーを設定します。これは WifiP2pManager.DnsSdServiceResponseListener
と WifiP2pManager.DnsSdTxtRecordListener
の両方を受け取ります。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()
を使用して、HTML スタイルのテキストを ClipData
に追加できます。
Renderscript
Renderscript の計算機能が拡張され、次の機能が導入されました。
- 1 つのスクリプト内の複数カーネルのサポート。
- 新しいスクリプト API
rsSample
で、コンピューティングからのフィルタリングされたサンプラーで割り当てからの読み取りをサポート。 #pragma
でさまざまなレベルの FP 精度をサポート。- コンピューティング スクリプトから RS オブジェクトの追加情報をクエリするサポート。
- パフォーマンスが大幅に改善されました。
新しいプラグマを使用して、Compute Renderscript で必要な浮動小数点精度を定義することもできます。これにより、完全な IEEE 754-2008 標準では不可能な、高速ベクトル数学演算などの NEON のような演算を CPU パス上で実行できます。
注: 試験運用版の Renderscript グラフィック エンジンは非推奨になりました。
アニメーション
アクティビティ起動アニメーション
ズーム アニメーションまたは独自のカスタム アニメーションを使用して Activity
を起動できるようになりました。目的のアニメーションを指定するには、ActivityOptions
API を使用して Bundle
を作成します。この Bundle
は、アクティビティを開始するメソッド(startActivity()
など)に渡すことができます。
ActivityOptions
クラスには、アクティビティの起動時に表示するアニメーションの種類ごとに異なるメソッドが用意されています。
makeScaleUpAnimation()
- 画面上の指定した開始位置と指定した開始サイズからアクティビティ ウィンドウを拡大するアニメーションを作成します。たとえば、Android 4.1 のホーム画面では、アプリを開くときにこの機能が使用されます。
makeThumbnailScaleUpAnimation()
- 指定された位置と指定されたサムネイル画像からアクティビティ ウィンドウを拡大するアニメーションを作成します。たとえば、Android 4.1 の [最近使ったアプリ] ウィンドウがアプリに戻るときに、これを使用します。
makeCustomAnimation()
- 独自のリソースで定義されたアニメーションを作成します。1 つはアクティビティの起動アニメーション、もう 1 つはアクティビティの停止アニメーションを定義します。
時刻アニメーター
新しい TimeAnimator
は、アニメーションのフレームごとに通知する TimeAnimator.TimeListener
を使用して、シンプルなコールバック メカニズムを提供します。この Animator には、時間、補間、オブジェクト値の設定はありません。リスナーのコールバックは、合計経過時間や、前のアニメーション フレームからの経過時間など、各フレームに関する情報を受け取ります。
ユーザー インターフェース
通知
Android 4.1 では、より大きなコンテンツ領域、大きな画像プレビュー、複数のアクション ボタン、設定可能な優先度を持つ通知を作成できます。
通知スタイル
新しいメソッド setStyle()
を使用すると、より広いコンテンツ領域を提供する 3 つの新しいスタイルのうち 1 つを通知に指定できます。大規模なコンテンツ領域のスタイルを指定するには、setStyle()
に次のいずれかのオブジェクトを渡します。
Notification.BigPictureStyle
- サイズの大きな画像が添付された通知の場合。
Notification.BigTextStyle
- 1 通のメールなど、テキストが大量に含まれる通知に使用します。
Notification.InboxStyle
- 複数のメールからの抜粋など、文字列のリストを含む通知に使用します。
通知の操作
通知メッセージの下部に最大 2 つのアクション ボタンを表示できるようになりました。通知が通常のスタイルか大きいスタイルかにかかわらず、この機能は使用できます。
アクション ボタンを追加するには、addAction()
を呼び出します。このメソッドは、アイコンのドローアブル リソース、ボタンのテキスト、実行するアクションを定義する PendingIntent
の 3 つの引数を受け取ります。
優先事項
setPriority()
で優先度を設定して、リスト内の通知の順序に影響する通知の重要度をシステムにヒントとして伝えることができるようになりました。Notification
クラスの PRIORITY_*
定数で定義された 5 つの優先レベルのいずれかを渡すことができます。デフォルトは PRIORITY_DEFAULT
で、上位 2 レベルと下位 2 レベルがあります。
優先度の高い通知は、通常、ユーザーがすばやく対応する必要があるもの(新しいインスタント メッセージ、テキスト メッセージ、差し迫ったイベントのリマインダーなど)です。優先度の低い通知には、期限切れのカレンダーの予定やアプリのプロモーションなどがあります。
システム 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
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
やSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
を使用している場合は、このフラグを追加して、ビューでfitSystemWindows()
を呼び出すときに、定義された境界が利用可能な画面スペースに関して一貫性を保つようにすることをおすすめします。つまり、このフラグを設定すると、fitSystemWindows()
は、すべてのシステム UI を非表示にしても、システム UI 要素の表示設定が変更されていないかのように動作します。
他の関連するシステム UI フラグについて詳しくは、Android 4.0 で追加されたフラグをご覧ください。
リモートビュー
GridLayout
と ViewStub
はリムーバブル ビューになり、アプリ ウィジェットのレイアウトと通知のカスタム レイアウトで使用できます。
フォント ファミリー
Android 4.1 では、Roboto フォントスタイルのバリエーションがさらに追加され、合計 10 種類になりました。これらはすべてアプリで使用できます。アプリは、ライトモードとコンデンスド モードの両方の完全なバリエーションにアクセスできるようになりました。
利用可能な Roboto フォント バリエーションの完全なセットは次のとおりです。
- 標準
- 斜体
- 太字
- 太字斜体
- 光
- ライト斜体
- 太字
- コンデンス体斜体
- 太字の Condensed
- 太字斜体の縮小
これらのいずれかを適用するには、新しい fontFamily
属性と textStyle
属性を組み合わせて使用します。
fontFamily
に指定できる値は次のとおりです。
"sans-serif"
: 通常の Roboto"sans-serif-light"
(Roboto Light)"sans-serif-condensed"
(Roboto Condensed)
次に、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-pad のようなものが主流になるのです。