gpt4 book ai didi

android - MVVM - 在应用程序关闭时从通知开始访问 BroadcastReceiver 中的 ViewModel/SQLite

转载 作者:行者123 更新时间:2023-11-29 00:54:19 25 4
gpt4 key购买 nike

我有一个每隔几天发送一次的提醒通知。

该通知的发送由重复的 AlarmManager 触发。通知本身构建在我的 BroadcastReceiveronReceive 中(如 here 所述)。因此,当 onReceive 被触发时,应用程序甚至没有打开/运行。

现在 我想访问我的(本地)SQLite 数据库 并获取正确的内容来构建通知,但是我如何获取 ViewModelProvider ( xxx)在这个地方访问我的ViewModel

public void onReceive(Context context, Intent intent) {    

NotificationViewModel viewModel =
ViewModelProviders.of(XXX).get(NotificationViewModel.class);

//do stuff
}

或者问一个更好的问题,这是好的做法吗?
另一种可能性是将所有内容填充到 PendingIntent 中,这将触发 onReceive,这样我就可以在收到后一个一个地检索它。但这会更难,因为它是一个重复的警报,每次都需要不同的内容,但只触发一次。


我查看了一些搜索结果,但它们并没有解决我的问题:


编辑:

阅读 LiveData beyond the ViewModel [...] ,据说

If part of your app doesn’t affect the UI, you probably don’t need LiveData.

所以这意味着我应该简单地使用上下文访问我的存储库并从中获取原始数据,没有 LiveData 包装器?

所以

public void onReceive(Context context, Intent intent) {

NotificationRepository rp = new NotificationRepository(context);
MessageNotification notification = rp.getNextNotification();
}

代替

public void onReceive(Context context, Intent intent) {

NotificationViewModel viewModel =
ViewModelProviders.of(XXX).get(NotificationViewModel.class);
MessageNotification notification =
viewModel.getNextNotification().observe(XXX, new
Observer<MessageNotification>() {
@Override
public void onChanged(MessageNotification messageNotification) {
//do stuff
}
});
}

但这是否违反了 MVVM 约定?
我应该使用其他架构吗?现在它对我来说似乎很有意义,因为它是我只检索一次并且不必观察变化的东西。

最佳答案

在这种情况下,ViewModel 的真正目的是什么?
它会将您的数据转换为某种便于查看的格式吗?
它会处理数据更新吗? (我的意思是,会不会有数据更新?好像你有一段时间有一个通知)
或者它只会让干净的同步代码变得杂乱无章,并使其变得毫无意义?

如果您只对最后一个问题回答"is",那么您可能不需要这里的 ViewModel:)您需要其他架构吗?不,你不需要架构。您需要显示通知,所以就去做吧!


如果你是一个真正的MVVM粉丝,你还是可以通过的。
首先,删除 ViewModelProviders.of 因为它不可能在这里使用。它需要 Activity 或 fragment ,而你两者都没有。 ViewModelProvider 的目的是在重新创建 Activity/fragment 时为您提供相同的 View 模型实例 - 这显然不是您的情况。
其次,自己构建 View 模型:new NotificationViewModel()
第三,从您的 View 模型而不是实时数据返回普通对象,因为您的数据不是实时的。

public class NotificationViewModel {
MessageNotification getNextNotification() {
// ...
}
}

请注意,您甚至不需要扩展 ViewModel 类,因为您不使用 ViewModelProviders。

关于android - MVVM - 在应用程序关闭时从通知开始访问 BroadcastReceiver 中的 ViewModel/SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56100168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com