一、信息
整理: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 生命周期
startService()
- onCreate:调用 startService 时候 onCreate 方法只会调用一次。
- onStartCommand:onStartCommand 方法将会被调用多次(与 startService 的次数一致)。
- onDestroy:服务停止(调用 stopService 或者 stopSelf 方法停止)。
- 总结
context.startService() -> onCreate() ->onStartCommand() -> Service running–> (如果调用context.stopService() ))-> onDestroy() -> Service shut down
bindService()
- onCreate:调用 bindService 时候 onCreate 方法只会调用一次。
- onBind:服务绑定。
- onUnbind:服务被解绑时调用
- onDestroy:服务停止。
- 总结
context.bindService() -> onCreate() -> onBind() ->Service running-> onUnbind() -> onDestroy() -> Service stop
2、Service 的两种启动方式,区别在哪
- startService()
- onCreate()只会被调用一次。
- 多次调用 startSercie 会多次执行 onStartCommand()和 onStart()方法。
- 外部没有调用 stopService()或 stopSelf()方法,service 会一直运行。
- bindService()
- 第一次创建,系统回调顺序为 onCreate() -> onBind()。
- 已经绑定,多次调用 bindService()方法不会多次创建服务及绑定。
- 解除绑定,可以调用 unbindService()方法,回调顺序为 onUnbind() -> onDestroy()。
- 与调用者共死。
3、Service 和 Activity 进行数据交互
- binder + 接口回调
- binder + Handler
- 广播
- EventBus
- 全局共享静态变量
TODO:待完善
4、Service 能开启耗时操作吗
Service 默认运行在主线程中,不要做耗时操作,否则会发生 ANR,默认时间是 20 s,除非开启子线程来执行操作。
5、Android 常用的系统 Service
使用 getSystemService(“name”)
7、如何防止 Service 被杀死
- 在 onDestroy 方法里面重启 Service,或者发个广播出来触发启动 Service。
- onStartCommand 中的 flag 设置成 START_STICKY,或者直接 return START_STICKY。
- 将 APK 安装到/system/app,变身为系统级应用。
- 提升 Service 的优先级, 在 AndroidManifest.xm l文件中对于 intent-filter 可以通过 android:priority = "1000"这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时适用于广播。
- 把进程做拆分,分成 app 进程和 push 进程(push 进程不做业务逻辑处理,只做转发),并且提升提升app 进程,push 进程的优先级。
- 接入第三方推送服务,推送直接会相互唤醒。
- 把 app 直接加入手机白名单。
- 在屏幕上设置一个像素。
参考阅读:
8、Service 分类
- 本地服务(Local)
- 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外 Local 服务因为是在同一进程因此不需要 IPC,也不需要 AIDL,相应 bindService 会方便很多。
- 主进程被 Kill 后,服务便会终止。
- 远程服务(Remote)
- 服务为独立的进程,对应进程名格式为所在包名加上你指定的 android:process 字符串。由于是独立的进程因此在 Activity 所在进程被 Kill 的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
- 该服务是独立的进程,会占用一定资源,并且使用 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 是什么关系
- Activity 和 Service 是 Android 四大组件之一,是 Context 类的子类 ContextWrapper 的子类。
- Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。
- Activity 和 Service 之间可以通过 Intent 传递数据,所以 Intent 看作是通信使者。
11、为什么 bindService 可以跟 Activity 生命周期联动
- bindService 方法执行时,LoadedApk 会记录 ServiceConnection 信息。
- Activity 执行 finish 方法时,会通过 LoadedApk 检查 Activity 是否存在未注销/解绑的 BroadcastReceiver 和 ServiceConnection,如果有,那么会通知 AMS 注销/解绑对应的 BroadcastReceiver 和 Service,并打印异常信息,告诉用户应该主动执行注销/解绑的操作。