最新の記事アプリケーションアクティビティ、インテント、サービスについてデバイスAndroidでのデバイス制御について。地磁気センサ、加速度センサなどマルチメディアグラフィックス、音楽や動画再生などマルチメディア処理についてユーザインターフェースAndroidのユーザインターフェイスについて、またユーザインターフェイスを提供するコンポーネントの話題について。リソースAndroidでのアイコン、画像、文字列、ローカライゼーションなどHacksマッシュアップ開発環境Androidの開発環境など。4.4ではセンサーへのアクセスをバッチ処理することで消費電力をさらに抑えました。いうユースケースに最適です。バッチ処理が必要な理由バッチが実行されるまでの間はセンサーイベントが通知されないためCPUは低消費電力なアイドル状態/サスペンド状態を維持できます。バッチの実行間隔は任意の設定が可能です。リアルタイムなセンサー値がほしい場合はいままで通りです。センサーのバッチ処理はフィットネスや位置追跡、監視などに向いており、システムスリープ状態やスクリーンオフでも利用できる利点があります。[Sensorを利用する(TechBooster過去記事)]バッチモードを有効にするバッチモードを有効にするとバッチ実行間隔を設定できます。SensorManagerに設定用メソッドが追加されています。handler)SensorManager#registerListenerメソッドの引数は次の通りです。rateUs通知間隔の設定。maxBatchReportLatencyUsバッチ間隔(マイクロ秒)。0の場合、バッチ処理は無効registerListenerメソッドの戻り値がtrueであればバッチモードが有効です。falseであればバッチモードをサポートしていません。バッチ処理に対応していない場合はすべてのセンサーにおいて変更が即座に通知されます。バッチモードが有効であれば第4引数のmaxBatchReportLatencyマイクロ秒間隔でバッチ(まとめて)処理されてセンサーイベントが遅延発生します。第3引数のrateUsには、バッチ処理ではない通常のセンサーイベント間隔を指定できます。2.3以降ではマイクロ秒単位で通知間隔が設定できます(が、あくまでシステムへのヒントであり間隔が保障されているわけではありません)バッチ通知で受け取るセンサーイベントの特徴バッチ処理の間に起きたセンサーイベントはすべて記録され、バッチ実行時のタイミングで一斉に通知します(センサーイベントはリスナー経由で通知されますが、引数のSensorEventに含まれるタイムスタンプは時系列順が保証されています)。バッチ間隔が長いと、古いデータが捨てられることがあります。getFifoReservedEventCount()FIFOバッファにたまっているイベント数getFifoMaxEventCountメソッドではバッチ処理中に記憶できる最大のイベント数が、getFifoReservedEventCountメソッドではバッチ処理の結果、実際に受け取れるイベント数が入っています。バッチ処理ではSoCやCPUへの割り込みを減らすことができるため、CPUの消費電力を抑えるアイドル状態に入りやすくなります。条件によっては、より低消費電力なSuspend状態へも移行します。サスペンド状態に入るとアプリケーションの動作が止まってしまいますが、センサーのバッチ処理は継続できます。サスペンド状態ではCPUが停止しているので収集したセンサーイベントをハードウェアFIFOバッファに格納していきます。CPU(アプリケーションプロセッサ)が起きる前にFIFOバッファが一杯になった場合、古いイベントから失われます。(センサーイベントを欠落させたくない場合、WAKE_LOCKを利用してください。WALE_LOCK取得中はサスペンド状態に入らず、FIFOバッファが一杯になることはありません。低消費電力でのバッチ処理というメリットが得られなくなります)。バッチ処理はベストエフォートで提供されます。別のアプリケーションがバッチ処理を要求していた場合、複数のアプリケーションへのセンサー通知を連続的に実行します。バッチ処理用FIFOバッファを空にするSensorManager#flushメソッドとandroid.hardware.SensorEventListener2インターフェイスを使えばFIFOバッファを空に(Flush)できます。listener)FIFOバッファを空する。sensor)完了通知用リスナーflushメソッドを呼び出したとき、FIFOバッファにセンサーイベントが残っていた場合は通常のSensorEventListenerリスナー経由で通知されます。sensor)メソッドでセンサーごと完了が通知されます。以降は次のURL(英語)の翻訳+意図が伝わりやすいように追加編集しています。Android端末そのものの開発に携わるシステム設計者、プラットフォーム開発者に向けた詳細情報です。一般的なCPUでは、電源が入ってタスクを実行しているRun状態、電源が入っているが何もしていないIdle状態、さらに低消費電力モードであるSuspend状態があります。Suspend状態での消費電力はRun状態の1/100と言われています。5等ではバッチ処理のために内部的なハードウェアとしてFIFOバッファを搭載しています。Run状態であるならFIFOに入ったセンサー値を適切に処理できるため、センサー値の取得漏れはありません。Suspend状態ではこのFIFOがバッチ処理の役に立ちます。FIFOがいっぱいになったとしても古いイベントを上書きし、循環バッファのように振る舞えます。CPU(またはSoC)がSuspend状態から復帰した場合は、FIFO内を探して直近のセンサ値を取得、複数のセンサー情報をまとめて(バッチ処理して)通知します。Android端末を構成するFIFOバッファ部分が対応していればという条件がありますが、FIFOが一杯になったことをハードウェアで検出してCPUをSuspend状態から強制的に復帰させることができます。WAKE_UPON_FIFO_FULLモードと呼ばれるオプション機能(必須ではない)です。頻繁にSuspend状態から復帰しては低消費電力という特徴を失ってしまうため最低でも10秒分のFIFOバッファが性能要件として定められています。バッチ処理の実行要件バッチモードをサポートする場合、ハードウェアFIFOが必要です。HAL層にソフトウェア的に実装してしまうとCPUがSuspend状態にならず、電力を節約する目的に合致しません。SoCやCPUの手助けを受けずに実施する必要があります。ハードウェアFIFOの実装によりますが、いくつかのセンサーが1つのFIFOバッファを共有することも可能です。ジャイロスコープのバッチ処理間隔:最大5秒であった場合、加速度センサーの通知タイミングをジャイロスコープに合わせて5秒間隔とすることもできます(あくまでAndroid端末を開発するメーカー側の実装に依存)FIFOの割り当て優先度FIFOバッファのサイズには限りがあるため、システム設計時に各センサーごと優先度に基づいて予約領域を指定できます。優先度高:低消費電力モードでの歩行検出。歩行検出は比較的長いバッチ間隔を設定します。これは即応性が低く低消費電力であることが優先されているためです。優先度高:Idle状態での行動検出やジェスチャー認識。ターゲットとなるバッチ間隔は3秒ユーザーの行動やジェスチャーの検出は3秒程度のバッチ処理が推奨されています。優先度中:高頻度な割り込み負荷の軽減。ターゲットとなるバッチ間隔は1秒未満たとえばジャイロスコープなど高周波数センサーなどは秒間240回(240Hz)程度駆動できます。これらを10回まとめてバッチ処理(通知は1回に減るが)できれば秒間24回に割り込みを減らせます。優先度中:低頻度な割り込み負荷軽減。温度センサや気圧センサ、即座に数値が変わらないセンサーは頻繁なチェックは必要としません。バッチ処理に対応することで低消費電力な監視用途に利用できます優先度中:すべてのセンサー値の収集。ターゲットとなるバッチ間隔は1分以上FIFOバッファのサイズが十分にある場合にのみ考慮してください。Suspend状態であってもセンサデータをすべて残しておけるだけのサイズがあれば最も低消費電力です。※WAKE_UPON_FIFO_FULLを実装する場合はFIFOが一杯になったタイミングでバッチ処理が必要です。ハードウェア割り込みから復帰することになりますがその間(数msかかることがありますが)もセンサーデータを欠落しないように注意してください。以上、おつかれさまでした。Authormhidakaエンジニア。Androidと組込とRe:VIEW。techbooster主催。ひつじと呼ばれてます。2.0(β)に対応した解説書です。TechBooster.TechBoosterについて。