Android 16 プラットフォームには、アプリに影響する可能性がある動作変更が含まれています。下記の動作変更は、targetSdkVersion
に関係なく、Android 16 上で稼働するすべてのアプリに適用されます。該当する場合は、アプリをテストし、必要に応じて修正して、これらの変更に対応する必要があります。
Android 16 をターゲットとするアプリにのみ影響する動作変更のリストも必ずご確認ください。
コア機能
Android 16 には、Android システムのさまざまなコア機能を変更または拡張する次の変更が含まれています。
JobScheduler の割り当ての最適化
Android 16 以降、Google は次の要素に基づいて、通常のジョブ実行とエクスプレス ジョブ実行のランタイム割り当てを調整しています。
- アプリがどのアプリ スタンバイ バケットに属しているか: Android 16 では、アクティブなスタンバイ バケットに、十分なランタイム割り当てが適用されるようになります。
- アプリがトップ状態のときにジョブの実行が開始された場合: Android 16 では、アプリがユーザーに表示されている間に開始され、アプリが非表示になった後に続行されるジョブは、ジョブのランタイム割り当てに準拠します。
- フォアグラウンド サービスを実行中にジョブが実行されている場合: Android 16 では、フォアグラウンド サービスと同時に実行されているジョブは、ジョブのランタイム割り当てに準拠します。ユーザーが開始するデータ転送にジョブを使用している場合は、代わりにユーザーが開始するデータ転送ジョブの使用を検討してください。
この変更は、WorkManager、JobScheduler、DownloadManager を使用してスケジュール設定されたタスクに影響します。ジョブが停止した理由をデバッグするには、WorkInfo.getStopReason()
を呼び出してジョブが停止した理由をロギングすることをおすすめします(JobScheduler ジョブの場合は JobParameters.getStopReason()
を呼び出します)。
バッテリー最適化のベスト プラクティスについて詳しくは、タスク スケジューリング API のバッテリー使用量を最適化するに関するガイダンスをご覧ください。
また、Android 16 で導入された新しい JobScheduler#getPendingJobReasonsHistory
API を利用して、ジョブが実行されなかった理由を把握することをおすすめします。
テスト
アプリの動作をテストするには、アプリが Android 16 デバイスで実行されている限り、特定のジョブ割り当て最適化のオーバーライドを有効にできます。
「トップ状態はジョブのランタイム割り当てに準拠する」の適用を無効にするには、次の adb
コマンドを実行します。
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
「フォアグラウンド サービスと同時に実行されているジョブはジョブのランタイム割り当てに準拠する」の適用を無効にするには、次の adb
コマンドを実行します。
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
特定のアプリ スタンバイ バケットの動作をテストするには、次の adb
コマンドを使用してアプリのアプリ スタンバイ バケットを設定します。
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
アプリが属するアプリ スタンバイ バケットを確認するには、次の adb
コマンドを使用してアプリのアプリ スタンバイ バケットを取得します。
adb shell am get-standby-bucket APP_PACKAGE_NAME
JobInfo#setImportantWhileForeground のサポートを完全に終了
JobInfo.Builder#setImportantWhileForeground(boolean)
メソッドは、スケジュール設定アプリがフォアグラウンドにある間、またはバックグラウンドの制限を一時的に免除されている間のジョブの重要度を示します。
このメソッドは、Android 12(API レベル 31)で非推奨になりました。Android 16 以降では、このメソッドは効果的に機能しなくなり、このメソッドの呼び出しは無視されます。
この機能の削除は JobInfo#isImportantWhileForeground()
にも適用されます。Android 16 以降では、メソッドが呼び出されると、メソッドは false
を返します。
ユーザー エクスペリエンスとシステム UI
Android 16 には、より一貫性があり直感的なユーザー エクスペリエンスを実現するための以下の変更が含まれています。
ユーザー補助の妨げになる通知の非推奨
Android 16 では、announceForAccessibility
の使用や TYPE_ANNOUNCEMENT
ユーザー補助イベントのディスパッチを特徴とするユーザー補助通知が非推奨になりました。これにより、TalkBack と Android のスクリーン リーダーのユーザーに対して一貫性のないユーザー エクスペリエンスが生じる可能性があります。代替手段を使用すると、さまざまな Android 支援技術で幅広いユーザーのニーズに対応できます。
代替手段の例:
- ウィンドウの変更など、UI の大幅な変更の場合は、
Activity.setTitle(CharSequence)
とsetAccessibilityPaneTitle(java.lang.CharSequence)
を使用します。Compose でModifier.semantics { paneTitle = "paneTitle" }
を使用する - 重要な UI の変更をユーザーに通知するには、
setAccessibilityLiveRegion(int)
を使用します。Compose では、Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
を使用します。ビューが更新されるたびにお知らせが生成される可能性があるため、これらの関数は慎重に使用する必要があります。 - エラーをユーザーに通知するには、タイプ
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
のAccessibilityEvent
を送信し、AccessibilityNodeInfo#setError(CharSequence)
を設定するか、TextView#setError(CharSequence)
を使用します。
非推奨の announceForAccessibility
API のリファレンス ドキュメントには、推奨される代替方法の詳細が記載されています。