面试题一: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 启动流程

  1. Process A 进程采用 Binder IPC 向 system_server 进程发起 startService 请求;
  2. system_server 进程接收到请求后,向 zygote 进程发送创建进程的请求;
  3. zygote进程fork 出新的子进程 Remote Service 进程;
  4. Remote Service 进程,通过Binder IPC向sytem_server 进程发起 attachApplication 请求;
  5. system_server 进程在收到请求后,进行一系列准备工作后,再通过 binder IPC 向remote Service 进程发送 scheduleCreateService 请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送 CR EATE_SERVICE消息;
  7. 主线程在收到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 文档,有需要完整文档(面试题+答案解析)的可【以点击此处免费领取!