我正在开发基于 GCM 的应用程序,用户可以在其中订阅多个主题。

我需要知道用户在两个地方订阅了哪些主题:

  • 主要 Activity - 在 UI 中显示 SubscribeUnsubscribe 按钮
  • GCM 监听器服务 - 通过 GcmPubSub 过滤消息和处理“过时”订阅。基本上,如果监听器收到不在应用程序的主题列表中的主题的消息,那么我们可能在 GCM 服务器上有一个“过时”的订阅并且必须取消订阅。

  • 所以基本上我有一个 Activity 和一个服务,它们都可以访问一些公共(public)数据并且都可以修改这些数据。

    我读过在 Activity 和服务之间共享数据的选项之一是使用共享首选项:
  • Sharing data amongst activities and services

  • 这适合我的情况,因为我很乐意分享 Set<String> 支持的 SharedPreferences。用户可能只对几个主题感兴趣(比如最多 10 个)。

    这是我的代码,用于检查用户是否订阅了主题:
    SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
    Set<String> subscribedTopics = preferences.getStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, Collections.<String>emptySet());
    boolean subscribedForTopic = subscribedTopics.contains(topic);
    

    这是修改订阅的代码(例如取消订阅):
    SharedPreferences preferences =
            PreferenceManager.getDefaultSharedPreferences(getContext());
    Set<String> topics = new TreeSet<String>(preferences.getStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, Collections.<String>emptySet()));
    topics.remove(topic);
    preferences.edit().putStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, topics).apply();
    

    但现在我怀疑这是一种适当的方式。我将基本上访问每个检查(在 UI 中或收到的消息中)以及修改的共享首选项。

    这是正确的方法吗?我应该直接通过首选项在 Activity 和服务之间共享数据还是应该以某种方式缓存值?

    最佳答案

    您无需缓存 SharedPreferences 数据,因为 SharedPreferencesImpl 已经缓存了共享数据。

    10-08 06:02
    查看更多