【发布时间】:2019-09-29 16:41:05
【问题描述】:
我有每隔几天发送一次的提醒通知。
该通知的发送由重复的AlarmManager 触发。通知本身内置在我的BroadcastReceiver 的onReceive 中(如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,因此我可以在收到后一一检索。但这会更难,因为它是一个重复的警报,每次都需要不同的内容,但只触发一次。
我查看了一些搜索结果,但没有解决我的问题:
-
MVVM Architecture for Custom Views on Android
-> 对于这样一个小问题,似乎有很多代码,加上 Kotlin,这对我来说很难理解 -
Dealing with BroadcastReceivers using the Model View Presenter design pattern
-> 这里似乎有必要先在活动中设置一些东西,然后才能使用它,但我需要在不运行我的应用程序的情况下启动此代码 -
Accessing BroadCastReceiver in Viewmodel
-> 这似乎最接近我的需要,但它还需要之前的设置。我想试试这个,但我需要手动创建我的 MainActivity 来访问它的变量。这不会在没有警告的情况下在用户设备上打开一个新活动吗?
甚至可以在我的应用程序不在前台的情况下访问我的数据库吗?
编辑:
阅读LiveData beyond the ViewModel [...],据说
如果您的应用程序的一部分不影响 UI,您可能不需要 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 约定?
我应该使用其他架构吗?现在这对我来说似乎很有意义,因为 这是我只检索一次并且不必观察变化的东西。
【问题讨论】:
标签: android mvvm broadcastreceiver viewmodel android-viewmodel