You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在安卓设备上存储Firebase通知并在新Activity中访问?

实现方案总览

核心使用Room持久化库存储通知结构化数据,兼顾后续增删查改需求,同时支持实时数据监听,无需额外配置跨页面数据传递逻辑即可在任意Activity访问通知数据。

步骤1:添加Room依赖

在模块级build.gradle文件中添加如下依赖:

dependencies {
    def room_version = "2.5.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"

    // 协程依赖如果已配置可忽略
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
}
步骤2:定义通知实体类

声明要存储的通知字段结构:

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "push_notifications")
data class PushNotification(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val title: String,
    val content: String,
    val receivedTime: Long,
    val extraData: String? = null // 存储通知附带的自定义参数,可转JSON字符串存储
)
步骤3:定义数据操作DAO接口

封装通知增删查逻辑:

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import kotlinx.coroutines.flow.Flow

@Dao
interface NotificationDao {
    // 插入新收到的通知
    @Insert
    suspend fun insertNotification(notification: PushNotification)

    // 按接收时间倒序查询所有通知,Flow可自动监听数据变化
    @Query("SELECT * FROM push_notifications ORDER BY receivedTime DESC")
    fun getAllNotifications(): Flow<List<PushNotification>>

    // 可选:清空所有通知的方法
    @Query("DELETE FROM push_notifications")
    suspend fun clearAllNotifications()
}
步骤4:创建Room数据库单例

避免数据库多实例冲突:

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context

@Database(entities = [PushNotification::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun notificationDao(): NotificationDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}
步骤5:在Firebase消息服务中存储收到的通知

在你已实现的FirebaseMessagingService子类的onMessageReceived方法中新增存储逻辑:

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class MyFirebaseMessagingService : FirebaseMessagingService() {
    private val db by lazy { AppDatabase.getDatabase(this) }
    private val ioScope = CoroutineScope(Dispatchers.IO)

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)

        // 提取通知字段
        val title = remoteMessage.notification?.title ?: ""
        val content = remoteMessage.notification?.body ?: ""
        val receivedTime = System.currentTimeMillis()
        val extraData = remoteMessage.data.toString()

        // 存入本地数据库
        ioScope.launch {
            db.notificationDao().insertNotification(
                PushNotification(title, content, receivedTime, extraData)
            )
        }

        // 原有弹出通知的逻辑保留即可
    }
}
步骤6:在新Activity中读取通知数据

以通知列表页为例,代码如下:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

class NotificationListActivity : AppCompatActivity() {
    private lateinit var db: AppDatabase
    private lateinit var notificationAdapter: NotificationAdapter // 自行实现RecyclerViewAdapter即可

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_notification_list)

        db = AppDatabase.getDatabase(this)
        notificationAdapter = NotificationAdapter()
        findViewById<androidx.recyclerview.widget.RecyclerView>(R.id.rv_notification).apply {
            layoutManager = LinearLayoutManager(this@NotificationListActivity)
            adapter = notificationAdapter
        }

        // 监听通知数据变化,自动刷新列表
        lifecycleScope.launch {
            db.notificationDao().getAllNotifications().collect { list ->
                notificationAdapter.submitList(list)
            }
        }
    }
}

补充说明

  • 若通知数据量极小且无复杂查询需求,也可将通知列表转JSON字符串存入SharedPreferences,但扩展性不如Room
  • 代码基于协程实现,无需协程的项目可将suspend修饰符去除,改用RxJava或其他异步方案替代
  • 需确保AndroidManifest.xml中已正确注册你实现的FirebaseMessagingService

内容的提问来源于stack exchange,提问作者Viktor Pesic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:09