【Android】startForeground启动流程分析

1、startForeground

本文分析了startForeground启动流程,android在8.0以上平台上怎么保证了前台服务,以及前台服务的通知怎么显示出来的进行源码解读。Android对于后台进程的应用,禁止启动后台服务,也就是startService方法禁止调用;如果想启动服务必须通过startForeground方式启动为前台服务。【Android】startForeground启动流程分析_第1张图片

id 不能为0,notification不能为null,否则会报“null notification”异常,接下来会分析到

2、跟踪到ActivityManagerService.java

【Android】startForeground启动流程分析_第2张图片

该类直接调用的 ActiveServices.java

3、ActiveServices.java

【Android】startForeground启动流程分析_第3张图片

如果notification为null,直接抛出 null notification异常,这个就是抛异常的地方

如果之前的r.foregroundId 跟现在的 id 不一致,就会直接取消通知 cancelForegroundNotificationLocked

前台的通知,需要添加flag为FLAG_FOREGROUND_SERVICE来标识是前台通知

显示通知最后调用的是 r.postNotification方法

4、cancelForegroundNotificationLocked

【Android】startForeground启动流程分析_第4张图片

会查找该APP下有么有其他service在使用该foregroundId,如果相同,那么就中断取消的流程,

在网上有人提出2个service的方式来取消通知,但是在7.0之后,该方法已经失效,这个地方就是根本原因

5、ServiceRecord.postNotification

【Android】startForeground启动流程分析_第5张图片

_foregroundNoti为用户传进来的Notification对象,但是很可能不满足 getSmallIcon条件,所以,如果为null,就会根据APP的包名,

创建一个临时Context对象,然后获取应用图标,构造一个本地的Notification对象

在构造的最后,会进一步判断localForegroundNoti.getSmallIcon是否依然为null,如果还是为null,就会报出异常,通知APP层

然后调用内部的 NotificationManagerInternal.enqueueNotifition来显示通知

最后,强制更新ServiceRecord的成员量 foregroundNoti,该变量很可能变成了新的Notification对象,前提就看外部传入foregroundNoti是否包含了SmalIcon,

如果没有包含,就会被重新实例化,如果包含了,还是之前外部传入的对象。

你可能感兴趣的:(笔记)