Android 四大组件相关
1. 切换横竖屏时 Activity 的生命周期未配置 configChangesonPause()→onSaveInstanceState()→onStop()→onDestroy()→onCreate()→onStart()→onRestoreInstanceState()→onResume()配置了android:configChangesorientation|screenSize不重建只回调onConfigurationChanged()记忆默认销毁重建配置更改可阻止。2. Activity 中onNewIntent的调用时机和使用场景时机当 Activity 已存在于任务栈中singleTop栈顶复用、singleTask/singleInstance复用实例再次启动时调用。场景通过通知栏、桌面快捷方式、URL Schema 重复启动同一个 Activity需更新数据。注意需重写并调用setIntent(intent)更新 intent。3. LaunchMode 的应用场景模式场景standard默认普通页面如详情页可重复打开singleTop通知栏点击、搜索框避免栈顶重复singleTask首页、主页面全局唯一清除其上所有页面singleInstance独立栈如系统 Launcher、来电界面4. Intent 传输数据的大小有限制吗如何解决限制通常1MB 左右不同厂商不同超过会抛TransactionTooLargeException。解决不传输大数据只传ID、key、索引全局单例、全局临时缓存容器中转改用 EventBus、接口回调、共享 ViewModel 通信本地文件 / 数据库存储跨组件传文件路径5. IntentFilter 是什么有哪些使用场景定义意图过滤器在清单文件 / 代码中注册用来匹配隐式 Intent不指定目标组件名通过 action、category、data 匹配组件。场景隐式启动 Activity如系统相册、浏览器。广播接收器监听系统广播如BOOT_COMPLETED。自定义 URL Scheme 唤起应用。6. Activity 与 Fragment 之间常见的几种通信方式方式说明构造传参Fragment 通过Bundle传递参数接口回调Activity 实现接口Fragment 在onAttach获取ViewModel共享 ViewModel作用域为 Activity事件总线EventBus / RxBusfindFragmentByIdActivity 直接调用 Fragment 公开方法setArguments/getArguments推荐方式保证重建后数据不丢失7.startService和bindService的区别、生命周期及使用场景对比startServicebindService生命周期onCreate→onStartCommand→onDestroyonCreate→onBind→onUnbind→onDestroy停止方式主动调用stopService或stopSelf所有绑定者解绑后自动停止通信无法直接交互可通过广播/AIDL通过IBinder直接调用 Service 方法场景后台长时间任务下载、播放绑定式交互音乐控制、IPC注意同时使用 start 和 bind 时需stopService 解绑才能销毁。8. Service 如何进行保活提升优先级前台 ServicestartForeground降低被杀概率。系统广播拉活监听BOOT_COMPLETED、网络变化等重启 Service。双进程守护两个 Service 互相监听A 死 B 拉活。JobScheduler / WorkManager推荐系统调度低功耗保活。白名单引导用户加入系统省电白名单、应用锁等。WorkManager 是 Android 官方为处理那些可以推迟、但必须得完成的后台任务而设计的 Jetpack 组件。WorkManager 它像一个更聪明的任务管家是官方强烈推荐的 Jetpack 组件。它会根据设备系统版本自动选用最高效的后台方案高版本用JobScheduler低版本用AlarmManager 广播-。它最核心的优势是“可靠性”即使你强制关闭 App 甚至重启设备它也能利用内部的 SQLite 数据库记住任务确保任务一定会被执行。9. BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别对比BroadcastReceiverLocalBroadcastReceiver传输范围跨进程全局仅限本应用安全性可能被其他应用拦截安全无需权限效率较低跨进程 Binder高Handler 内部转发使用场景系统广播、跨应用通信应用内组件通信注LocalBroadcastManager已废弃推荐使用 LiveData 或 Flow 替代。10. ContentProvider 是如何实现数据共享的原理标准跨进程数据共享组件底层通过 Binder 实现跨进程通信这也是它能跨进程共享数据的原因步骤内部封装数据库 / 文件 / 本地数据通过 Uri 作为唯一标识区分不同数据源content://authority/path/id系统提供权限控制限制读写权对外提供统一增删改查接口隔离底层数据实现安全访问数据11. ContentProvider、ContentResolver、ContentObserver 之间的关系ContentProvider数据提供方封装数据存储与访问。ContentResolver数据访问方通过 URI 操作 Provider。ContentObserver监听数据变化当 Provider 数据改变时回调。流程Provider 存数据 → Resolver 操作数据调用notifyChange→ Observer 监听数据变化。12. 对于 Context你了解多少继承关系Context→ContextWrapper→Application/Activity/Service。类型Application Context全局单例生命周期等于 App无界面Activity Context依附 Activity带界面、弹窗、UI 相关Service Context依附 Service无 UI作用启动组件、开启弹窗、权限校验、访问资源、获取系统服务。内存泄漏关键点避免静态持有 Activity Context全局静态使用 Application Context。区别UI 弹窗、跳转必须用 ActivityContext全局工具类、网络、缓存统一用 ApplicationContext。13. Activity 加载的流程启动startActivity→ Instrumentation → Binder → ActivityManagerService (AMS)。AMS检查进程是否存在若否则通过 Zygote fork 新进程。新进程创建 ActivityThread执行main()初始化 Looper。Application 创建ActivityThread调用attach→LoadedApk.makeApplication。Activity 实例化通过 ClassLoader 反射创建调用attach绑定 Context。生命周期回调onCreate→onStart→onResume由 AMS 通过 Binder 调用。视图加载onCreate中setContentViewonResume后开始渲染。记忆启动 → AMS 进程管理 → ActivityThread 创建 → Application → 反射 Activity → 生命周期。