通过SharedPreference保存Firebase通知文本,实现新通知替换旧内容(APP关闭有效)
没问题,要实现让Firebase通知内容通过SharedPreferences持久保存,直到新通知来替换旧内容(哪怕应用关闭也能保留),咱们可以分两步处理:在接收通知时保存内容,以及在目标Activity里读取并更新显示。
第一步:在Firebase通知接收时保存内容
首先,你需要在FirebaseMessagingService的子类里处理通知接收逻辑,把最新的通知标题和内容存入SharedPreferences。这样不管应用是前台还是后台(注意:如果是系统展示的通知消息,后台时可能需要点击通知才会触发Activity,但数据消息会直接调用onMessageReceived),都能及时保存最新内容。
public class MyFirebaseMessagingService extends FirebaseMessagingService { // 定义SharedPreferences的常量,避免拼写错误 private static final String PREF_NAME = "NotificationPrefs"; private static final String KEY_NOTIFICATION_TITLE = "last_title"; private static final String KEY_NOTIFICATION_MESSAGE = "last_message"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); // 提取通知的标题和内容 String notificationTitle = remoteMessage.getNotification().getTitle(); String notificationMessage = remoteMessage.getNotification().getBody(); // 初始化SharedPreferences并保存数据 SharedPreferences sharedPref = getSharedPreferences(PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString(KEY_NOTIFICATION_TITLE, notificationTitle); editor.putString(KEY_NOTIFICATION_MESSAGE, notificationMessage); editor.apply(); // 异步保存,比commit()更高效 // 这里可以继续处理通知栏显示逻辑(如果需要的话) } }
别忘在AndroidManifest.xml里注册这个Service:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
第二步:在ResultActivity里读取并显示内容
接下来在你的ResultActivity中,先检查Intent是否携带了新的通知数据(用户点击通知打开应用时会传递这些数据),如果有就更新SharedPreferences并显示;如果没有,就读取之前保存的历史内容展示。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); // 初始化SharedPreferences SharedPreferences sharedPref = getSharedPreferences("NotificationPrefs", MODE_PRIVATE); String defaultTitle = "暂无通知"; String defaultMessage = "还没有收到任何通知"; // 从Intent获取新通知数据 String newTitle = getIntent().getStringExtra("title"); String newMessage = getIntent().getStringExtra("message"); String displayTitle; String displayMessage; if (newTitle != null && newMessage != null) { // 有新通知,更新SharedPreferences SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("last_title", newTitle); editor.putString("last_message", newMessage); editor.apply(); displayTitle = newTitle; displayMessage = newMessage; } else { // 无新通知,读取历史保存的内容 displayTitle = sharedPref.getString("last_title", defaultTitle); displayMessage = sharedPref.getString("last_message", defaultMessage); } // 设置页面标题和内容 setTitle(displayTitle); TextView desc = findViewById(R.id.your_textview_id); // 替换成你布局里的TextView ID desc.setText(displayMessage); }
额外提示
- 建议把SharedPreferences的键和文件名定义成常量,放在单独的类里,这样后续维护更方便,避免拼写错误。
MODE_PRIVATE确保只有你的应用能访问这个SharedPreferences文件,保证数据隐私。- 如果你的通知是数据消息(而非系统自动展示的通知消息),不管应用处于前台还是后台,
onMessageReceived都会被调用,能更及时地保存最新内容。
内容的提问来源于stack exchange,提问作者almaraa poultry
相关产品推荐
相关产品推荐

