android - 如果在应用程序被杀死或在后台收到新消息时发送通知的最佳方式
问题描述
所以,我有一个使用Firebase Realtime database的聊天应用程序。一切都按预期工作,问题是,每当用户杀死应用程序或将应用程序发送到后台时,收到的新消息不会向用户发送通知。我已经在 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 Cloud Messaging从您控制的后端将消息传递到您的应用程序。如有必要,当 Android 说没问题时,这些消息将唤醒应用程序。然后,您可以根据需要向用户显示通知,或使用WorkManager安排进一步的后台工作。
如果您出于某种原因绝对无法拥有后端,则必须使用 AlarmManager 或 WorkManager 安排应用程序定期唤醒。
推荐阅读
- opencv - 关于 RGB 和 CIELAB 之间转换的说明
- javascript - 这个增量重试代码是如何工作的?
- python - 舍入函数不是舍入?
- google-apps-script - 在 Google 表格中,使用脚本从图像中创建可点击的超链接
- apache-kafka - kafka 流 ktable 数据丢失
- c# - 使用 PostgreSQL 在 LINQ C# 上按列获取最后一行分组
- python - 如何在视图中使用 django 对象
- php - php中的setcookie函数和phpinfo不工作但在localhost工作
- excel - 如何使用打开的 xml 编辑 Excel 工作表并为 Excel 工作表单元格提供背景颜色?
- python - xgboost的两种界面工作方式完全一样吗?