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

通过SharedPreference保存Firebase通知文本,实现新通知替换旧内容(APP关闭有效)

用SharedPreferences持久化Firebase通知内容

没问题,要实现让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:42