首页 > 解决方案 > 如果在应用程序被杀死或在后台收到新消息时发送通知的最佳方式

问题描述

所以,我有一个使用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)
    }

}

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

标签: androidkotlinfirebase-realtime-database

解决方案


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

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

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


推荐阅读