Android中onMessageReceived方法的技术疑问及与iOS机制对比
Android FirebaseMessagingService 相关问题解答
针对你使用纯Data消息时关于FirebaseMessagingService的onMessageReceived方法的疑问,逐一解答如下:
1. 是否必须展示通知,还是可以不做任何操作仍能正常运行?
完全不需要强制展示通知。当接收到纯Data消息时,onMessageReceived会被触发,你可以在这个方法里执行任意自定义逻辑——比如更新本地数据、触发后台任务,甚至什么都不做,只要方法能正常完成执行,就不会影响服务的正常运行,系统不会因为没弹出通知判定服务异常。
2. onMessageReceived是否像iOS那样在独立进程中运行,还是在应用(若已打开)的同一进程中运行?
FirebaseMessagingService的运行进程分两种情况:
- 若应用处于前台运行状态,
onMessageReceived会在应用的主进程中执行,和主应用同进程。 - 若应用处于后台或被杀死状态,系统可能会在一个独立的、由系统托管的进程中启动该服务处理消息,此时和主应用不在同一进程。另外,如果你在manifest里给
FirebaseMessagingService指定了android:process属性,它会一直运行在你指定的独立进程中。
3. 为何我能在Service中访问全局变量?本地测试显示,应用运行时全局变量值保持一致,应用关闭后则重置,是否有相关文档说明?何时会在同一进程中运行?
当FirebaseMessagingService和主应用同进程运行时(比如应用前台活跃时),服务和主应用共享同一个进程内存空间,所以全局变量是同一个实例,值会保持一致。而当应用被完全关闭后,进程被销毁,全局变量的内存被释放,再次启动服务时会重新初始化这些变量,值也就重置了。
这是Android组件的基础特性:同一进程内的所有组件(Activity、Service、BroadcastReceiver等)共享进程的内存空间,包括全局变量、静态变量等;只有当组件运行在不同进程时,才会拥有各自独立的内存空间,此时全局变量相互隔离。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

