繁体   English   中英

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

[英]Android Best way to keep and share data through the app

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

  • 从应用程序启动的 MainActivity 文件中获取用户数据并将其通过 Intent 传递给其他人:这在将数据从 Activity 传递到 Activity 以及 Service 时效果很好,但似乎不适用于BroadcastReceiver因为它已注册为侦听到SMS_RECEIVED而不是其他广播,即使我创建了一个新的 Intent 并用startBroadcast广播它
  • 使user对象静态化:我尝试将User设为公共静态,以便在 MainActivity 完成从文件中获取数据后可以被其他类调用,基本上将public static User user放在 MainActivity 中并由MainActivity.user调用它MainActivity.user其他班级的MainActivity.user ,这甚至可以与BroadcastReceiver一起使用,但我不确定这是否是在整个应用程序中共享数据的正确方法
  • 最后是在调用每个 Activity 或 Service 时从文件中获取数据,这意味着在调用每个 Activity 或 Service 时,它​​会再次从 JSON 文件中获取数据。 我还没有尝试过,但我认为它可能会影响整个应用程序的性能和数据一致性。

那么实现这一点的正确方法是什么? 请给我一些建议。 提前谢谢你们。

对此,有几点建议:

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

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

public class UserDataStore()

这样你就可以在启动时创建一个 UserDataStore 的实例,然后通过依赖注入将它传递给你的应用程序。 因此,无论您在何处创建处理广播事件的服务,您都可以添加一个 UserDataStore 作为参数,假设您首先创建了 UserDataStore。 例如——

public class BroadcastReceiverService(UserDataStore store)

这种方式也意味着您的 BroadcastReceiverService 更具可测试性,因为您可以模拟 UserDataStore。

例子 -

public class MainActivity() {

    UserDataStore store = new UserDataStore()

    BroadcastReceiverService broadcastService = new BroadcastReceiverService(store)

}

然后在您的 UserDataStore -

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
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM