{"id":17994353,"url":"https://github.com/anandwana001/android-interview","last_synced_at":"2025-04-05T22:09:39.526Z","repository":{"id":44988598,"uuid":"486908184","full_name":"anandwana001/android-interview","owner":"anandwana001","description":"📚 Questions for Android Engineer Interview 📚","archived":false,"fork":false,"pushed_at":"2024-05-11T02:42:29.000Z","size":442,"stargazers_count":355,"open_issues_count":3,"forks_count":79,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-29T21:08:34.281Z","etag":null,"topics":["android","android-compose","hacktoberfest","interview","interview-questions","java","kotlin","questions","system-design"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anandwana001.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-29T09:11:07.000Z","updated_at":"2025-03-28T17:41:51.000Z","dependencies_parsed_at":"2023-02-03T18:55:12.092Z","dependency_job_id":"1f59304b-f686-4a76-8d62-6f99ce03c817","html_url":"https://github.com/anandwana001/android-interview","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anandwana001%2Fandroid-interview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anandwana001%2Fandroid-interview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anandwana001%2Fandroid-interview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anandwana001%2Fandroid-interview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anandwana001","download_url":"https://codeload.github.com/anandwana001/android-interview/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247406111,"owners_count":20933806,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-compose","hacktoberfest","interview","interview-questions","java","kotlin","questions","system-design"],"created_at":"2024-10-29T20:14:59.855Z","updated_at":"2025-04-05T22:09:39.508Z","avatar_url":"https://github.com/anandwana001.png","language":null,"readme":"# Android Engineer Interview Questions\n\n![Android](https://img.shields.io/badge/Android-3DDC84?style=for-the-badge\u0026logo=android\u0026logoColor=white)\n![Kotlin](https://img.shields.io/badge/kotlin-%237F52FF.svg?style=for-the-badge\u0026logo=kotlin\u0026logoColor=white)\n\n## Let's Learn for Free! [Click Here](https://www.youtube.com/@anandwana001)\n\n\n## Book 1:1 Session here -\u003e [Click Here](https://topmate.io/anandwana001)\n\n## Complete Android Engineer Roadmap\n* [Roadmap 2024 - Topics](#android-roadmap-2024)\n* [Roadmap 2024 - Week Schedule](https://www.linkedin.com/pulse/android-engineer-interview-prep-map-akshay-nandwana-owkbf/?trackingId=CDzA28GvQN604AVSCv2itA%3D%3D)\n\n\n\n## Interview Contents\n\n* [Kotlin](#kotlin)\n* [Android](#android)\n* [Lifecycle](#lifecycle)\n* [Networking](#networking)\n* [Webview](#webview)\n* [Dependency Injection](#dependency-injection)\n* [Jetpack Compose](#jetpack-compose)\n* [Thread](#thread)\n* [Architecture](#architecture)\n* [Design Pattern](#design-pattern)\n* [System Design](#system-design)\n* [Libraries](#libraries)\n* [Common Question](#common-question)\n* [Questions from Company](#questions-from-company)\n* [Kotlin Sheet 2024](#kotlin-sheet-2024)\n* [Jetpack Compose Sheet 2024](#jetpack-compose-sheet-2024)\n\n## Kotlin\n- **What is the difference between `const val` and `val`?**\n    - Both are used to define read-only properties, but\n    - `const val` properties should be initialized at compile-time whereas `val` properties can be initialized at runtime\n    - If we decompile, `const val` variable will replace with its value but `val` not, because it can be initialized at runtime\n    -     const val BASE_URL = \"https://github.com\"\n          val githubHandle = \"anandwana001\"\n          val repoName: String\n- **What is so interesting about `data class`?**\n   - Uses to hold data\n   - Pre-functions like `toString`, `equals`, `copy`, and `componentN`\n   - Data classes cannot be abstract, open, sealed, or inner.\n   - Data classes cannot extend other classes\n   - Supports destructuring declaration\n- Is singleton thread-safe? vs Object?\n- **What are the different types of scope functions?**\n   - Let = `T.let { R }`\n        - lambda result (R) is the return type\n        - can be performed on any `T` type object\n        - lambda reference is `it`\n        - suitable for null check\n   - Run = `T.run { R }`\n        - same as `let`, but mostly used in initializing an object\n        - lambda reference is `this`\n        - suitable for null check\n   - With = `with(T) { R }`\n        - if T is nullable object use `run` else use `with(T)`\n        - lambda reference is `this`\n        - not suitable for null check\n   - Also = `T.also { T }` \n        - when need to perform multiple operations in chain use `also`\n        - lambda reference is `it`\n   - Apply = `T.apply { T }`\n        - when need to perform the operation on the `T` object and return the same use `apply`\n        - lambda reference is `this`\n        - suitable for null check\n- What are the different Coroutine Scopes?\n- How to manage series and parallel execution?\n- Difference between Flow/SharedFlow/StateFlow and elaborate it.\n- What happens if we call `.cancel()` from a coroutine scope?\n- What is an Init block in Kotlin?\n- How to choose between apply and with?\n- What is inline function in Kotlin?\n- Difference between Coroutine and Java Thread\n- Why Coroutines are light weight?\n- How does Coroutine switch context?\n- When to use Kotlin sealed classes?\n- Suspending vs Blocking in Kotlin Coroutines\n- What are Dispatchers and Name all of them\n- On which thread Dispatchers .Default execute the task or use which thread?\n- Dispatchers .Default vs Dispatcher .IO\n- What is SupervisorScope?\n- Exception Handling in Coroutine\n- Map vs FlatMap in kotlin\n- Singleton Pattern in Kotlin with object keyword\n- Collections API in Kotlin\n- What is Unidirectional Flow\n- StateFlow vs SharedFlow\n- Builder Pattern in Kotlin\n- Higher Order Functions in Kotlin\n- Covariance in Kotlin\n- Delay vs Thread.sleep? [Answer](https://www.linkedin.com/posts/anandwana001_coding-datastructures-jetpackcompose-activity-7192723727661350912-cpp-?utm_source=share\u0026utm_medium=member_desktop)\n\n\n## Android\n - How does Garbage collection works?\n - What is a dangling pointer?\n - Elaborate Memory Leak?\n - Explain fragment Lifecycle when it comes to ViewPager and sliding between different fragments.\n - Difference between FragmentStateAdapter and FragmentStatePagerAdapter.\n - Difference between Serializable and Parcelable? What are the disadvantages of Serializable?\n - How you could implement observable SharedPrefs or observable Databases i.e. Observe a certain key/table/query?\n - How does layout inflation work from xml tags to view references in memory?\n - What is a Thread, Handler, Looper, and Message Queue?\n - What are the different methods of concurrency on Android? Can you explain the difference between ExecutorService vs CachedThreadPool vs FixedThreadPool vs AsyncTasks vs HandlerThreads?\n - How does `ViewModel` instance provide to Activity and Fragment? How does `ViewModelProviderStore` decide when to retain the instance?\n - How do you inspect and solve the Jank issue? [here](https://developer.android.com/studio/profile/jank-detection)\n - How does the OutOfMemory happen? \n - How do you find memory leaks in Android applications?\n - What is Doze? What about App Standby? \n - What does `setContentView` do?\n - Process of creating a custom view\n - Deeplink understanding and architecture\n - Notifications\n - Difference between Fragment Lifecycle Observer and View Lifecycle Observer.\n - When should you use a Fragment rather than an Activity?\n - Explain the Android push notification system.\n - How LiveData is different from ObservableField?\n - What is the difference between setValue and postValue in LiveData?\n - What is process death?\n - What is ViewModelScope and How does it work internally?\n\n  \n### Lifecycle\n - How to keep a video maintain a playing state when we rotate the screen?\n - How many callbacks are in Fragments?\n - What could be the reasons why `onPause` didn't get triggered?\n - What kind of events trigger `onPause()` to run?\n - In what scenario does the \"onDestory\" get called directly after \"onCreate\"?\n - Which callback gets called on Activity when an AlertDialog is shown?\n - What's the lifecycle in PIP (Picture-in-Picture)?\n - What happens if you rotate the device?\n - Inside a viewpager (Fragment state pager adapter) what will be the lifecycle of the fragments when you swap from one tab to another?\n - Why onActivityCreated is now depreciated in Fragment?\n - Which callback should I use if I want to know when my activity came to the foreground?\n - When is onActivityResult called?\n - What does setRetainInstance do and how you can avoid it?\n - What callbacks trigger when a Dialog opens up? In both cases, the dialog is attached from the same activity/fragment and another activity/fragment.\n - What do `launchWhenCreated`, `launchWhenStarted`, and `launchWhenResumed` functions do?\n - Fragment Callbacks when moving from one fragment to another and coming back to prev one?\n - Does onCreateView get called after coming to a fragment from top fragment?\n - When does ViewModel not survive\n\n\n#### Important Lifecycle Points to Remember\n\n##### Opening a fragment from Activity\n\nCode\n```\nsupportFragmentManager.beginTransaction()\n    .replace(R.id.fragment_container, FragmentA())\n    .commit()\n```\n\nCallbacks\n| | |\n|--|--|\n| MainActivity  |  onCreate |\n| FragmentA   |    onAttach |\n| FragmentA      |    onCreate |\n| FragmentA    |      onCreateView |\n| FragmentA    |      onViewCreated |\n| FragmentA    |      CREATED == Lifecycle.State |\n| FragmentA    |      onViewStateRestored |\n| FragmentA    |      onStart |\n| FragmentA     |     STARTED == Lifecycle.State |\n| MainActivity   |    onStart |\n| MainActivity   |    onResume |\n| FragmentA   |       onResume |\n| FragmentA    |      RESUMED == Lifecycle.State |\n| MainActivity    |   onAttachedToWindow |\n\n\n#### Adding a Fragment from a Fragment\n\nCode\n```\nparentFragmentManager.beginTransaction()\n    .add(R.id.fragment_container, FragmentB())\n    .commit()\n```\n```\nparentFragmentManager.beginTransaction()\n    .add(R.id.fragment_container, FragmentB())\n    .addToBackStack(null)\n    .commit()\n```\n\nCallbacks\n| | |\n|--|--|\n| FragmentB   |    onAttach |\n| FragmentB   |    onCreate |\n| FragmentB   |    onCreateView |\n| FragmentB   |    onViewCreated |\n| FragmentB   |    CREATED == Lifecycle.State |\n| FragmentB   |    onViewStateRestored |\n| FragmentB   |    onStart |\n| FragmentB   |    STARTED == Lifecycle.State |\n| FragmentB   |    onResume |\n| FragmentB   |    RESUMED == Lifecycle.State |\n\n\n#### Replacing a Fragment from a Fragment\n\nCode\n```\nparentFragmentManager.beginTransaction()\n    .replace(R.id.fragment_container, FragmentB())\n    .addToBackStack(null)\n    .commit()\n```\n\nCallbacks\n| | |\n|--|--|\n| FragmentA  | onPause |\n| FragmentA  | onStop |\n| FragmentB  | onAttach |\n| FragmentB  | onCreate |\n| FragmentB  | onCreateView |\n| FragmentB  | onViewCreated |\n| FragmentB  | CREATED == Lifecycle.State |\n| FragmentB  | onViewStateRestored |\n| FragmentB  | onStart |\n| FragmentB  | STARTED == Lifecycle.State |\n| **FragmentA**  | **onDestroyView** |\n| FragmentB  | onResume |\n| FragmentB  | RESUMED == Lifecycle.State |\n\n\nCode\n```\nparentFragmentManager.beginTransaction()\n    .replace(R.id.fragment_container, FragmentB())\n    .commit()\n```\n\nCallbacks\n| | |\n|--|--|\n| FragmentA  | onPause |\n| FragmentA  | onStop |\n| FragmentB  | onAttach |\n| FragmentB  | onCreate |\n| FragmentB  | onCreateView |\n| FragmentB  | onViewCreated |\n| FragmentB  | CREATED == Lifecycle.State |\n| FragmentB  | onViewStateRestored |\n| FragmentB  | onStart |\n| FragmentB  | STARTED == Lifecycle.State |\n| FragmentA  | onDestroyView |\n| **FragmentA**  | **onDestroy** |\n| **FragmentA**  | **onDetach** |\n| FragmentB  | onResume |\n| FragmentB  | RESUMED == Lifecycle.State |\n\n#### Coming Back to Previous Fragment after Adding\n\nNote: If `addToBackStack` is not used, and back stack is empty, nothing will happen when calling `popBackStack()` function\n\nCode\n```\n// FragmentA\nparentFragmentManager.beginTransaction()\n    .add(R.id.fragment_container, FragmentB())\n    .addToBackStack(null)\n    .commit()\n\n// FragmentB\nparentFragmentManager.popBackStack()\n```\n\nCallbacks\n| | |\n|--|--|\n| FragmentB  | onPause  |\n| FragmentB  | onStop |\n| FragmentB  | onDestroyView |\n| FragmentB  | onDestroy |\n| FragmentB  | onDetach |\n\nFragmentA is visible. No FragmentA callbacks as FragmentA is always there, neither the view nor the lifecycle get affected.\n\n#### Coming Back to Previous Fragment after Replacing\n\n\nNote: If `addToBackStack` is not used, and back stack is empty, nothing will happen when calling `popBackStack()` function\n\nCode\n```\n// FragmentA\nparentFragmentManager.beginTransaction()\n    .replace(R.id.fragment_container, FragmentB())\n    .addToBackStack(null)\n    .commit()\n\n// FragmentB\nparentFragmentManager.popBackStack()\n```\n\nCallbacks\n| | |\n|--|--|\n| FragmentB  | onPause | \n| FragmentB  | onStop | \n| **FragmentA**  | **onCreateView** | \n| **FragmentA**  | **onViewCreated** | \n| **FragmentA**  | **CREATED** == Lifecycle.State |\n| **FragmentA**  | **onViewStateRestored** | \n| **FragmentA**  | **onStart** | \n| **FragmentA**  | **STARTED** == Lifecycle.State |\n| FragmentB  | onDestroyView | \n| FragmentB  | onDestroy | \n| FragmentB  | onDetach | \n| **FragmentA**  | **onResume** | \n| **FragmentA**  | **RESUMED** == Lifecycle.State |\n\nFragmentA view is created again. When replacing, the FragmentA view gets destroyed, `onDestroyView` gets called so when coming back it calls `onCreateView` to initialise the view again.\nThough, `onCreate` will not get called again.\n\n#### Lifecycle State\n\nThere are 5 States:\n - DESTROYED\n - INITIALIZED\n - CREATED\n - STARTED\n - RESUMED\n\n![](https://developer.android.com/static/images/guide/fragments/fragment-view-lifecycle.png)\n\n\n##### Points to Remember\n\nStates are based on Context/Scope you are using in. \nExample:\n```\nviewLifecycleOwner.lifecycleScope.launch {\n    repeatOnLifecycle(Lifecycle.State.CREATED) {\n        //...\n    }\n}\n// viewLifecycleOwner =\u003e Lifecycle of the View\n// should be used between onCreateView() and onDestroyView()\n```\n\n```\nthis.lifecycleScope.launch {\n    repeatOnLifecycle(Lifecycle.State.CREATED) {\n        //...\n    }\n}\n// this =\u003e Lifecycle of Fragment or Activity\n```\n\n| | |\n|--|--|\n| CREATED | - listen in `onDestroyView` (if not View lifecycle) and in `onStop`, `onSavedInstance` too  |\n| STARTED | - listen in `onStart`, `onPause` |\n| RESUMED | - listen in `onResume` |\n| DESTROYED | - listen in `onDestroyView` (if View lifecycle) and in `onDestroy` |\n| CREATED | - listen in `onViewStateRestored` (if View lifecycle) |\n| CREATED | - listen in `onCreate`, `onCreateView`, `onViewCreated`, `onViewStateRestored` (if not View lifecycle) |\n\n\n#### Examples\n\n- if state CREATED and app moves to background, it will listen. Hence, Avoid UI work here\n- use state CREATED if need to complete action even after Fragment View destroy\n- \n\n### Networking\n- What is the role of OkHttp and Retrofit?\n- What design pattern does Retrofit use?\n- How would optimize the handling of access token expiration? How would you handle a retry network call when the API fails? (Custom Interceptor response)\n\n\n### Webview\n- What are the problems around security when dealing with `WebView`?\n- How to interact or make connections with JavaScript?\n\n\n### Dependency Injection\n- Provides vs binds\n- Subcomponent vs. component dependency, what is the difference under the hood\n- What is a subcomponent and what is its use? How do you use qualifiers or how would you provide different instances of a class with the same data type? Constructor Injection V/s Method Injection? What is the scope? Singleton Annotation?\n- What is Circular dependency in dagger? and how to resolve it\n- What's interesting about Hilt?\n- Did you use Koin? What are your thoughts on it?\n\n\n### Jetpack Compose\n- How to launch a coroutine from a composable function? - [LaunchedEffect](https://www.droidcon.com/2021/10/28/jetpack-compose-side-effects-ii-remembercoroutinescope/)\n- How to launch a coroutine from a non-composable function, but tied to composition? - [rememberCoroutineScope()](https://www.droidcon.com/2021/10/28/jetpack-compose-side-effects-ii-remembercoroutinescope/)\n- What is recomposition? [Recomposition](https://developer.android.com/jetpack/compose/mental-model#recomposition)\n- **What is `remember` in compose?**\n  - A composable function to remember the value produced by a calculation only at the time of composition. It will not calculate again in recomposition.\n  - Recomposition will always return the value produced by composition.\n  - Whole Compose is based on the concept of `Positional Memoization`\n  - At the time of recomposition, `remember` internally calls a function called `rememberedValue()` whose work is to look into the `slotTable` and compare if the previous value and the new value have any difference, if not return, else update the value\n- Why and when to use `remember {}`?\n- Difference between `LazyColumn` and `RecyclerView`?\n- What is AndroidView in compose?\n- What is the lifecycle of composeables? [Lifecycle](https://developer.android.com/jetpack/compose/lifecycle)\n- How to avoid recomposition of any composable, if the state is not changed? [Smart Recomposition](https://developer.android.com/jetpack/compose/lifecycle#add-info-smart-recomposition)\n- What are stable types that can skip recomposition?\n- What is State?\n- What is MutableState and how does recomposition happen?\n- How to retain State across recomposition and configuration changes?\n- Difference between Stateless and Stateful composeables?\n- What are your thoughts on flat hierarchy, constraint Layout in compose vs. the older view hierarchy in xml\n- Difference b/w remember and LaunchedEffect\n- Does re-composition of `ComposeItem1` bring any effect on `ComposeItem2`? If yes, then how? \n  - `ComposeParent() { ComposeItem1 {} ComposeItem2() {...} } `\n  - What is `CompositionLocal`?\n- Custom views in compose\n- Canvas in Compose\n- What are the benefits of Jetpack Compose?\n- How does Jetpack Compose integrate with existing Android frameworks and libraries?\n- What are the best practices for performance optimization in Jetpack Compose?\n- How is navigation handled in Jetpack Compose?\n- What is Strong Skipping Mode? [Answer](https://www.linkedin.com/posts/anandwana001_coding-datastructures-jetpackcompose-activity-7193437801365823488-SlVT?utm_source=share\u0026utm_medium=member_desktop)\n\n\n## Thread\n - Different types of threads?\n - Difference between different types of thread?\n - Thread \u003c-\u003e Handler \u003c-\u003e looper\n - UI vs Background Thread\n - How do you know when some process if blocking a UI thread?\n\n## Architecture\n - What are SOLID principles?\n - What is MVVM?\n - Brief about Android Architecture.\n - MVP vs MVVM?\n - Is there any issue in the Presenter in the MVP?\n - Clean Architecture\n - MVVM vs MVI\n - What is Clean Architecture in MVVM\n - What are Provides and Binds in your Dagger library\n\n\n## Design Pattern\n -  What is SOLID principle?\n - What are different design patterns you know about?\n - What is a creational pattern?\n - What is a structural pattern?\n - What is a behavioral pattern?\n - Create Singleton Pattern without Kotlin default implementation\n - Create Observer Pattern\n - Create Adapter Pattern\n - How to make a Singleton Pattern Thread Safe?\n - What is Dependency Inversion\n - Write a real-life example of Dependency Injection without using any library\n - Explain how Android Architecture components (ViewModel, LiveData, etc.) utilize design patterns behind the scenes\n\n## System Design\n - Design Image Loading Library\n - Design Image Downloading Library\n - Design LRU Cache\n - Design a real-time Twitter feed timeline. How will you structure the backend? Will you use WebSocket or REST for this use case? Justify. \n - Design Networking Library\n - Design Checkout Screen\n - Design Error handling Structure\n - REST \u003c-\u003e Web Sockets\n - Implement caching mechanism\n - Build an offline-first app\n - Design Analytics Library\n\n\n## Libraries\n - How does Glide internally work?\n - How does retrofit work internally?\n - ViewModel internal working\n - How will you choose between Dagger 2 and Dagger-Hilt?\n\n## Common Question\n - `String` vs `StringBuilder`\n - `==` vs `.equals`?\n - `===` vs `==`?\n - Java OOP concepts\n \n\n## Questions from Company\n| Company | Questions |\n|  --- | --- |\n| Booking.com | \u003cul\u003e\u003cli\u003eImplement findViewById method\u003c/li\u003e \u003cli\u003eGiven a list of words as input, output another list of strings, each containing words that are mutual anagrams\u003c/li\u003e \u003cli\u003eIdentify whether four sides (given by four integers) can form a square, a rectangle or neither\u003c/li\u003e \u003cli\u003eOutput a delta encoding for the sequence. In a delta encoding, the first element is reproduced as-is. Each subsequent element is represented as the numeric difference from the element before it\u003c/li\u003e \u003cli\u003eThree integer arrays are given with duplicate numbers. Find the common elements among three arrays\u003c/li\u003e \u003cli\u003eTwisted question related to ConcurrentModificationException in an ArrayList\u003c/li\u003e \u003cli\u003eHow do you implement a hotel list and detail screen? Discuss what all APIs You will create and how the layout will be \u003c/li\u003e \u003cli\u003eFragments \u0026 their lifecycle, Activity lifecycle, Views, Layouts \u003c/li\u003e \u003cli\u003e Background task in Android - Asynctask, service, intent services, etc \u003c/li\u003e \u003cli\u003e Given dates and number of check-in and check-out on those dates. Find the busiest day in the hotel. [Merge Array interval type question]\u003c/li\u003e \u003cli\u003e Given an array, determine if there are repeated elements. If an element is repeated more than 3 times, return those elements. This question is basically doing a hash and checking if the hash already exists. Someone used a Map and a Set. \u003c/li\u003e \u003cli\u003e Given a list of positive words, negative words, and a review, determine if the review is flagged as positive, negative, or neutral. Someone solved it using a Set. Someone just needed to do some count (+ or -) regarding where the word appeared (positive list or negative). \u003c/li\u003e \u003c/ul\u003e| \n| Spotify | \u003cul\u003e \u003cli\u003e Design components and overall architecture for a Search feature in an Android application. [Spotify - Android Engineer II - London, UK - Sep 2022] \u003c/li\u003e \u003cli\u003e Design a Disk based Cache for the client. [Spotify System Design Android/iOS Client] `Platform independent, Key will be 32 bytes, Value can be anything but in Byte array, Cache should be persistent, Cache should max hold 100k+ Objects, Cache Max size should be configurable ( Max Size: 10 MB upto 1GB), Cache should be opaque, Cache should be Secure` \u003c/li\u003e \u003cli\u003e[Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/) \u003c/li\u003e \u003cli\u003e [Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list/) \u003c/li\u003e\u003c/ul\u003e|\n| PhonePe | \u003cul\u003e \u003cli\u003e Minimum Meetroom scheduling \u003c/li\u003e \u003cli\u003e Anagram Strings based question \u003c/li\u003e\u003c/ul\u003e |\n| Paytm | \u003cul\u003e \u003cli\u003e To check if strings are rotations of each other or not. If they are in rotation print the no. of rotations. \u003c/li\u003e \u003cli\u003e Find the string is anagram or not \u003c/li\u003e \u003cli\u003eDesign components and overall architecture for a Search feature in an Android application\u003c/li\u003e \u003cli\u003e Sort an array of 0s, 1s and 2s \u003c/li\u003e \u003cli\u003e Abstract vs Interface \u003c/li\u003e \u003cli\u003e Android Memory related \u003c/li\u003e\u003c/ul\u003e |\n| Meesho | \u003cul\u003e \u003cli\u003e SOLID principles \u003c/li\u003e \u003cli\u003e Dagger, why use dependency injection, what if we do not think it is important, like alternatives? How to create our own dependency injection library. \u003c/li\u003e \u003cli\u003e why use MVVM over MVP, think outside the box, we could have used observables using RxJava, etc. - open-ended questions around it \u003c/li\u003e \u003cli\u003e Multi-Module benefits and why use it\u003c/li\u003e \u003cli\u003e How to handle dependencies or abstraction in multi-module \u003c/li\u003e \u003cli\u003e val vs const \u003c/li\u003e \u003cli\u003e inline keyword \u003c/li\u003e \u003cli\u003e lateinit vs lazy \u003c/li\u003e \u003c/ul\u003e|\n\n\n------\n\n## Android Roadmap 2024\n| Topics | Sub-Topics |\n|  --- | --- |\n| Programming Languages | \u003cli\u003eKotlin\u003c/li\u003e\u003cli\u003eJava\u003c/li\u003e |\n| Android Architecture | ![image](https://developer.android.com/static/guide/platform/images/android-stack_2x.png) |\n| Runtime | \u003cli\u003eDalvik Virtual Machine\u003c/li\u003e\u003cli\u003eAndroid Runtime\u003c/li\u003e |\n| Android Manifest | \u003cli\u003ePackage\u003c/li\u003e\u003cli\u003eApplication Id\u003c/li\u003e |\n| Permissions | \u003cli\u003eInstall-time Permissions\u003c/li\u003e \u003cli\u003eSpecial Permissions\u003c/li\u003e \u003cli\u003eRuntime Permissions\u003c/li\u003e\u003cli\u003ePermissions Groups\u003c/li\u003e|\n| Android Build | \u003cli\u003eAPK\u003c/li\u003e\u003cli\u003eAAB\u003c/li\u003e |\n|Thread|\u003cli\u003eProcesses\u003c/li\u003e\u003cli\u003eThreads\u003c/li\u003e\u003cli\u003eInter Process Communication\u003c/li\u003e\u003cli\u003eHandlers\u003c/li\u003e\u003cli\u003eLoopers\u003c/li\u003e\u003cli\u003eMessage Queue\u003c/li\u003e\u003cli\u003eUI Thread\u003c/li\u003e\u003cli\u003eBackground Thread\u003c/li\u003e\u003cli\u003eHeap \u0026 Stack\u003c/li\u003e|\n| Fundamental Components | \u003cli\u003eActivity\u003c/li\u003e\u003cli\u003eServices\u003c/li\u003e\u003cli\u003eBroadcast Receiver\u003c/li\u003e\u003cli\u003eContent Provider\u003c/li\u003e|\n| Intent |\u003cli\u003eImplicit Intent\u003c/li\u003e\u003cli\u003eExplicit Intent\u003c/li\u003e\u003cli\u003eIntent Filters\u003c/li\u003e\u003cli\u003eIntent Flags\u003c/li\u003e|\n|Activity|\u003cli\u003eActivity Lifecycle\u003c/li\u003e\u003cli\u003eTasks and Back Stacks\u003c/li\u003e\u003cli\u003eBundles\u003c/li\u003e\u003cli\u003eParcelables\u003c/li\u003e\u003cli\u003eRecent Screens\u003c/li\u003e\u003cli\u003eApp Shortcuts\u003c/li\u003e\u003cli\u003eContext\u003c/li\u003e|\n|Services|\u003cli\u003eService Lifecycle\u003c/li\u003e\u003cli\u003eForeground Service\u003c/li\u003e\u003cli\u003eBackground Service\u003c/li\u003e\u003cli\u003eBound Service\u003c/li\u003e\u003cli\u003eAIDL\u003c/li\u003e\u003cli\u003eJob Scheduler\u003c/li\u003e\u003cli\u003eWorkManager\u003c/li\u003e\u003cli\u003eIntentService\u003c/li\u003e|\n|Broadcast Receiver|\u003cli\u003ePub-Sub\u003c/li\u003e\u003cli\u003eSystem Broadcast\u003c/li\u003e\u003cli\u003ePermissions\u003c/li\u003e\u003cli\u003eSecurity\u003c/li\u003e|\n|Content Provider|\u003cli\u003eContent Resolver\u003c/li\u003e\u003cli\u003eCursor\u003c/li\u003e\u003cli\u003eMIME Types\u003c/li\u003e\u003cli\u003eContracts\u003c/li\u003e|\n|Data Storage|\u003cli\u003eApp Specific Storage\u003c/li\u003e\u003cli\u003eShared Storage\u003c/li\u003e\u003cli\u003ePreferences\u003c/li\u003e\u003cli\u003eDatabase\u003c/li\u003e\u003cli\u003eScoped Storage\u003c/li\u003e\u003cli\u003eLRU Cache\u003c/li\u003e\u003cli\u003eSQLite\u003c/li\u003e\u003cli\u003eROOM\u003c/li\u003e\u003cli\u003eData Store\u003c/li\u003e|\n|Fragments|\u003cli\u003eFragment Lifecycle\u003c/li\u003e\u003cli\u003eDialog Fragment\u003c/li\u003e\u003cli\u003eFragment Transactions\u003c/li\u003e\u003cli\u003eFragment Manager\u003c/li\u003e\u003cli\u003eView Lifecycle\u003c/li\u003e\u003cli\u003eBackStack\u003c/li\u003e\u003cli\u003eFragment-Activity Communication\u003c/li\u003e\u003cli\u003eFragment-Fragment Communication\u003c/li\u003e|\n|Navigation Component |\u003cli\u003eHost\u003c/li\u003e\u003cli\u003eGraph\u003c/li\u003e\u003cli\u003eController\u003c/li\u003e\u003cli\u003eBack Stacks\u003c/li\u003e\u003cli\u003eDestinations\u003c/li\u003e\u003cli\u003eDeeplink\u003c/li\u003e|\n|Jetpack Components|\u003cli\u003eViewModel\u003c/li\u003e\u003cli\u003eLiveData\u003c/li\u003e\u003cli\u003ePaging\u003c/li\u003e\u003cli\u003eLifecycle\u003c/li\u003e\u003cli\u003eWorkManager\u003c/li\u003e\u003cli\u003eData Binding\u003c/li\u003e|\n|UI |\u003cli\u003eXML\u003c/li\u003e\u003cli\u003eJetpack Compose\u003c/li\u003e|\n|Jetpack Compose|\u003cli\u003eComposition\u003c/li\u003e\u003cli\u003eReComposition\u003c/li\u003e\u003cli\u003eState Hoisting\u003c/li\u003e\u003cli\u003eRemember\u003c/li\u003e\u003cli\u003eRememberSaveable\u003c/li\u003e\u003cli\u003eSide Effects\u003c/li\u003e\u003cli\u003eLaunchedEffect\u003c/li\u003e\u003cli\u003eDisposableEffect\u003c/li\u003e\u003cli\u003eDerivedStateOf\u003c/li\u003e\u003cli\u003eSnapshotFlow\u003c/li\u003e\u003cli\u003eCompositionLocal\u003c/li\u003e\u003cli\u003eTheming\u003c/li\u003e\u003cli\u003eModifier\u003c/li\u003e\u003cli\u003eLayouts\u003c/li\u003e\u003cli\u003eBox/Column/Row\u003c/li\u003e\u003cli\u003eImage/painter\u003c/li\u003e\u003cli\u003eCoil\u003c/li\u003e\u003cli\u003eLazyColumn/LayRow\u003c/li\u003e\u003cli\u003eText/Button/ other ui components\u003c/li\u003e|\n|Testing|\u003cli\u003eUI Testing\u003c/li\u003e\u003cli\u003eUnit Testing\u003c/li\u003e\u003cli\u003eEspresso\u003c/li\u003e\u003cli\u003eRobolectric\u003c/li\u003e\u003cli\u003eMockk\u003c/li\u003e|\n|Debugging|\u003cli\u003eLogcat\u003c/li\u003e\u003cli\u003eTimber\u003c/li\u003e\u003cli\u003eBreak Points\u003c/li\u003e\u003cli\u003eChucker\u003c/li\u003e\u003cli\u003eCharles\u003c/li\u003e\u003cli\u003eLeakCanary\u003c/li\u003e|\n|Libraries|\u003cli\u003eRetrofit\u003c/li\u003e\u003cli\u003eOkHttp\u003c/li\u003e\u003cli\u003eGlide\u003c/li\u003e\u003cli\u003eMaterial3\u003c/li\u003e\u003cli\u003eHilt\u003c/li\u003e\u003cli\u003eDagger\u003c/li\u003e\u003cli\u003eRetrofit\u003c/li\u003e|\n|Benchmark|\u003cli\u003eMicro Benchmark\u003c/li\u003e\u003cli\u003eMacro Benchmark\u003c/li\u003e|\n|Static Analysis|\u003cli\u003eKtlint\u003c/li\u003e\u003cli\u003eDetekt\u003c/li\u003e\u003cli\u003eAndroid Lint\u003c/li\u003e|\n|GitHub Actions|\u003cli\u003ePipeline\u003c/li\u003e\u003cli\u003eBuild Generation\u003c/li\u003e\u003cli\u003eWorkflow\u003c/li\u003e|\n|Gradle|\u003cli\u003eCommands\u003c/li\u003e\u003cli\u003eGroovy\u003c/li\u003e|\n|Common Errors|\u003cli\u003eANR\u003c/li\u003e\u003cli\u003eApp Crash\u003c/li\u003e\u003cli\u003eFatal Error\u003c/li\u003e\u003cli\u003eOOM\u003c/li\u003e\u003cli\u003eArrayOutOfBound\u003c/li\u003e|\n|Proguard|\u003cli\u003eObfuscation\u003c/li\u003e\u003cli\u003eKeep\u003c/li\u003e|\n|Code Architecture|\u003cli\u003eMVP\u003c/li\u003e\u003cli\u003eMVVM\u003c/li\u003e\u003cli\u003eMVI\u003c/li\u003e\u003cli\u003eModularization\u003c/li\u003e\u003cli\u003eDesign Patterns\u003c/li\u003e\u003cli\u003eNetwork Layer\u003c/li\u003e\u003cli\u003eData Layer\u003c/li\u003e\u003cli\u003eUI Layer\u003c/li\u003e\u003cli\u003eDomain/Repository/...\u003c/li\u003e|\n|Firebase |\u003cli\u003eCrashlytics\u003c/li\u003e\u003cli\u003eRemote Config\u003c/li\u003e\u003cli\u003eA/B Testing\u003c/li\u003e|\n|App Release|\u003cli\u003eApp Release Process\u003c/li\u003e\u003cli\u003eApp Distribution\u003c/li\u003e\u003cli\u003eGoogle Play Console\u003c/li\u003e\u003cli\u003eApp Review/Ratings\u003c/li\u003e\u003cli\u003eApp Size\u003c/li\u003e\u003cli\u003eApp Policies\u003c/li\u003e|\n\n\n------\n\n## Kotlin Sheet 2024\n![](https://github.com/anandwana001/android-interview/blob/main/Kotlin%20Sheet%202024.gif)\n\n## Jetpack Compose Sheet 2024\n![](https://github.com/anandwana001/android-interview/blob/main/Jetpack%20Compose%202024.gif)\n\n\n## Contributing Guidelines\nWhat interesting questions do you face while giving an interview for an Android Engineer role (any level)? Let's open a PR.\n\n## If this Repository helps you, Show your ❤️ by buying me a ☕ below.\u003cbr\u003e\n\u003ca href=\"https://www.buymeacoffee.com/anandwana001\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" style=\"height: 60px !important;width: 217px !important;\" \u003e\u003c/a\u003e\n\n\n## If this repository helps you in any way, show your love :heart: by putting a :star: on this project :v:\n","funding_links":["https://www.buymeacoffee.com/anandwana001"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanandwana001%2Fandroid-interview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanandwana001%2Fandroid-interview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanandwana001%2Fandroid-interview/lists"}