Java Android是通过应用程序保存和共享数据的最佳方式

Java Android是通过应用程序保存和共享数据的最佳方式,java,android,service,broadcastreceiver,Java,Android,Service,Broadcastreceiver,我正在制作一个小的Android应用程序,它运行一个前台服务,每当收到新的短信时,它都会监听并通知用户。当服务启动时,它在IntentFilter中使用actionandroid.provider.Telephony.SMS\u注册BroadcastReceiver,并在停止时取消注册。应用程序还可以从内部存储器中的JSON文件中获取用户数据以及所选号码的列表,以便接收方可以过滤出要通知用户的号码。My Main Activity有3个按钮,启动和停止服务,以及一个设置按钮,移动到设置活动,显示

我正在制作一个小的Android应用程序,它运行一个前台服务,每当收到新的短信时,它都会监听并通知用户。当服务启动时,它在IntentFilter中使用action
android.provider.Telephony.SMS\u注册
BroadcastReceiver
,并在停止时取消注册。应用程序还可以从内部存储器中的JSON文件中获取用户数据以及所选号码的列表,以便接收方可以过滤出要通知用户的号码。My Main Activity有3个按钮,启动和停止服务,以及一个设置按钮,移动到设置活动,显示一些用户信息以及所选号码的列表,并允许用户更改。我的问题是:在整个应用程序中共享用户数据的最佳方式是什么,以便所有活动以及服务和接收者都可以访问它?我想到并尝试了几种方法:

  • 从应用程序启动的MainActivity中的文件获取用户数据,并通过Intent将其传递给其他人:这在将数据从一个活动传递到另一个活动以及服务时非常有效,但似乎不适用于
    BroadcastReceiver
    ,因为它注册为收听
    SMS\u接收的
    ,而不是其他广播,即使我创建了新的意图并使用
    startBroadcast进行广播
  • 用户
    对象设置为静态:我尝试将
    用户
    设置为公共静态,以便在MainActivity从文件中获取数据时,其他类可以调用它,基本上是将
    公共静态用户
    放置在MainActivity中,并通过其他类中的
    MainActivity.user
    调用它,这甚至适用于
    BroadcastReceiver
    ,但我不确定这是否是在整个应用程序中共享数据的正确方法
  • 最后是在调用每个活动或服务时从文件中获取数据,这意味着在调用每个活动或服务时,它会再次从JSON文件中获取数据。我还没有尝试过,但我认为这可能会影响整个应用程序的性能和数据一致性

那么,实现这一目标的正确方法是什么?请给我一些建议。提前感谢各位。

对此有几点建议:

1-您可以将所需数据存储在共享首选项中,但如果这是个人数据,您可能不想这样做,因为您希望保持隐私(例如密码、个人身份信息)

2-与您在活动中所做的类似,您可以创建一个服务,负责从文件中获取用户数据,并将其保留到应用程序被终止为止,例如-

公共类UserDataStore()

通过这种方式,您可以在启动时创建UserDataStore的实例,然后通过依赖项注入将其传递给应用程序。因此,无论您在哪里创建处理广播事件的服务,只要添加一个UserDataStore作为参数,假设您首先创建了UserDataStore。乙二醇-

公共类广播接收服务(UserDataStore存储)

这种方式还意味着您的BroadcastReceiverService更易于测试,因为您可以模拟UserDataStore

范例-

public class MainActivity() {

    UserDataStore store = new UserDataStore()

    BroadcastReceiverService broadcastService = new BroadcastReceiverService(store)

}
然后在用户数据存储中-

public class UserDataStore() {

// in here you want to get all your info about the user eg username, email etc

    String name = ""

    init {
        User user = getUserInfo()
        name = user.name
    }


    public String getUserName() {
       return name
    }  

}
最后在你的广播接收机里

public class BroadcastReceiverService(UserDataStore store) {

    public void receiveMessage(Message msg) {
        if(msg.username == store.name) // continue
    }

}

谢谢你的回答。第一个,我将研究,但可能为其他项目,因为有密码存储在文件中。第二个我不太明白,你能详细说明一下吗?当然!例如,你可以有一个
UserDataStore
,它只是一个拥有
User
的类,在应用程序启动时,你可以用它们的所有信息填充它。然后,您只需确保在创建
广播接收服务
(或负责处理广播的任何类)时您将新的
UserDataStore
传递到该应用程序中,您将能够访问用户信息,而无需在您的应用程序中具有全局可访问的单个用户实例。很抱歉,回复太晚,但我仍然没有收到。我有一个从MainActivity启动的服务,在启动时,在IntentFilter中注册一个侦听
接收的\u SMS
的接收器,并在停止时注销,但接收器不会接收我通过另一个Intent和sendBroadcast从服务发送的用户数据。你能更新答案让我看看你的意思吗?