- App and screen lifecycle
- Android has the Activity lifecycle (onCreate, onStart, onResume, onPause, onStop), and the process can be killed under memory pressure and later restored. iOS has active, inactive, background and suspended states, managed through scenes. In React Native, AppState tells you whether the app is in the foreground or background so you can pause polling, save drafts or refresh data on return.
- Permissions
- Camera, location, notifications and photos are requested at runtime, and users can deny permanently or grant partially, such as approximate location or a few selected photos. iOS requires purpose strings in Info.plist; Android needs manifest declarations and handling for when the user must go to Settings. Ask when the user needs the feature, not all at once on launch.
- Threading
- Both platforms have a main (UI) thread, and blocking it too long causes jank or an ANR on Android. Swift uses async/await and actors, Kotlin uses coroutines with Dispatchers. In React Native, JS runs on its own thread, while libraries like Reanimated run animations on the UI thread via worklets.
- Memory and resources
- Mid-range devices have little RAM, and large images or long lists easily get your app killed by the OS. iOS uses ARC, so watch for retain cycles; Android has a garbage collector but can still leak through long-held contexts. Resize images, clean up listeners on unmount, and monitor memory with Xcode Instruments or the Android Studio Profiler.
- Background work and notifications
- Operating systems tightly restrict background execution to save battery: iOS uses BGTaskScheduler, Android uses WorkManager. Push notifications go through APNs and FCM and need token handling, behavior when the app is open, backgrounded or killed, and deep links from a notification to the right screen.