Service & Broadcast

Service 分类

  • 前台服务:前台服务必须显示通知,即使用户停止与应用交互,前台服务仍会继续运行
  • 后台服务:后台服务执行用户不会直接注意到的操作

服务和线程的区别

服务是具有生命周期的,对应可以声明前台服务,默认情况下,服务运行在应用的主线程中。而线程是任务调度的最小单位,如果服务执行的是密集型操作,则仍需要在服务内创建新线程

Service 生命周期

当我们既想绑定一个 Service(实现Activity和Service交互)又想在 Activity 停止时,Service 不会停止,我们可以先执行 startService,然后再 bindService,这样当 Activity 退出的时候,Service 的 onUnbind() 方法就会被调用,但 Service 并不会停止,然后我们可以再进入 Activity 重新绑定该 Service,这时 Service 就会调用 onRebind() 方法。但是 onRebind() 方法被调用还有个前提是先前的 onUnbind() 方法返回值为 true,但是如果使用默认的 super.onUnbind(intent) 是不行的,这时候我们要手动的使其返回 true,再次绑定时 onRebind() 就会执行了

Broadcast 分类

1、前台广播和后台广播

发送前台广播(Intent.FLAG_RECEIVER_FOREGROUND标志)

val intent = Intent(Intent.ACTION_SHUTDOWN)
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
sendBroadcast(intent)

默认发送的是后台广播

val intent = Intent(Intent.ACTION_SHUTDOWN)
sendBroadcast(intent)

在ActivityManagerService中,前台广播和后台广播各自分别有一个广播队列,互不干扰。

mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                  "foreground", BROADCAST_FG_TIMEOUT, false);
mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                  "background", BROADCAST_BG_TIMEOUT, true);
mBroadcastQueues[0] = mFgBroadcastQueue;
mBroadcastQueues[1] = mBgBroadcastQueue;
  • 前台队列相对比较空闲,处理广播会相对快一些
  • 前台队列的超时时间是 10s,而后台是 60s。后台广播的设计思想就是当前应用优先,尽可能多让收到广播的应用有充足的时间把事件做完。而前台广播的目的是紧急通知,设计上就倾向于当前应用赶快处理完,尽快传给下一个
  • 前台队列不等后台服务,而后台队列要多等后台服务一定的时间

2、有序(串行)广播和无序(并发)广播

发送广播的时候,可以指定发送的广播是并发广播还是串行广播

sendBroadcast(intent) //并发广播
sendOrderedBroadcast(intent)//串行广播

串行和并发是相对于订阅了广播的多个接收者而言的,比如A、B、C都注册了同一个广播

如果发送并发广播,则 A、B、C 会"并发”地收到消息,A、B、C 没有明确的先后顺序
如果发送串行广播,则 A、B、C 三个接收者会按照 priority 优先级排序,顺序地接收广播消息,假设优先级顺序为 A>B>C,则 A 首先接收到广播,处理完之后,B 才接收广播,然后是 C 接收广播

串行广播的特性:

  • 先接收的广播接收者可以对广播进行截断(abortBroadcast()),即后接收的广播接收者不再接收到此广播;
  • 先接收的广播接收者可以对广播进行修改,再使用setResult()函数来结果传给下一个广播接收器接收,那么后接收的广播接收者将通过getResult()函数来取得上个广播接收器接收返回的结果

只有串行广播才有有超时时间处理

  • 串行广播才有超时时间限制:前台广播 10s 处理时间,后台广播 60s 处理事件
  • 并发广播没有处理时间的限制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-sparrow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值