如何在不单击的情况下将通知标题或正文保存在后台

时间:2018-02-22 14:12:31

标签: android firebase firebase-cloud-messaging

我正在开发一个应用程序,我必须使用firebase保存来自服务器的所有通知。我可以保存前景中的通知,如果通知在后台发出,我也可以保存,但如果我点击通知我可以保存它。但我主要担心的是,如果用户刷通知或清除通知,这意味着用户不会点击通知,那么我该如何保存通知。有什么方法吗?请帮我找到解决方案。

4 个答案:

答案 0 :(得分:1)

您可能有一个扩展FirebaseMessagingService的类,以便您可以在onMessageReceived函数上执行操作。您可以使用RemoteMessage函数getData()查看docs以获取消息有效内容。从那里您可以访问标题和其他信息。当然,您需要了解收到的通知的结构。因此,要回答您的问题,您只需将通知信息保存在onMessageReceived的{​​{1}}方法中即可保存通知信息。

当应用被杀时,FCM停止接收通知see。因此,您最好的方法是按照@ D10S建议并实施保存和发送云功能。 here's如何发送通知的示例。您需要让您的应用将通知令牌保存到实时数据库,以便云功能可以读取它并将通知发送给正确的用户。

要将令牌保存到实时数据库,您需要在FirebaseMessagingService中添加一些代码,特别是FirebaseInstanceIdService方法。您可以在数据库中有一个名为令牌的位置,您可以使用用户ID创建一个对象。所以你可以像这样添加令牌到服务器:

onTokenRefresh

答案 1 :(得分:0)

来自服务器的通知将在onMessageReceived(RemoteMessage remoteMessage)remoteMessage对象中收到,您将获得titlebody,您可以将其存储在sqlite或SharedPreference中。    例如: -

  class FBMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.i("PVL", "MESSAGE RECEIVED!!");
        if (remoteMessage.getNotification().getBody() != null) {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
        } else {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
        }
    }
} 

onMessageReceived将在每个州获得事件: - 杀戮,背景,前景。

答案 2 :(得分:0)

如果用户未在应用中打开通知,则无法保存通知,因此如果他滑动通知,则无法将其保存在应用内。

选项是使用Cloud Functions for Firebase: https://firebase.google.com/docs/functions/

因此,您可以创建一个向用户发送通知的函数,然后添加代码以添加您要查找的行为:发送通知时,保存它。

答案 3 :(得分:0)

@Suppress("弃用") class MyFirebaseMessagingService : FirebaseMessagingService() {

val TAG = "FirebaseMessagingService"

@SuppressLint("LongLogTag")
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    Log.d(TAG, "sent phone: ${remoteMessage.from}")
    if (remoteMessage.notification != null) {
        showNotification(remoteMessage.notification?.title, remoteMessage.notification?.body)
    }
}

private fun showNotification(title: String?, body: String?) {
    val databaseHelper = DatabaseHelper(this)
    // sharedPreferences=this.getSharedPreferences("SHARED_PREF" , Context.MODE_PRIVATE)
    val intent = Intent(this, MenuscreenActivity::class.java)
    databaseHelper.insertData(title, body, databaseHelper.FIRST_TABLE_NAME)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
    startActivity(intent)
    val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
    val notificationBuilder = NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .setSound(soundUri)
        .setContentIntent(pendingIntent)
    val notificationManager =
        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.notify(0, notificationBuilder.build())
}

}

@Suppress("弃用") class MyFirebaseMessagingService : FirebaseMessagingService() {

val TAG = "FirebaseMessagingService"

@SuppressLint("LongLogTag")
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    Log.d(TAG, "sent phone: ${remoteMessage.from}")
    if (remoteMessage.notification != null) {
        showNotification(remoteMessage.notification?.title, remoteMessage.notification?.body)
    }
}

private fun showNotification(title: String?, body: String?) {
    val databaseHelper = DatabaseHelper(this)
    // sharedPreferences=this.getSharedPreferences("SHARED_PREF" , Context.MODE_PRIVATE)
    val intent = Intent(this, MenuscreenActivity::class.java)
    databaseHelper.insertData(title, body, databaseHelper.FIRST_TABLE_NAME)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
    startActivity(intent)
    val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
    val notificationBuilder = NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .setSound(soundUri)
        .setContentIntent(pendingIntent)
    val notificationManager =
        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.notify(0, notificationBuilder.build())
}

}