SoC の電源状態
システム オン チップ(SoC)の電源状態には、オン、アイドル、停止があります。「オン」は SoC が実行されているときです。「アイドル」は、SoC に電力が供給されているが、タスクを実行しない中電力モードです。「停止」は、SoC に電力が供給されていない低電力モードです。このモードでのデバイスの消費電力は、通常、「オン」モードの場合の 100 分の 1 です。
非ウェイクアップ センサー
非ウェイクアップ センサーは、SoC が停止モードに入るのを妨げず、データを報告するために SoC を復帰させないセンサーです。特に、ドライバが wake lock を保持することは許可されていません。画面がオフのときに非ウェイク アップセンサーからイベントを受信する必要がある場合、部分的な wake lock を保持するのはアプリの役割です。SoC が停止モードにある間、センサーは機能し続け、イベントを生成する必要があります。イベントはハードウェア FIFO に入れられます(詳しくは、バッチ処理をご覧ください)。FIFO のイベントは、SoC が復帰したときにアプリに配信されます。FIFO が小さすぎてすべてのイベントを格納できない場合、古いイベントは失われます。つまり、最新のデータを収容するために、最も古いデータが破棄されます。FIFO が存在しない極端な場合、SoC が停止モードになっている間に生成されたすべてのイベントが失われます。ただし、変更中の各センサーからの最新のイベントは例外です。最新のイベントは、失われないように FIFO の外部に保存する必要があります。
SoC が停止モードを終了するとすぐに、FIFO からのすべてのイベントが報告され、通常どおりオペレーションが再開されます。
非ウェイクアップ センサーを使用するアプリは、システムが停止しないように wake lock を保持するか、センサーが不要な場合はセンサーの登録を解除するか、SoC の停止モード時にイベントが失われることを予期する必要があります。
ウェイクアップ センサー
非ウェイクアップ センサーとは対照的に、ウェイクアップ センサーは、SoC の状態に関係なくデータが配信されることを保証します。SoC が起動している間、ウェイクアップ センサーは非ウェイクアップ センサーのように動作します。SoC がスリープ状態のとき、ウェイクアップ センサーはイベントを配信するために SoC を復帰させる必要があります。ウェイクアップ センサーは SoC を停止モードにする必要があるとともに、イベントの報告が必要な場合に SoC を復帰させなければなりません。つまり、最大レポート レイテンシが経過する前、またはハードウェア FIFO がいっぱいになる前に、SoC を復帰させてイベントを配信する必要があります。 詳細については、バッチ処理をご覧ください。
SoC がスリープ状態に戻る前にアプリがイベントを受信する時間を確保するには、イベントが報告されるたびにドライバが「タイムアウト wake lock」を 200 ミリ秒保持する必要があります。つまり、SoC がウェイクアップ割り込み後 200 ミリ秒以内にスリープに戻ることを許可するべきではありません。この要件は将来の Android リリースでなくなる予定ですが、それまではこのタイムアウト wake lock が必要です。
ウェイクアップ センサーと非ウェイクアップ センサーの定義方法
KitKat までは、センサーがウェイクアップ センサーであるか非ウェイクアップ センサーであるかは、センサーの種類によって決まりました。近接センサーと重要なモーション検出器を除いて、ほとんどが非ウェイクアップ センサーでした。
L 以降、特定のセンサーがウェイクアップ センサーであるかどうかは、センサー定義のフラグによって指定されます。ほとんどのセンサーは、同じセンサーのウェイクアップ バリアントと非ウェイクアップ バリアントのペアで定義できます。この場合、互いに相互作用するのではなく、2 つの独立したセンサーとして動作する必要があります。詳しくは、インタラクションをご覧ください。
センサータイプの定義で特に指定されていない限り、センサータイプにリストされているセンサータイプごとに、ウェイクアップ センサーと非ウェイクアップ センサーを 1 つずつ実装することをおすすめします。各センサータイプの定義で、SensorManager.getDefaultSensor(sensorType)
によって返されるセンサー(ウェイクアップまたは非ウェイクアップ)を確認します。ほとんどのアプリでそのセンサーが使用されます。