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