在应用程序被终止或在后台收到新消息时发送通知的最佳方式



所以,我有一个使用Firebase实时数据库的聊天应用程序。一切都按预期工作,问题是,每当用户杀死或将应用程序发送到后台时,收到的新消息都不会向用户发送通知。我已经在StackOverflow上搜索了这个问题的解决方案,但我找不到有效的解决方案。

我的第一个想法是创建一个服务,用于检查是否收到新消息,如果是,则发送通知。这是我目前拥有的代码(未完成(:

class NotificationsService : Service(){
private lateinit var mHandler: Handler
private lateinit var mRunnable: Runnable
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
mHandler = Handler()
mRunnable = Runnable { getNewMessage()
}
mHandler.postDelayed(mRunnable, 20000)
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
mHandler.removeCallbacks(mRunnable)
}
override fun onBind(intent: Intent?): IBinder? {
throw UnsupportedOperationException("Not yet implemented")
}
private fun getNewMessage(){
// Random code just to test
val rand = Random()
val number = rand.nextInt(100)
mHandler.postDelayed(mRunnable, 20000)
}
}

我的疑问是,这是解决这个问题的最佳解决方案吗?还是在数据消耗和电源效率方面最优化的?

无法强制应用进程保持活动状态。 当用户不再使用它时,Android 会杀死它,您的数据库侦听器将停止。 保持它存活的最佳机会是建立前台服务,但即使这样也不能保证,因为如果Android需要内存,它仍然会杀死它。 你只需期望无法保持应用处于活动状态,以便允许其他应用和服务正常运行。

相反,您应该做的是使用 Firebase 云消息传递功能从您控制的后端向您的应用发送消息。 如有必要,当Android说没问题时,这些消息将唤醒应用程序。 然后,如果需要,您可以向用户显示通知,或使用 WorkManager 安排进一步的后台工作。

如果您由于某种原因绝对无法拥有后端,则必须使用AlarmManager或WorkManager安排应用程序定期唤醒。

1(您需要将Firecase云消息传递(FCM(与高优先级消息一起使用,并在用户收到新消息时触发应用程序

2(如果你真的想使用服务:我有很多需要"不可阻挡"服务的情况,所以我写了我的库。你可以在这里尝试一下:https://github.com/iardelian/Revive-S

最新更新