前回は、Android Nをざっとつかってみましたが、今回は、Android Nの変更点を全般的に解説することにしましょう。

Nには、いくつかの改良点があります。ドキュメントなどで説明されているもののうち、主要なものには、

  • 画面分割(前回解説)
  • Dozeモードの強化とバックグラウンドタスク制御の変更
  • 複数ロケールの設定と柔軟な言語リソースの選択機能
  • 電話機能の強化(ナンバーブロック、コールスクリーニング)
  • データセーバー
  • ARTの強化
  • Direct Boot
  • ナイトモード
  • 通知機能の強化
  • クイックセッティングタイルAPI

また、直接ユーザーの目には見えませんが、開発者向けの機能として、

  • ICU4J
  • OpenGL ES 3.2
  • Valkan API
  • 開発ツールのJava8対応

などがあります。これらを順に見ていくことにしましょう。画面分割については前回解説したので、まずは、Dozeモードの強化からです。

Android Mで導入されたDozeモードについては、以前(http://news.mynavi.jp/column/androidnow/105/)簡単に説明しました。

Dozeモードでは、ネットワーク関連の処理を行わないようにし、

  • ネットワークアクセスを禁止
  • ウェイクロックを受け付けない
  • 同期、バックグラウンドジョブ、アラームによるアプリ起動を禁止
  • GPSを停止
  • Wi-Fiスキャンを停止

という状態になり、アプリやシステムをスリープ状態に保ちます。しかし、定期的に「メンテナンスウィンドウ」と呼ばれる時間を設け、短い時間の間だけネットワークアクセスなどを許します。このメンテナンスウィンドウは、段々とその間隔を長くしていき、電力消費をさらに抑えていきます。実際、日常的にMarshmallowの入ったNexus5Xを使っていますが、机の上に置きっぱなしにして充電するの忘れてしまっても、意外に電池が減らないので、翌日気がついたらバッテリが切れていたなんて「事故」はほとんどなくなりました。

MarshmallowのDozeモードは、

  • バッテリ駆動状態(充電状態ではない)
  • 画面が消えている
  • 一定時間以上静止している

場合だけ動作しました。つまり、スマートフォンの画面をオフにして、持ち歩いておらず、どこかに放置している場合だけ、Dozeモードに入るようになっていました。しかし、Android Nでは、

  • バッテリ駆動
  • 画面が消えている

という条件だけで、Dozeモードに入ります。つまり持ち歩いているけど、使ってはいない状態です。

このときには、

  • ネットワークアクセスを停止
  • 同期処理を停止
  • バックグラウンドジョブを停止

となるだけで、GPSやWi-Fiスキャンは止めません(図01)。これは、これまでのアンドロイドの通常のスリープ状態とほぼ同じ使い勝手を継続するためです。

図01: Android NのDozeモード。バッテリ駆動中に画面が消えるとDozeモードに入り、消費電力を削減する。その後、静止状態になると、MarshmallowのDozeモードと同じになりさらに消費電力を削減できる。

消費電力的には、GPSはオフにしないし、Wi-Fiスキャンも止めないのでMarshmallowのDozeモードよりも増えてしまいますが、これまでのスリープや単に画面が消えている状態よりは格段に少なくなります。

なお、この動作に対しては、すでにMarshmallow用としてDoseモードやApp Standbyに対応していれば、問題がなく利用可能です。特にAndroid N用に対応を追加する必要はありません。

また、これに伴い、アプリのバックグラウンドでの動作にも変更があります。アンドロイドのアプリは、一般的には、画面を表示しているときだけ動き、それ以外のときには停止状態となり、場合によっては、メモリからも追い出されてしまいます。しかし、アプリがイベント(アンドロイドでは、システムが発生するイベントをブロードキャストといいます)を待っている場合、該当のイベントが発生すると、アプリはバックグラウンドでも動作できるようになっていました。

Android Nでは、イベントのうち、「ネットワークに接続した(CONNECTIVITY_ACTION)」、「カメラで新しい写真が撮影された(ACTION_NEW_PICTURE)」、「カメラで新しいビデオが撮影された(ACTION_NEW_VIDEO)」という3つのイベントの動作を変更しました。現在、多くのアプリがこのイベントを待つように作られています。たとえば、アプリが、Wi-Fi接続時にダウンロード、アップロードするようなものであれば、ネットワークに接続したときに「目覚め」て処理を行います。イメージ的には、Playストアのアプリアップデートやフォトアプリの写真のアップロードようなものを想像してみてください。

Android Nでは、こうしたイベントが廃止され、ネッワークの接続やメディアの追加を検出して動作するアプリ(Android N以降を対象にしたもの)は、「ジョブスケジューラー」と呼ばれる仕組みを使うことが必須になりました。ジョブスケジューラーはタクスを起動する仕組みの1つですが、Dozeモードや従量制ネットワークへのアクセスなどシステム側の制御を考慮してプログラムの実行を制御するものです。

Android N以前に作られたアプリでは、ネットワークが接続したというイベントを受け取ることはできますが、新規画像/ビデオの追加のイベントは受け取ることができなくなります。おそらく、ネットワークのイベントは、Dozeモードではメンテナンスウィンドウの期間に発行され、このときだけアプリが動作できるようになると思われます。画像、ビデオファイルの更新に関しては、アプリを手動で更新させるなどで対応が可能と思われますが、このイベントに対応している古いアプリの中には、使えなくなるものがありそうです。