Android面试题(2)--Service

一、信息

整理:yoyiyi(soleil雪寂)

创建时间:2019 年7 月 04 日

修改时间:2020 年 1 月 18 日

校对:yoyiyi(soleil雪寂)

状态:更新中

字数:1307 字

仓库:Soleil-Notes

二、目录

1、Service 生命周期
2、Service 的两种启动方式,区别在哪
3、Service 和 Activity 进行数据交互
4、Service 能开启耗时操作吗
5、Android 常用的系统 Service
7、如何防止 Service 被杀死
8、Service 分类
9、怎么在 Service 中创建 Dialog 对话框
10、说说 Activity、Intent、Service 是什么关系
11、为什么 bindService 可以跟 Activity 生命周期联动

三、正文

1、Service 生命周期

Android面试题(2)--Service_第1张图片

  1. startService()

    1. onCreate:调用 startService 时候 onCreate 方法只会调用一次。
    2. onStartCommand:onStartCommand 方法将会被调用多次(与 startService 的次数一致)。
    3. onDestroy:服务停止(调用 stopService 或者 stopSelf 方法停止)。
    4. 总结

    context.startService() -> onCreate() ->onStartCommand() -> Service running–> (如果调用context.stopService() ))-> onDestroy() -> Service shut down

  2. bindService()

    1. onCreate:调用 bindService 时候 onCreate 方法只会调用一次。
    2. onBind:服务绑定。
    3. onUnbind:服务被解绑时调用
    4. onDestroy:服务停止。
    5. 总结

    context.bindService() -> onCreate() -> onBind() ->Service running-> onUnbind() -> onDestroy() -> Service stop

2、Service 的两种启动方式,区别在哪

  1. startService()
    1. onCreate()只会被调用一次。
    2. 多次调用 startSercie 会多次执行 onStartCommand()和 onStart()方法。
    3. 外部没有调用 stopService()或 stopSelf()方法,service 会一直运行。
  2. bindService()
    1. 第一次创建,系统回调顺序为 onCreate() -> onBind()。
    2. 已经绑定,多次调用 bindService()方法不会多次创建服务及绑定。
    3. 解除绑定,可以调用 unbindService()方法,回调顺序为 onUnbind() -> onDestroy()。
    4. 与调用者共死。

3、Service 和 Activity 进行数据交互

  1. binder + 接口回调
  2. binder + Handler
  3. 广播
  4. EventBus
  5. 全局共享静态变量

TODO:待完善

4、Service 能开启耗时操作吗

Service 默认运行在主线程中,不要做耗时操作,否则会发生 ANR,默认时间是 20 s,除非开启子线程来执行操作。

5、Android 常用的系统 Service

使用 getSystemService(“name”)

Android面试题(2)--Service_第2张图片
Android面试题(2)--Service_第3张图片

7、如何防止 Service 被杀死

  1. 在 onDestroy 方法里面重启 Service,或者发个广播出来触发启动 Service。
  2. onStartCommand 中的 flag 设置成 START_STICKY,或者直接 return START_STICKY。
  3. 将 APK 安装到/system/app,变身为系统级应用。
  4. 提升 Service 的优先级, 在 AndroidManifest.xm l文件中对于 intent-filter 可以通过 android:priority = "1000"这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时适用于广播。
  5. 把进程做拆分,分成 app 进程和 push 进程(push 进程不做业务逻辑处理,只做转发),并且提升提升app 进程,push 进程的优先级。
  6. 接入第三方推送服务,推送直接会相互唤醒。
  7. 把 app 直接加入手机白名单。
  8. 在屏幕上设置一个像素。

参考阅读:

Android如何降低Service被杀

8、Service 分类

  1. 本地服务(Local)
    1. 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外 Local 服务因为是在同一进程因此不需要 IPC,也不需要 AIDL,相应 bindService 会方便很多。
    2. 主进程被 Kill 后,服务便会终止。
  2. 远程服务(Remote)
    1. 服务为独立的进程,对应进程名格式为所在包名加上你指定的 android:process 字符串。由于是独立的进程因此在 Activity 所在进程被 Kill 的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
    2. 该服务是独立的进程,会占用一定资源,并且使用 AIDL 进行 IPC 稍微麻烦一点。

9、怎么在 Service 中创建 Dialog 对话框

//1. 加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINOW" />
//2. 取得Dialog 设置类型
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)

10、说说 Activity、Intent、Service 是什么关系

  1. Activity 和 Service 是 Android 四大组件之一,是 Context 类的子类 ContextWrapper 的子类。
  2. Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。
  3. Activity 和 Service 之间可以通过 Intent 传递数据,所以 Intent 看作是通信使者。

11、为什么 bindService 可以跟 Activity 生命周期联动

  1. bindService 方法执行时,LoadedApk 会记录 ServiceConnection 信息。
  2. Activity 执行 finish 方法时,会通过 LoadedApk 检查 Activity 是否存在未注销/解绑的 BroadcastReceiver 和 ServiceConnection,如果有,那么会通知 AMS 注销/解绑对应的 BroadcastReceiver 和 Service,并打印异常信息,告诉用户应该主动执行注销/解绑的操作。

你可能感兴趣的:(Android)