Irbisa · Шпаргалка
Основы Android
Activity, Fragment, жизненный цикл, Intent, Manifest, configuration changes
Какие четыре основных компонента есть у Android-приложения и почему
Applicationк ним не относится?Расскажите о жизненном цикле Activity: почему
setContentView()вызывают вonCreate()и когдаonDestroy()приходит безonPause()/onStop()?class HomeActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (!session.isLoggedIn) { startActivity(Intent(this, LoginActivity::class.java)) finish() // next callback is onDestroy: no onStart, onResume, onPause or onStop…Что происходит с Activity при повороте экрана и где хранить состояние, чтобы оно пережило поворот:
ViewModel,onSaveInstanceStateилиrememberSaveable?class SearchViewModel(private val state: SavedStateHandle) : ViewModel() { // survives rotation (ViewModel) and process death (saved state) val query: StateFlow<String> = state.getStateFlow("query", "") fun onQueryChange(q: String) { state["query"] = q }}…Какие виды
Contextдаёт Android и какой из них нельзя держать в долгоживущем объекте?Куда поместить код, который должен выполниться до появления любой Activity, и что там нельзя хранить?
@HiltAndroidAppclass ShopApp : Application() { override fun onCreate() { super.onCreate() crashReporter.install(this) // cheap, and useless if it starts late ProcessLifecycleOwner.get().lifecycle.addObserver(AppForegroundObserver)…Что входит в
AndroidManifest.xmlи как манифесты ваших библиотек попадают в итоговый манифест приложения?<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" />…За что отвечают
minSdk,targetSdkиcompileSdkи что на самом деле меняется, когда вы поднимаетеtargetSdk?// app/build.gradle.ktsandroid { compileSdk = 36 // APIs you can compile against defaultConfig { minSdk = 26 // oldest device that can install targetSdk = 36 // behaviour changes you have tested for…Вы добавили
res/values-ru/strings.xmlиres/drawable-xxhdpi/. Как Android решает, что из этого получит конкретное устройство?Что такое
Intent: явный и неявный, как система находит обработчик неявного и как получить результат обратно?// Explicit: a screen in your own appstartActivity(Intent(this, DetailActivity::class.java).putExtra("id", 42L)) // Implicit: any app that can view a web pagetry { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com")))…Что такое Fragment, как его жизненный цикл связан с Activity-хостом и зачем ему отдельный
viewLifecycleOwner?class ProfileFragment : Fragment(R.layout.fragment_profile) { private val viewModel: ProfileViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val name = view.findViewById<TextView>(R.id.name)…Этот Fragment после поворота падает с «could not find Fragment constructor». Что не так и как правильно передавать данные во Fragment?
class ProfileFragment(private val userId: String) : Fragment(R.layout.fragment_profile) { private val viewModel: ProfileViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.load(userId) }} supportFragmentManager.commit { replace(R.id.container, ProfileFragment("42"))}Как работают runtime-разрешения в Android и что такое уровни защиты normal, dangerous и signature?
class ScannerActivity : ComponentActivity() { private val cameraPermission = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { granted -> if (granted) openCamera() else showCameraUnavailable() } fun onScanClick() {…Какие события вызывают
onPause()безonStop()и что диалог, multi-window и picture-in-picture делают с жизненным циклом Activity?Почему объекты между экранами передают как
Parcelable, а неSerializable, и почему большойBundleможет упасть сTransactionTooLargeException?// build.gradle.kts: plugins { id("kotlin-parcelize") }@Parcelizedata class Address(val city: String, val street: String, val zip: String) : Parcelable startActivity( Intent(this, CheckoutActivity::class.java).putExtra(EXTRA_ADDRESS, address)…Что такое смерть процесса, как её воспроизвести и какое состояние её переживает?
# 1. Open the screen, fill in the form, press Homeadb shell am kill com.example.shop # 2. The process is gone (prints nothing)adb shell pidof com.example.shop…Как два Fragment обмениваются данными (Fragment Result API, общая ViewModel или интерфейс) и когда что выбирать?
// Picker: sends a one-shot resultclass SortPickerFragment : DialogFragment() { private fun onPicked(sort: String) { setFragmentResult("sort_request", bundleOf("sort" to sort)) dismiss() }…Чем отличаются
add()иreplace()вFragmentTransaction, что делаетaddToBackStack()и когда нуженchildFragmentManager?supportFragmentManager.commit { setReorderingAllowed(true) replace(R.id.container, OrderDetailFragment.newInstance(orderId)) addToBackStack("detail") // Back returns to the list instead of closing the app}…Что делают
commit(),commitNow()иcommitAllowingStateLoss()и почему коммит падает с «Can not perform this action after onSaveInstanceState»?// wrong: the result can arrive while the app is stoppedviewModel.result.observeForever { result -> parentFragmentManager.commit { replace(R.id.container, ResultFragment.newInstance(result)) }} // right: events are delivered only while the view is at least STARTED…Что меняют режимы запуска
standard,singleTop,singleTaskиsingleInstanceи как при стеке A-B-C-D вернуться к A?// A-B-C-D: return to the existing A, destroying B, C and DstartActivity(Intent(this, HomeActivity::class.java).addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)) class HomeActivity : ComponentActivity() {…Что такое
BroadcastReceiver, чем отличаются ресиверы из манифеста и зарегистрированные в коде и что для них изменилось в Android 8 и Android 14?class BootReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { // main thread, and the process may die right after this returns WorkManager.getInstance(context).enqueueUniqueWork( "resync", ExistingWorkPolicy.KEEP, OneTimeWorkRequestBuilder<SyncWorker>().build() )…Что такое
ContentProvider, когда он действительно нужен и какFileProviderпозволяет другому приложению открыть ваш файл?// Manifest: FileProvider with authorities=${applicationId}.fileprovider, exported=false,// grantUriPermissions=true and meta-data FILE_PROVIDER_PATHS -> @xml/file_paths val uri = FileProvider.getUriForFile( context, "${context.packageName}.fileprovider", pdfFile)…Этот код падает, когда приходит ответ. Почему и как
Looper,HandlerиMessageQueueвозвращают работу на главный поток?class ProfileActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_profile) val nameView = findViewById<TextView>(R.id.name) Thread { val user = api.loadUserBlocking() nameView.text = user.name }.start() }}Найдите баг: после ухода со сплэш-экрана приложение всё равно через две секунды открывает главный экран.
class SplashActivity : AppCompatActivity() { private val handler = Handler(Looper.getMainLooper()) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) handler.postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() }, 2_000) }}Как на самом деле выполняется ваш Kotlin-код на Android: что такое DEX, что пришло на смену Dalvik и как JIT и AOT работают вместе в ART?
Может ли одно приложение работать в нескольких процессах и как процессы общаются через Binder, AIDL и bound-сервисы?
// IOrderService.aidl: interface IOrderService { int getCount(); } class OrderService : Service() { private val binder = object : IOrderService.Stub() { // runs on a Binder pool thread, so it must be thread-safe override fun getCount() = repo.count()…