application,service 和广播接收器执行顺序 #
如果你的静态广播接收器(Receiver)监听 BOOT_COMPLETED
并在其中启动 Service
,那么 Application
的 onCreate()
仍然会在广播接收器运行之前执行。
执行顺序是这样的:
- 设备启动完成 (BOOT_COMPLETED): 当 Android 设备启动完成后,系统会发送
BOOT_COMPLETED
广播。 - 应用进程启动 (如果尚未运行): 为了让你的广播接收器能够接收到这个广播,如果你的应用进程当前没有运行,Android 系统会启动你的应用进程。
- Application 对象创建和
onCreate()
调用: 在启动应用进程的过程中,系统会首先创建你的Application
类的实例(如果你自定义了Application
类)。然后,系统会调用你的Application
类的onCreate()
方法。这是在任何你的应用组件(包括广播接收器)被实际创建和运行之前发生的。 - 静态广播接收器创建和
onReceive()
调用: 一旦Application
的onCreate()
执行完毕,系统会查找并创建注册了BOOT_COMPLETED
广播的静态广播接收器实例。然后,系统会调用你的广播接收器的onReceive()
方法。 - 在
onReceive()
中启动 Service: 在你的广播接收器的onReceive()
方法中,你会编写启动你的Service
的代码(例如,使用startService()
或ContextCompat.startForegroundService()
)。 - Service 的创建和
onCreate()
调用: 当你调用启动Service
的方法时,系统会创建你的Service
类的实例,并调用其onCreate()
方法。
总结:
Application.onCreate()
-> 静态广播接收器创建 -> BroadcastReceiver.onReceive()
-> Service
创建 -> Service.onCreate()
关键点:
- 应用进程是所有组件运行的基础: 无论是启动 Activity、Service 还是接收广播,都需要先有应用进程运行起来。
Application
是进程的入口点: 在应用进程启动时,系统会首先创建并初始化Application
对象,并调用其onCreate()
方法。- 广播接收器是按需创建的: 只有在接收到其注册监听的广播时,广播接收器的实例才会被创建,并且其
onReceive()
方法才会被调用。
因此,即使你的 Service
是在 BOOT_COMPLETED
广播接收器中启动的,Application
的 onCreate()
仍然会先一步执行,为你的应用提供必要的初始化环境。这确保了当你的广播接收器和后续启动的 Service
运行时,应用级别的初始化工作已经完成。
https://www.cnblogs.com/Bolia/p/18361343
https://developer.android.com/privacy-and-security/direct-boot?hl=zh-cn