面试题一:service 的生命周期,两种启动形式的区别
startService
onCreate() -> onStartCommand() -> onDestroy()
bindService
onCreate() -> onbind() -> onUnbind()-> onDestroy()
两种启动形式的区别:
1. 启动
如果服务曾经开启,屡次执行 startService 不会反复的执行 onCreate()
,而是会调用 onStart()
和 onStartCommand()
。
如果服务曾经开启,屡次执行 bindService 时,onCreate 和 onBind 办法并不会被屡次调用
2. 销毁
当执行 stopService 时,间接调用 onDestroy 办法
调用者调用 unbindService 办法或者调用者 Context 不存在了(如 Activity 被 finish 了),Service 就会调用 onUnbind->onDestroy
- 应用
startService()
办法启用服务,调用者与服务之间没有关连,即便调用者退出了,服 务依然运行。 - 应用
bindService()
办法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。
独自应用 startService & stopService
- 第一次调用 startService 会执行 onCreate、onStartCommand。
- 之后再屡次调用 startService 只执行 onStartCommand,不再执行 onCreate。
- 调用 stopService 会执行 onDestroy。
独自应用 bindService & unbindService
- 第一次调用 bindService 会执行 onCreate、onBind。
- 之后再屡次调用 bindService 不会再执行 onCreate 和 onBind。
- 调用 unbindService 会执行 onUnbind、onDestroy。
面试题二:Service 启动流程
- Process A 过程采纳 Binder IPC 向 system_server 过程发动 startService 申请;
- system_server 过程接管到申请后,向 zygote 过程发送创立过程的申请;
- zygote 过程 fork 出新的子过程 Remote Service 过程;
- Remote Service 过程,通过 Binder IPC 向 sytem_server 过程发动 attachApplication 申请;
- system_server 过程在收到申请后,进行一系列筹备工作后,再通过 binder IPC 向 remote Service 过程发送 scheduleCreateService 申请;
- Remote Service 过程的 binder 线程在收到申请后,通过 handler 向主线程发送 CR
EATE_SERVICE 音讯; - 主线程在收到 Message 后,通过发射机制创立指标 Service,并回调 Service.onCreate() 办法。
到此,服务便正式启动实现。当创立的是本地服务或者服务所属过程已创立时,则无需通过上述步骤 2、3,间接创立服务即可。
bindService:
startService
更多 Android 大厂面试题
- Activity
- Service
- BroadcastReceiver
- ContentProvider
- Handler
- View 绘制
- View 事件散发
- RecycleView
- Viewpager&Fragment
- WebView
- 动画
- Bitmap
- mvc&mvp&mvvm
- Binder
- 内存透露 & 内存溢出
- 性能优化
- Window&WindowManager
- AMS
- 系统启动
- App 启动 & 打包 & 装置
- 序列化
- Art & Dalvik 及其区别
- 模块化 & 组件化
- 热修复 & 插件化
- AOP
- jectpack
- 开源框架
因为篇幅无限,这份 Android 高级开发面试题及答案解析曾经被整顿成了 PDF 文档,有须要残缺文档(面试题 + 答案解析)的可【以点击此处收费支付!】