Android 16 ์์ ๋ถ์: ์๋ก์ด API, ๋ฐ์คํฌํฑ ๋ชจ๋, ๋ฉด์ ๋๋น ๊ฐ์ด๋
Android 16(API 36)์ ํต์ฌ ๋ณ๊ฒฝ์ฌํญ์ ์ฌ์ธต ๋ถ์ํฉ๋๋ค. Edge-to-Edge ๊ฐ์ ์ ์ฉ, ๋ฐ์คํฌํฑ ๋ชจ๋, ProgressStyle ์๋ฆผ, Predictive Back ์ ์ค์ฒ ๋ฑ 2026๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ฉด์ ํ์ ์ฃผ์ ๋ฅผ ๋ค๋ฃน๋๋ค.

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 ์ด์์ ํ๊ฒํ ํ๋ ์ฑ์ ๋ ์ด์ ์ด ๊ธฐ๋ฅ์ ๋นํ์ฑํํ ์ ์์ผ๋ฉฐ, ์์คํ ๋ฐ(์ํ ๋ฐ, ๋ค๋น๊ฒ์ด์ ๋ฐ) ์์ญ๊น์ง ์ฝํ ์ธ ๋ฅผ ํ์ฅํด์ผ ํฉ๋๋ค.
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 ์ด์์ธ ๊ธฐ๊ธฐ์์๋ ์ฑ ๋งค๋ํ์คํธ์ ๋ฐฉํฅ ๋ฐ ํฌ๊ธฐ ์กฐ์ ์ ํ์ด ๋ฌด์๋ฉ๋๋ค. ์ด๋ ํ๋ธ๋ฆฟ, ํด๋๋ธ, ๋ฐ์คํฌํฑ ๋ชจ๋์์ ์ฑ์ด ๋ ์ ์ฐํ๊ฒ ๋์ํ๋๋ก ๊ฐ์ ํ๋ ๋ณํ์ ๋๋ค.
// 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์ ๊ฐ์ฅ ํ์ ์ ์ธ ๊ธฐ๋ฅ ์ค ํ๋๋ ๊ณต์ ๋ฐ์คํฌํฑ ๋ชจ๋ ์ง์์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์๋๋ก์ด๋ ๊ธฐ๊ธฐ๋ฅผ ์ธ๋ถ ๋ชจ๋ํฐ์ ์ฐ๊ฒฐํ๋ฉด, ์ฑ์ ์์ ํ์ ์ฐฝ์ผ๋ก ์คํ๋๋ฉฐ ํค๋ณด๋์ ๋ง์ฐ์ค ์ ๋ ฅ์ ์๋ฒฝํ๊ฒ ์ง์ํฉ๋๋ค.
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์ ๋์
ํ์ต๋๋ค. ์ด ์คํ์ผ์ ๋ฐฐ๋ฌ ์ถ์ , ํ์ผ ๋ค์ด๋ก๋, ์ฌํ ๊ฒฝ๋ก ์๋ด ๋ฑ ๋ค๋จ๊ณ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์์๊ฒ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ค ๋ ํนํ ํจ๊ณผ์ ์
๋๋ค.
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์ ํ๊ฒํ ํ๋ ์ฑ์ ์์คํ ์ ์์ธก์ ๋ค๋ก ๊ฐ๊ธฐ ์ ๋๋ฉ์ด์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋๋ฉฐ, ๊ฐ๋ฐ์๋ ์ด ๋์์ ๊ด์ฐฐํ๊ฑฐ๋ ์ปค์คํฐ๋ง์ด์ฆํ ์ ์์ต๋๋ค.
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 ์์กด์ฑ ์ฃผ์ : Hilt vs Koin ์์ ๊ฐ์ด๋ ๋ฐ ๋ฉด์ ์ง๋ฌธ 2026
Hilt์ Koin์ ์ฝ๋ ์์ , ์ฑ๋ฅ ๋ฒค์น๋งํฌ, ๋ฉด์ ์ง๋ฌธ์ผ๋ก ์ฒ ์ ํ ๋น๊ตํฉ๋๋ค. Hilt 2.57, Koin 4.2 ๊ธฐ๋ฐ 2026๋ ์ต์ ๊ฐ์ด๋.

Kotlin 2.3 Android ๋ฉด์ ์๋ฒฝ ๊ฐ์ด๋: ์ด๋ฆ ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋ถํด, KMP, ํต์ฌ ์ง๋ฌธ ์ ๋ฆฌ 2026
2026๋ Android ๊ฐ๋ฐ์ ๋ฉด์ ์์ ์ถ์ ๋๋ Kotlin 2.3 ์ ๊ธฐ๋ฅ์ ์์ธํ ๋ถ์ํฉ๋๋ค. ์ด๋ฆ ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋ถํด, Kotlin Multiplatform, ์ปจํ ์คํธ ํ๋ผ๋ฏธํฐ, Flow์ ์ฝ๋ฃจํด ์ฝ๋ ์์ ๋ฅผ ํฌํจํฉ๋๋ค.

Jetpack Compose: ๊ณ ๊ธ ์ ๋๋ฉ์ด์ ๋จ๊ณ๋ณ ๊ฐ์ด๋
Compose ๊ณ ๊ธ ์ ๋๋ฉ์ด์ ์๋ฒฝ ๊ฐ์ด๋: ์ ํ, AnimatedVisibility, Animatable, ์ ์ค์ฒ, ๋ถ๋๋ฌ์ด Android ์ธํฐํ์ด์ค๋ฅผ ์ํ ์ฑ๋ฅ.