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 生命周期

在这里插入图片描述

  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”)

在这里插入图片描述
在这里插入图片描述

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,并打印异常信息,告诉用户应该主动执行注销/解绑的操作。
发布了8 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_44947117/article/details/104031811