tool. https://developer.android.com/about/versions/13/features Provides a safe, built-in ways for select media files No need to grant access permission
main thread as it may require Activity.restart() AppCompatDelegate.setApplicationLocales(appLocale) https://developer.android.com/about/versions/13/features/app-languages#androidx-impl
explicitly if the app targets Android 13 System will ask permission when first notification channel is created if the app targets Android 12 and lower On existing app The grant lasts until user launches the app if the app targets Android 13 The grant lasts until user select an option from permission prompt if the app targets Android 12 and lower
issues using internal heuristics Provides UI context to attribute data to user states and actions Reports results on every frame via a listener androidx.metrics:metrics-performance:1.0.0-alpha01 https://developer.android.com/topic/performance/jankstats
libraries Startup and jank performance improvements Profiles added to popular Jetpack libraries androidx.profileinstaller:profileinstaller:1.1.0 https://developer.android.com/jetpack/androidx/releases/navigation#2.4.0
in Kotlin starting from 2.5.0 Performance Improvements with KSP in 2.4.0 Room-Paging Support (Paging 3.0) Relational Query Methods androidx.room:room:2.4.2 https://developer.android.com/jetpack/androidx/releases/room#2.4.0
etc. // 1:1 Relation Map @Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId") fun getSongAndArtist(): Map<Song, Artist> // 1:N Relation Map @Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId") fun getArtistAndAlbums(): Map<Artist, List<Album>> https://developer.android.com/training/data-storage/room/accessing-data#multimap
needs by default Lifecycle Fragment Result ViewModelStore ActivityResultCaller SavedStateRegistry MenuProvider https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
{ val news: Flow<List<Article>> = newsRepository.getNews() ... } @AndroidEntryPoint class HomeFragement : Fragment() { // Use fragment-ktx extension to get a ViewModel private val viewModel: HomeViewModel by viewModels() } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
the parent fragment private val sharedViewModel: PagerViewModel by viewModels(ownerProducer = { requireParentFragment() }) // Or scope the fragment to an Activity private val activityViewModel: mainViewModel by activityViewModels() // Or scope the fragment to a Navigation Graph private val graphViewModel: WelcomeGraphViewModel by navGraphViewModels("welcome") } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
the parent fragment private val sharedViewModel: PagerViewModel by viewModels(ownerProducer = { requireParentFragment() }) // Or scope the fragment to an Activity private val activityViewModel: mainViewModel by activityViewModels() // Or scope the fragment to a Navigation Graph private val graphViewModel: WelcomeGraphViewModel by navGraphViewModels("welcome") } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
the parent fragment private val sharedViewModel: PagerViewModel by viewModels(ownerProducer = { requireParentFragment() }) // Or scope the fragment to an Activity private val activityViewModel: mainViewModel by activityViewModels() // Or scope the fragment to a Navigation Graph private val graphViewModel: WelcomeGraphViewModel by navGraphViewModels("welcome") } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
// Use Kotlin extension in fragment-ktx artifact setFragmentResult("requestKey", bundleof("bundleKey" to result)) } // In Fragment A setFragmentResultListener("requestKey") { _, bundle -> // Any type can be put in a bundle is supported val result = bundle.getString("bundleKey") // Do something by result } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
// Use Kotlin extension in fragment-ktx artifact setFragmentResult("requestKey", bundleof("bundleKey" to result)) } // In Fragment A setFragmentResultListener("requestKey") { _, bundle -> // Any type can be put in a bundle is supported val result = bundle.getString("bundleKey") // Do something by result } https://io.google/2022/program/c9085b18-4e8e-4183-b303-1d1716b0c070/intl/ko/
out of the Android Camera stack. 1. Built on top of Camera2 performance; CameraX is faster to use for development. 2. CameraX lab for daily testing; To reach consistency on devices 3. As a Jetpack library has faster launches, to address ad-hoc or planned needs and more. https://io.google/2022/program/f4726bbd-d230-4574-abc6-211baa6aec35/intl/ko/
screen. Preview 01 To access the output buffer seamlessly for use with algorithms such as the ones in ML Kit. Image Analysis 02 Used to save high-quality images. Image Capture 03 CameraX 1.0.0 Use Cases https://io.google/2022/program/f4726bbd-d230-4574-abc6-211baa6aec35/intl/ko/
the system before the previous frame is displayed Previous frame was janked 02 App process running longer than expected Frames considered jank because they crossed the Deadline criterion 03