(On displays with smallest width >= 600dp, the below restrictions no longer apply:) orientation resizability aspect ratio https://developer.android.com/about/versions/16/behavior-changes-16#ignore- orientation 13
baseline experience for large screen devices (smallest screen width >600dp) for apps that target API level 37. Developers will not have an option to opt-out. https://android-developers.googleblog.com/2025/01/orientation-and-resizability- changes-in-android-16.html 16
(such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world. https://developer.android.com/about/versions/16/behavior-changes-16#adaptive-layouts 18
(Supports text input using external keyboard) 外部キーボードの接続・接続解除時にアプリの再起動不要 (No app relaunch required when external keyboard is connected or disconnected) 物理キーボードと仮想キーボードの自動切り替え (Automatic switching between physical and virtual keyboards) マウス・トラックパッド (Mouse, and trackpad) クリック・選択・スクロール (Click, Select, and Scroll) https://developer.android.com/docs/quality-guidelines/large-screen-app- quality#large_screen_ready 28
for all screen sizes and device configurations) マルチウインドウモードを含む (Including multi-window mode) 外部入力デバイスのサポートを拡張 (Enhanced support for external input devices) https://developer.android.com/docs/quality-guidelines/large-screen-app- quality#tier_2_better_large_screen_optimized 29
Keyboard) Tab・矢印キーによるキーボードナビゲーション対応 (Tab and arrow key navigation support) 選択、コピー&ペースト、元に戻すなどのキーボードショートカット対応 (Keyboard shortcuts for select, cut, copy, paste, undo, redo) Space キーでメディア再生・一時停止 (Spacebar plays and pauses media) Enter キーで送信機能実行 (Enter key performs send function in communication apps) https://developer.android.com/docs/quality-guidelines/large-screen-app-quality? hl=ja#large_screen_optimized 30
Differentiated Apps) Picture-in-picture Multiple instances Tabletop posture Dual display Drag and drop Draw and write within the app using a stylus https://developer.android.com/docs/quality-guidelines/large-screen-app- quality#large_screen_differentiated 33
XR compatible large screen app 大画面対応のサポートレベル:TIER 2 Large screen optimized を達成すれば、Android XR への準備も(ある程度は)OK となる (Achieving TIER 2 Large screen optimized means your app is (mostly) ready for Android XR) https://developer.android.com/docs/quality-guidelines/android-xr#android-xr-compatible 36
personally consider most important) 各 TIER の全ての要件を網羅しているわけではありません (Not covering all requirements for each TIER) 実際の認定には、公式ドキュメントで要件一覧を確認し、対応が必要です (For actual certification, check the full requirements list in Google's official documentation) 37
recreated when configuration changes occur) 結果 (Result) アプリ内部でのデータの持ち方次第で、アプリの様々な状態が失われる (Depending on how data is handled internally, various app states can be lost due to configuration changes) 59
current game state. outState?.run { putInt(STATE_SCORE, currentScore) putInt(STATE_LEVEL, currentLevel) } // Always call the superclass so it can save the view hierarchy state. super.onSaveInstanceState(outState) } companion object { val STATE_SCORE = "playerScore" val STATE_LEVEL = "playerLevel" } https://developer.android.com/guide/components/activities/activity-lifecycle 63
superclass so it can restore the view hierarchy. super.onRestoreInstanceState(savedInstanceState) // Restore state members from saved instance. savedInstanceState?.run { currentScore = getInt(STATE_SCORE) currentLevel = getInt(STATE_LEVEL) } } https://developer.android.com/guide/components/activities/activity-lifecycle 64
very simple state preservation functionality) 近年の Android アプリ開発では、 (これから紹介する)より便利な方法が提供され ているので、そちらを使う事の方が多い (Modern Android development provides more convenient methods - introduced below - that are more commonly used) 便利な方法の一部は「Activity が提供する状態保持の仕組み」で実現している (Some of these convenient methods are built on top of Activity's state preservation mechanism) 65
ID is specified) <EditText android:id="@+id/edit_text" // mandatory to save/restore state android:layout_width="match_parent" android:layout_height="wrap_content" /> https://developer.android.com/guide/fragments/saving-state#view 68
for data saved in onSaveInstanceState) ↓ サイズ超過で TransactionTooLargeException が発生 (Exceeding the size limit causes TransactionTooLargeException) https://developer.android.com/guide/components/activities/parcelables-and-bundles 71
the entire app process) SavedStateHandle, rememberSavable、AndroidX 一部ライブラリも同じ領域を使う (SavedStateHandle, rememberSavable, and some AndroidX libraries use the same storage area) アプリ側の保存サイズは 50KB 以下 が推奨 (App should keep saved data under 50KB) https://developer.android.com/guide/components/activities/parcelables-and-bundles 72
Use ViewModel, persist data with Room or DataStore) https://developer.android.com/guide/components/activities/parcelables-and-bundles https://developer.android.com/topic/libraries/architecture/saving-states 73
for all screen sizes and device configurations) マルチウインドウモードを含む (Including multi-window mode) 外部入力デバイスのサポートを拡張 (Enhanced support for external input devices) https://developer.android.com/docs/quality-guidelines/large-screen-app- quality#tier_2_better_large_screen_optimized 95
Breakpoint for Layout Switching) @Composable fun MyApp( windowSizeClass: WindowSizeClass = currentWindowAdaptiveInfo().windowSizeClass ) { // Decide whether to show the top app bar based on window size class. val showTopAppBar = windowSizeClass .isHeightAtLeastBreakpoint(WindowSizeClass.HEIGHT_DP_MEDIUM_LOWER_BOUND) // MyScreen logic is based on the showTopAppBar boolean flag. MyScreen( showTopAppBar = showTopAppBar, /* ... */ ) } https://developer.android.com/develop/ui/compose/layouts/adaptive/use-window-size- classes#manage_layouts_with_window_size_classes 98
to switch navigation UI based on window size) 小さな画面では Navigation bar (Navigation bar for small screens) 大きな画面では Navigation rail (Navigation rail for large screens) 100
other screens from Detail Pane) 例:Detail Pane 専用の NavHost を追加 (Example: Add a dedicated NavHost for Detail Pane) Navigation 3 の正式リリースを待つのも選択肢の一つ (Waiting for Navigation 3's official release is also an option) 115
only) Tab、矢印キーでフォーカス移動 (Focus navigation with Tab and arrow keys) 極力、矢印キーのみで完結するのが望ましい (Preferably complete with arrow keys only) Modifier.onClick で Enter にも反応する (Modifier.onClick responds to Enter key) 実際にキーボードだけで操作して問題点を洗い出してから改善 (Test with keyboard only to identify and fix issues) 117
Differentiated Apps) Picture-in-picture Multiple instances Tabletop posture Dual display Drag and drop Draw and write within the app using a stylus https://developer.android.com/docs/quality-guidelines/large-screen-app- quality#large_screen_differentiated 127
used for video playback) Google Map アプリなど動画再生以外での使用例あり (Also used in non-video apps like Google Maps) Android 8.0 以上でサポート (Supported on Android 8.0+) https://developer.android.com/develop/ui/views/picture-in- picture 130
don't need to hold the phone) メディア視聴や写真撮影・ビデオ通話に最適 (Ideal for media viewing, photography, and video calls) https://developer.android.com/develop/ui/compose/layouts /adaptive/foldables/make-your-app-fold-aware 138
で 画面回転・アスペクト比制限が無視される (Orientation and aspect ratio restrictions ignored for API level 36) 2026 Target SDK 37 で opt-out 不可 (No opt-out for API level 37) 今すぐ対応を始めましょう! (Start adapting now!) 143
Support - Possible with View) 全画面実行 (Full screen execution) Configuration changes 処理 (Handle configuration changes) スクロール対応と Max 幅制限 (Scrolling and max width constraints) 145
Large screen app quality and Android XR) TIER 2 達成 = Android XR compatible large screen app 大画面対応は XR 対応の第一歩 (Large screen support is the first step to XR) Android XR デバイスでも快適に動作するアプリに (Apps that work on Android XR devices) より多くのユーザーにリーチ (Reach more users) 148