如何在安卓设备上存储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
相关产品推荐
相关产品推荐

