Android 16 ์™„์ „ ๋ถ„์„: ์ƒˆ๋กœ์šด API, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ, ๋ฉด์ ‘ ๋Œ€๋น„ ๊ฐ€์ด๋“œ

Android 16(API 36)์˜ ํ•ต์‹ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ฌ์ธต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. Edge-to-Edge ๊ฐ•์ œ ์ ์šฉ, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ, ProgressStyle ์•Œ๋ฆผ, Predictive Back ์ œ์Šค์ฒ˜ ๋“ฑ 2026๋…„ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๋ฉด์ ‘ ํ•„์ˆ˜ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Android 16 ์ƒˆ๋กœ์šด API, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ, ๋ฉด์ ‘ ๋Œ€๋น„ ๊ฐ€์ด๋“œ

Android 16์€ 2025๋…„ ํ•˜๋ฐ˜๊ธฐ์— ์ถœ์‹œ๋˜์–ด 2026๋…„ ์•ˆ๋“œ๋กœ์ด๋“œ ์ƒํƒœ๊ณ„์˜ ํ•ต์‹ฌ ์šด์˜์ฒด์ œ๋กœ ์ž๋ฆฌ์žก์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ฒ„์ „์€ ๋Œ€ํ˜• ํ™”๋ฉด ๊ธฐ๊ธฐ ์ง€์› ๊ฐ•ํ™”, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ ๋„์ž…, ์ƒˆ๋กœ์šด ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๋“ฑ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ฐ˜๋“œ์‹œ ์ˆ™์ง€ํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ๋ณ€ํ™”๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ 2026๋…„ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๋ฉด์ ‘์—์„œ๋Š” Android 16์˜ ์ƒˆ๋กœ์šด API์™€ ์•„ํ‚คํ…์ฒ˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ถœ์ œ๋˜๊ณ  ์žˆ์–ด, ์ทจ์—…์„ ์ค€๋น„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋“ค์„ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๋ฉด์ ‘ ํ•ต์‹ฌ ํฌ์ธํŠธ

Android 16 ๋ฉด์ ‘์—์„œ๋Š” Edge-to-Edge ๊ฐ•์ œ ์ ์šฉ, ์ ์‘ํ˜• ๋ ˆ์ด์•„์›ƒ, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ API, ProgressStyle ์•Œ๋ฆผ, Predictive Back ์ œ์Šค์ฒ˜์˜ 5๊ฐ€์ง€ ์ฃผ์ œ๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ฃผ์ œ์— ๋Œ€ํ•ด ์‹ค์ œ ์ฝ”๋“œ ๊ตฌํ˜„ ๊ฒฝํ—˜๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

SDK ๋ฆด๋ฆฌ์Šค ๋ชจ๋ธ์˜ ๋ณ€ํ™”: ๋ฉ”์ด์ €/๋งˆ์ด๋„ˆ ์ „๋žต

Android 16๋ถ€ํ„ฐ Google์€ SDK ๋ฆด๋ฆฌ์Šค ๋ชจ๋ธ์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์—ฐ 1ํšŒ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ์ด์ œ๋Š” ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค์™€ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค๋Š” API ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ ๋ณ€๊ฒฝ(behavior changes)์„ ํฌํ•จํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ 2๋ถ„๊ธฐ(Q2)์— ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋Š” 4๋ถ„๊ธฐ(Q4)์— ์ถœ์‹œ๋˜์–ด ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž API์™€ ๊ธฐ๋Šฅ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์•ฑ ํ˜ธํ™˜์„ฑ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋™์ž‘ ๋ณ€๊ฒฝ์€ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ์—ฐ๊ฐ„ ํ˜ธํ™˜์„ฑ ์—…๋ฐ์ดํŠธ๋ฅผ Q2 ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค์— ๋งž์ถฐ ๊ณ„ํšํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Q4 ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์„ ํƒ์ ์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉด์ ‘์—์„œ๋Š” ์ด ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค ๋ชจ๋ธ์ด ์•ฑ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋Œ€ํ•ด ์งˆ๋ฌธ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Edge-to-Edge ๊ฐ•์ œ ์ ์šฉ

Android 16์—์„œ ๊ฐ€์žฅ ํฐ UI ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” Edge-to-Edge ๋””์Šคํ”Œ๋ ˆ์ด์˜ ๊ฐ•์ œ ์ ์šฉ์ž…๋‹ˆ๋‹ค. API 36 ์ด์ƒ์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ์•ฑ์€ ๋” ์ด์ƒ ์ด ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์‹œ์Šคํ…œ ๋ฐ”(์ƒํƒœ ๋ฐ”, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”) ์˜์—ญ๊นŒ์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MainActivity.ktkotlin
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // enableEdgeToEdge() is now the default on API 36+
        // No opt-out available
        enableEdgeToEdge()
        setContent {
            Scaffold(
                modifier = Modifier.fillMaxSize()
            ) { innerPadding ->
                // innerPadding accounts for system bars
                MainContent(
                    modifier = Modifier.padding(innerPadding)
                )
            }
        }
    }
}

์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ํ•ต์‹ฌ์€ Scaffold ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” innerPadding์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฐ” ์˜์—ญ๊ณผ ์ฝ˜ํ…์ธ ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํŒจ๋”ฉ์„ ์ ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ์ด์ „์— Window.setDecorFitsSystemWindows(true)๋‚˜ fitsSystemWindows="true"๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ์•ฑ์„ Android 16์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ๋Š” WindowInsets API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ฐ”์˜ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ•˜๋‹จ์— ๊ณ ์ •๋œ ๋ฒ„ํŠผ์ด๋‚˜ FloatingActionButton์ด ์žˆ๋Š” ํ™”๋ฉด์—์„œ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์™€์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ธ์…‹ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

์ ์‘ํ˜• ์•ฑ๊ณผ ๋Œ€ํ˜• ํ™”๋ฉด ๋ฐฉํ–ฅ ์ œํ•œ

Android 16์€ ๋Œ€ํ˜• ํ™”๋ฉด ๊ธฐ๊ธฐ์—์„œ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ๋„ˆ๋น„๊ฐ€ 600dp ์ด์ƒ์ธ ๊ธฐ๊ธฐ์—์„œ๋Š” ์•ฑ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ฐฉํ–ฅ ๋ฐ ํฌ๊ธฐ ์กฐ์ ˆ ์ œํ•œ์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํƒœ๋ธ”๋ฆฟ, ํด๋”๋ธ”, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ์—์„œ ์•ฑ์ด ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

kotlin
// Responsive layout using WindowSizeClass
@Composable
fun AdaptiveLayout() {
    val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
    when {
        windowSizeClass.windowWidthSizeClass == 
            WindowWidthSizeClass.EXPANDED -> {
            // Two-pane layout for tablets/desktop
            TwoPaneLayout()
        }
        windowSizeClass.windowWidthSizeClass == 
            WindowWidthSizeClass.MEDIUM -> {
            // Adapted layout for foldables
            MediumLayout()
        }
        else -> {
            // Phone layout
            CompactLayout()
        }
    }
}

WindowSizeClass API๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์— ๋Œ€์‘ํ•˜๋Š” ์ ์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. EXPANDED ํด๋ž˜์Šค๋Š” ํƒœ๋ธ”๋ฆฟ์ด๋‚˜ ๋ฐ์Šคํฌํ†ฑ ํ™˜๊ฒฝ์—์„œ ๋‘ ๊ฐœ์˜ ํŒจ๋„์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์— ์ ํ•ฉํ•˜๊ณ , MEDIUM ํด๋ž˜์Šค๋Š” ํด๋”๋ธ” ๊ธฐ๊ธฐ์˜ ํŽผ์นœ ์ƒํƒœ์— ์ตœ์ ํ™”๋œ ๋ ˆ์ด์•„์›ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ screenOrientation="portrait"์™€ ๊ฐ™์€ ๊ณ ์ • ๋ฐฉํ–ฅ ์„ค์ •์— ์˜์กดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“  ๋ฐฉํ–ฅ๊ณผ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ์ ์ ˆํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฐ˜์‘ํ˜• UI๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€๋งŒ, ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ๋” ๋„“์€ ๊ธฐ๊ธฐ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ API

Android 16์˜ ๊ฐ€์žฅ ํ˜์‹ ์ ์ธ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๊ณต์‹ ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ ์ง€์›์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๊ธฐ๋ฅผ ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋ฉด, ์•ฑ์€ ์ž์œ  ํ˜•์‹ ์ฐฝ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ํ‚ค๋ณด๋“œ์™€ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

LaunchOnExternalDisplay.ktkotlin
fun launchOnExternalDisplay(context: Context) {
    val displayManager = context.getSystemService(
        Context.DISPLAY_SERVICE
    ) as DisplayManager
    // Find external displays
    val externalDisplays = displayManager.displays.filter {
        it.displayId != Display.DEFAULT_DISPLAY
    }
    if (externalDisplays.isNotEmpty()) {
        val options = ActivityOptions.makeBasic().apply {
            launchDisplayId = externalDisplays.first().displayId
        }
        context.startActivity(
            Intent(context, DesktopActivity::class.java),
            options.toBundle()
        )
    }
}

DisplayManager๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ์™ธ๋ถ€ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ActivityOptions.launchDisplayId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์•ฑ, ์ƒ์‚ฐ์„ฑ ๋„๊ตฌ, ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ์—์„œ ์•ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ ค๋ฉด ์ฐฝ ํฌ๊ธฐ ๋ณ€๊ฒฝ์— ๋™์ ์œผ๋กœ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋ฉฐ, ๋งˆ์šฐ์Šค ํ˜ธ๋ฒ„ ์ƒํƒœ์™€ ์šฐํด๋ฆญ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด ๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑ ํŠน์œ ์˜ ์ธํ„ฐ๋ž™์…˜ ํŒจํ„ด๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ์Šคํฌํ†ฑ ํ™˜๊ฒฝ์—์„œ์˜ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Android ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

ProgressStyle ์•Œ๋ฆผ

Android 16์€ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ƒˆ๋กœ์šด ์•Œ๋ฆผ ์Šคํƒ€์ผ์ธ ProgressStyle์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํƒ€์ผ์€ ๋ฐฐ๋‹ฌ ์ถ”์ , ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, ์—ฌํ–‰ ๊ฒฝ๋กœ ์•ˆ๋‚ด ๋“ฑ ๋‹ค๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ค„ ๋•Œ ํŠนํžˆ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

DeliveryNotificationHelper.ktkotlin
fun buildDeliveryNotification(
    context: Context,
    orderId: String,
    progress: Float,  // 0.0 to 1.0
    currentStep: String
): Notification {
    val style = Notification.ProgressStyle()
        .setStyledByProgress(true)
        .setProgress(progress)
        .setProgressTrackerIcon(
            Icon.createWithResource(context, R.drawable.ic_delivery_truck)
        )
        .addProgressSegment(
            Notification.ProgressStyle.Segment(0.33f)
                .setColor(context, R.color.segment_preparing)
        )
        .addProgressSegment(
            Notification.ProgressStyle.Segment(0.33f)
                .setColor(context, R.color.segment_in_transit)
        )
        .addProgressSegment(
            Notification.ProgressStyle.Segment(0.34f)
                .setColor(context, R.color.segment_delivered)
        )
        .addProgressPoint(
            Notification.ProgressStyle.Point(0.0f)
                .setLabel("Order placed")
        )
        .addProgressPoint(
            Notification.ProgressStyle.Point(0.33f)
                .setLabel("Preparing")
        )
        .addProgressPoint(
            Notification.ProgressStyle.Point(0.66f)
                .setLabel("In transit")
        )
        .addProgressPoint(
            Notification.ProgressStyle.Point(1.0f)
                .setLabel("Delivered")
        )

    return Notification.Builder(context, DELIVERY_CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle("Order #$orderId")
        .setContentText(currentStep)
        .setStyle(style)
        .setOngoing(true)
        .build()
}

ProgressStyle์€ ์„ธ๊ทธ๋จผํŠธ์™€ ํฌ์ธํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์„ธ๊ทธ๋จผํŠธ์—๋Š” ๊ณ ์œ ํ•œ ์ƒ‰์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ํฌ์ธํŠธ์—๋Š” ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. setStyledByProgress(true)๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ˜„์žฌ ์ง„ํ–‰๋ฅ ์— ๋”ฐ๋ผ ์•„์ด์ฝ˜์ด ์ž๋™์œผ๋กœ ์Šคํƒ€์ผ๋ง๋ฉ๋‹ˆ๋‹ค.

์ด API๋Š” ๊ธฐ์กด์˜ ๋‹จ์ˆœํ•œ ์ง„ํ–‰๋ฅ  ๋ฐ”๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ๋” ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์•Œ๋ฆผ๋งŒ ๋ณด๊ณ ๋„ ํ˜„์žฌ ์–ด๋–ค ๋‹จ๊ณ„์— ์žˆ๋Š”์ง€, ์ „์ฒด ํ”„๋กœ์„ธ์Šค์—์„œ ์–ผ๋งˆ๋‚˜ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Predictive Back ์ œ์Šค์ฒ˜

Android 16์—์„œ๋Š” Predictive Back ์ œ์Šค์ฒ˜๊ฐ€ ๋”์šฑ ๊ฐ•ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. API 36์„ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ์•ฑ์€ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ธก์  ๋’ค๋กœ ๊ฐ€๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ด ๋™์ž‘์„ ๊ด€์ฐฐํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DetailActivity.ktkotlin
class DetailActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (Build.VERSION.SDK_INT >= 36) {
            onBackInvokedDispatcher.registerOnBackInvokedCallback(
                OnBackInvokedDispatcher
                    .PRIORITY_SYSTEM_NAVIGATION_OBSERVER
            ) {
                // Observe back navigation without intercepting
                // Log analytics or trigger save-draft logic
                analyticsTracker.logBackNavigation(
                    screen = "detail"
                )
            }
        }
    }
}

PRIORITY_SYSTEM_NAVIGATION_OBSERVER๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋’ค๋กœ ๊ฐ€๊ธฐ ๋™์ž‘์„ ๊ฐ€๋กœ์ฑ„์ง€ ์•Š์œผ๋ฉด์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ„์„ ๋กœ๊น…์ด๋‚˜ ์ž„์‹œ ์ €์žฅ ๋กœ์ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ์™„์ „ํžˆ ๊ฐ€๋กœ์ฑ„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” PRIORITY_DEFAULT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น˜์ง€ ์•Š๋„๋ก ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์— onBackPressed()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋˜ ์•ฑ์€ OnBackInvokedCallback API๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ AndroidX Activity ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ OnBackPressedDispatcher๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด API๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๋ฆผ ์ฟจ๋‹ค์šด๊ณผ ์ž๋™ ๊ทธ๋ฃนํ™”

Android 16์€ ์•ฑ์ด ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ๊ณผ๋„ํ•œ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•Œ๋ฆผ ์ฟจ๋‹ค์šด ์‹œ์Šคํ…œ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ํŠน์ • ์†๋„ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์—ฌ ์•Œ๋ฆผ์„ ๊ฒŒ์‹œํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ์ถ”๊ฐ€ ์•Œ๋ฆผ์—์„œ ํšจ๊ณผ์Œ๊ณผ ์ง„๋™์„ ์ œ๊ฑฐํ•˜๊ณ  ์•Œ๋ฆผ ์…ฐ์ด๋“œ์—๋งŒ ์กฐ์šฉํžˆ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ์ •์ฑ…์€ ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค ์•Œ๋ฆผ, ๋ฏธ๋””์–ด ์žฌ์ƒ ์•Œ๋ฆผ, ์ž๋™์ฐจ ์—ฐ๊ฒฐ ์‹œ, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉด์ œ๋ฅผ ํ—ˆ์šฉํ•œ ์•ฑ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์•ฑ์€ ์ด ์ œํ•œ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์•Œ๋ฆผ ์ „๋žต์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Android 16์€ 10๊ฐœ ์ด์ƒ์˜ ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๋Š” ์•ฑ์˜ ์•Œ๋ฆผ์„ ์ž๋™์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•Œ๋ฆผ ์…ฐ์ด๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” NotificationCompat.Builder.setGroup()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ฆผ์„ ๊ทธ๋ฃนํ™”ํ•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ์˜ ์ž๋™ ๊ทธ๋ฃนํ™”์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Health Connect FHIR ์ง€์›๊ณผ RangingManager

Android 16์€ ํ—ฌ์Šค์ผ€์–ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Health Connect๊ฐ€ ์ด์ œ FHIR(Fast Healthcare Interoperability Resources) ํ‘œ์ค€์„ ์ง€์›ํ•˜์—ฌ, ์˜๋ฃŒ ๊ธฐ๋ก์„ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋ฃŒ ์•ฑ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•œ ํ—ฌ์Šค์ผ€์–ด ์†”๋ฃจ์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒˆ๋กœ์šด RangingManager API๋Š” UWB(Ultra-Wideband) ๋ฐ ์ฑ„๋„ ์‚ฌ์šด๋”ฉ(channel sounding)์„ ํ†ตํ•œ ์ •๋ฐ€ํ•œ ๊ฑฐ๋ฆฌ ์ธก์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด API๋Š” ์‹ค๋‚ด ๋‚ด๋น„๊ฒŒ์ด์…˜, ์ž์‚ฐ ์ถ”์ , ๊ทผ์ ‘ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ผํ‹ฐ๋ฏธํ„ฐ ๋‹จ์œ„์˜ ์ •ํ™•๋„๋กœ ๊ธฐ๊ธฐ ๊ฐ„ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ธก๋ฉด์—์„œ RangingManager๋Š” ์ƒˆ๋กœ์šด RANGING ๊ถŒํ•œ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์€ ์œ„์น˜ ๊ถŒํ•œ ์™ธ์—๋„ ์ด ๋ณ„๋„์˜ ๊ถŒํ•œ์„ ์š”์ฒญํ•ด์•ผ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๋Š” ์•ฑ๋ณ„๋กœ ์ •๋ฐ€ ์œ„์น˜ ์ธก์ • ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉด์ ‘ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€

Q1: Android 16์˜ Edge-to-Edge ๊ฐ•์ œ ์ ์šฉ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , ๊ธฐ์กด ์•ฑ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

Android 16(API 36)๋ถ€ํ„ฐ Edge-to-Edge ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ๊ฐ•์ œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. enableEdgeToEdge()๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜๋ฉฐ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด์„œ๋Š” Compose์—์„œ Scaffold์˜ innerPadding์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜, View ์‹œ์Šคํ…œ์—์„œ WindowInsets API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ฐ” ์˜์—ญ์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ•˜๋‹จ ๊ณ ์ • ์š”์†Œ๋“ค์ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์™€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ์ธ์…‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Q2: WindowSizeClass๋ฅผ ์‚ฌ์šฉํ•œ ์ ์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ ๊ทธ ํ•„์š”์„ฑ์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

Android 16์—์„œ๋Š” 600dp ์ด์ƒ์˜ ํ™”๋ฉด์—์„œ ์•ฑ์˜ ๋ฐฉํ–ฅ ๋ฐ ํฌ๊ธฐ ์กฐ์ ˆ ์ œํ•œ์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WindowSizeClass API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ COMPACT, MEDIUM, EXPANDED ํด๋ž˜์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด EXPANDED์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ํŒจ๋„์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•˜๋Š” ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ๋ ˆ์ด์•„์›ƒ์„, COMPACT์—์„œ๋Š” ๋‹จ์ผ ํŒจ๋„ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํฐ, ํด๋”๋ธ”, ํƒœ๋ธ”๋ฆฟ, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ์—์„œ ์ตœ์ ํ™”๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q3: Android 16์˜ ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

DisplayManager๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ๋””์Šคํ”Œ๋ ˆ์ด ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜จ ํ›„, DEFAULT_DISPLAY๋ฅผ ์ œ์™ธํ•œ ์™ธ๋ถ€ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ActivityOptions.makeBasic()์œผ๋กœ ์˜ต์…˜์„ ์ƒ์„ฑํ•˜๊ณ  launchDisplayId์— ์™ธ๋ถ€ ๋””์Šคํ”Œ๋ ˆ์ด ID๋ฅผ ์„ค์ •ํ•œ ๋’ค, startActivity()์— ์ด ์˜ต์…˜ ๋ฒˆ๋“ค์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ์—์„œ๋Š” ์•ฑ์ด ์ž์œ  ํ˜•์‹ ์ฐฝ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ฐฝ ํฌ๊ธฐ ๋ณ€๊ฒฝ์— ๋Œ€์‘ํ•˜๊ณ  ๋งˆ์šฐ์Šค/ํ‚ค๋ณด๋“œ ์ธํ„ฐ๋ž™์…˜์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Q4: ProgressStyle ์•Œ๋ฆผ์˜ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

ProgressStyle์€ ๋‹ค๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ์•Œ๋ฆผ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. Segment๋กœ ์ง„ํ–‰๋ฅ  ๋ฐ”๋ฅผ ์ƒ‰์ƒ๋ณ„๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ , Point๋กœ ๊ฐ ๋‹จ๊ณ„์— ๋ ˆ์ด๋ธ”์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. setProgress()๋กœ ํ˜„์žฌ ์ง„ํ–‰๋ฅ ์„, setProgressTrackerIcon()์œผ๋กœ ์ถ”์  ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ๋‹ฌ ์ถ”์ , ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, ์—ฌํ–‰ ๊ฒฝ๋กœ ์•ˆ๋‚ด ๋“ฑ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. setStyledByProgress(true)๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ง„ํ–‰๋ฅ ์— ๋”ฐ๋ผ ์•„์ด์ฝ˜์ด ์ž๋™์œผ๋กœ ์Šคํƒ€์ผ๋ง๋ฉ๋‹ˆ๋‹ค.

Q5: Predictive Back ์ œ์Šค์ฒ˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ OnBackInvokedCallback API์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

Android 16์—์„œ๋Š” ์˜ˆ์ธก์  ๋’ค๋กœ ๊ฐ€๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด API 36 ํƒ€๊ฒŸ ์•ฑ์—์„œ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ onBackPressed() ์˜ค๋ฒ„๋ผ์ด๋“œ ๋Œ€์‹  OnBackInvokedCallback์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PRIORITY_SYSTEM_NAVIGATION_OBSERVER๋กœ ๋“ฑ๋กํ•˜๋ฉด ๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ๊ฐ€๋กœ์ฑ„์ง€ ์•Š๊ณ  ๊ด€์ฐฐ๋งŒ ํ•  ์ˆ˜ ์žˆ์–ด ๋ถ„์„ ๋กœ๊น…์ด๋‚˜ ์ž„์‹œ ์ €์žฅ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. PRIORITY_DEFAULT๋Š” ๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ๊ฐ€๋กœ์ฑ„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. AndroidX Activity์˜ OnBackPressedDispatcher๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

๊ฒฐ๋ก 

Android 16์€ 2026๋…„ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ณ€ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • SDK ๋ฆด๋ฆฌ์Šค ๋ชจ๋ธ ๋ณ€ํ™”: ๋ฉ”์ด์ €(Q2)์™€ ๋งˆ์ด๋„ˆ(Q4) ๋ฆด๋ฆฌ์Šค๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ ์ œ๊ณต
  • Edge-to-Edge ๊ฐ•์ œ ์ ์šฉ: API 36 ์ด์ƒ์—์„œ ํ•„์ˆ˜์ด๋ฉฐ, WindowInsets๋ฅผ ํ™œ์šฉํ•œ ์ ์ ˆํ•œ ์ธ์…‹ ์ฒ˜๋ฆฌ ํ•„์š”
  • ์ ์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ํ•„์ˆ˜ํ™”: ๋Œ€ํ˜• ํ™”๋ฉด์—์„œ ๋ฐฉํ–ฅ ์ œํ•œ์ด ๋ฌด์‹œ๋˜๋ฏ€๋กœ WindowSizeClass ๊ธฐ๋ฐ˜ ๋ฐ˜์‘ํ˜• UI ๊ตฌ์ถ• ํ•„์ˆ˜
  • ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ ์ง€์›: DisplayManager์™€ ActivityOptions๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ๋””์Šคํ”Œ๋ ˆ์ด ์•กํ‹ฐ๋น„ํ‹ฐ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ProgressStyle ์•Œ๋ฆผ: ๋‹ค๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ƒˆ๋กœ์šด ์•Œ๋ฆผ ์Šคํƒ€์ผ ๋„์ž…
  • Predictive Back ๊ฐ•ํ™”: OnBackInvokedCallback API๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•„์š”
  • ์•Œ๋ฆผ ์ฟจ๋‹ค์šด: ๊ณผ๋„ํ•œ ์•Œ๋ฆผ ๋ฐœ์†ก ์‹œ ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ํšจ๊ณผ์Œ๊ณผ ์ง„๋™ ์ œ๊ฑฐ
  • Health Connect FHIR: ์˜๋ฃŒ ๋ฐ์ดํ„ฐ์˜ ํ‘œ์ค€ํ™”๋œ ์ €์žฅ ๋ฐ ๊ณต์œ  ์ง€์›
  • RangingManager API: UWB ๊ธฐ๋ฐ˜ ์ •๋ฐ€ ๊ฑฐ๋ฆฌ ์ธก์ • ๊ธฐ๋Šฅ๊ณผ ์ƒˆ๋กœ์šด RANGING ๊ถŒํ•œ

2026๋…„ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๋ฉด์ ‘์„ ์ค€๋น„ํ•œ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ API ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Edge-to-Edge, ์ ์‘ํ˜• ๋ ˆ์ด์•„์›ƒ, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“œ๋Š” ์‹ค๋ฌด์—์„œ ์ฆ‰์‹œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ณ€ํ™”์ด๋ฏ€๋กœ ๊นŠ์ด ์žˆ๋Š” ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

ํƒœ๊ทธ

#android
#android-16
#mobile-development
#interview-questions

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

Android Dependency Injection: Hilt vs Koin comparison guide

Android ์˜์กด์„ฑ ์ฃผ์ž…: Hilt vs Koin ์™„์ „ ๊ฐ€์ด๋“œ ๋ฐ ๋ฉด์ ‘ ์งˆ๋ฌธ 2026

Hilt์™€ Koin์„ ์ฝ”๋“œ ์˜ˆ์ œ, ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ, ๋ฉด์ ‘ ์งˆ๋ฌธ์œผ๋กœ ์ฒ ์ €ํžˆ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. Hilt 2.57, Koin 4.2 ๊ธฐ๋ฐ˜ 2026๋…„ ์ตœ์‹  ๊ฐ€์ด๋“œ.

Kotlin 2.3 Android ๋ฉด์ ‘ ๊ฐ€์ด๋“œ 2026

Kotlin 2.3 Android ๋ฉด์ ‘ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋ถ„ํ•ด, KMP, ํ•ต์‹ฌ ์งˆ๋ฌธ ์ •๋ฆฌ 2026

2026๋…„ Android ๊ฐœ๋ฐœ์ž ๋ฉด์ ‘์—์„œ ์ถœ์ œ๋˜๋Š” Kotlin 2.3 ์‹ ๊ธฐ๋Šฅ์„ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋ถ„ํ•ด, Kotlin Multiplatform, ์ปจํ…์ŠคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ, Flow์™€ ์ฝ”๋ฃจํ‹ด ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Android ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Jetpack Compose ๊ณ ๊ธ‰ ์• ๋‹ˆ๋ฉ”์ด์…˜

Jetpack Compose: ๊ณ ๊ธ‰ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

Compose ๊ณ ๊ธ‰ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ „ํ™˜, AnimatedVisibility, Animatable, ์ œ์Šค์ฒ˜, ๋ถ€๋“œ๋Ÿฌ์šด Android ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ„ํ•œ ์„ฑ๋Šฅ.