アプリをAndroid 6.0 (APIレベル23) に対応するための主なポイント
Android 6.0(Marshmallow/APIレベル23)になって、大幅な仕様変更がありました。
それに伴い既存アプリをAndroid 6.0に対応させるために抑えておきたい主なポイントを説明します。もちろん新規アプリ作成であっても知っていなければならないことです。
対応を怠ると、アプリが正しく動作しない可能性があります。
例えば、鳴らないアラームのアプリ、ネットワークにアクセス出来ないアプリなどです。
スポンサーリンク
もくじ
主要ポイントは2つ
- Request Permission(リクエストパーミッション)
- Doze / APP Standby
どちらも対応が必要になる可能性が高いものです。
それぞれについて簡単にみていきましょう。
Request Permission(リクエストパーミッション)
簡単にバージョンによる違いをまとめます。
バージョン | パーミッションの付与 | 補足 |
6.0より前 | インストール時 | インストール時にすべてのパーミッションが付与されてアプリが使用可能である。 |
6.0以降 | 特定のパーミッションは実行時にユーザーが選択する ※sdkTargetVersionが22以下ならばインストール時に付与される ※sdkTargetVersionが23以上ならば実行時 その他のパーミッションはインストール時 |
実行時にパーミッションをリクエストするにはソースコードの追加が必要。 また、一度パーミッションが許可されてもユーザーが禁止することが可能。 sdkTargetVersionが22以下であってもユーザーが禁止すればパーミッションがなくなる。 |
実行時にリクエストが必要なパーミッション一覧はこちら「Android6.0からリクエストが必要なパーミッション一覧(Dangerous Permissions)」
実行時にパーミッションをリクエストする方法はこちら「Google公式トレーニング資料「Requesting Permissions at Run Time」」
Doze / App Standby
簡単にいえば、省電力モードのことです。
AndroidのOS標準で省電力モードが追加されました。
Google公式トレーニング資料「Optimizing for Doze and App Standby」
Doze / App Standbyの制限
状態 | その状態での制限 |
Doze | ・ネットワークアクセスを禁止 ・ジョブ、同期、標準アラームを延期 |
App Standby | ・ネットワークアクセスの延期 ・PowerManagerのwake lockを無視 ・AlarmManagerの標準アラームを延期(setExact()やsetWindow()など) ・Wi-Fiスキャンを実行しない ・sync adaptersを実行しない ・JobSchedulerを実行しない |
Doze / App Standbyの状態になる条件
状態 | その状態になる条件 |
Doze | ・電源に接続されていない ・一定時間変化なし(おそらく傾きや加速度などの変化がないこと) ・画面オフ |
App Standby | ・電源に接続されていない ・ユーザーが一定期間アプリを触っていない。 ・ユーザーが明示的にそのアプリを起動しない。(おそらく明示的インテントによる起動のこと) ・フォアグラウンドのプロセスを保持しない。フォアグラウンドのプロセスとは、アプリのアクティビティがフォアグラウンドであること、またはフォアグラウンドサービスがあること。さらに別アプリのフォアグラウンドのアクティビティかフォグラウンドのサービスから使用されていること。 ・アプリが、ユーザーがロックスクリーンまたは通知トレイに見える通知を生成していない。 |
アプリをDozeに対応する(Dozeチェックリスト)
- できればdownstream messageing GCM「Simple Downstream Messaging(https://developers.google.com/cloud-messaging/downstream)」を使う。
- 永続的にネットワーク接続を必要とする場合、 可能ならばGoogle Cloud Messaging (GCM)「Using GCM to Interact with Your App While the Device is Idle」を使用すべき。
- ユーザーがすぐに通知を見なければならないなら、優先度の高いGCMメッセージ「High priority message(https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message)」を使う。
- 通常の優先度のメッセージでは、すぐに通知を処理しません。
- ネットワークアクセスが不要になるように、最初のmessage Payload(https://developers.google.com/cloud-messaging/concept-options#payload)で必要な情報を提供すること。
- 重要なアラームの場合は、setAndAllowWhileIdle() and setExactAndAllowWhileIdle()を使う。
- Dozeでもアラームが動作するようになります。
- Dozeでアプリをテストする「Testing with Doze and App Standby」
さいごに
ざーっと重要なポイントを説明しました。
Android6.0でアプリに修正が必要なことはかなり多いのではないでしょうか。
と言いつつ、ちゃんと開発し始めたのは数カ月前なので他のメジャーアップデートはよく分かりませんので、鵜呑みにしないでください。
今回の内容はGoogleの公式のドキュメントを読んで書いたものです。動作チェックはしていませんので、しっかり試してアプリを作ってくださいね。