面试题一: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 文档,有需要完整文档(面试题+答案解析)的可【以点击此处免费领取!】