美好的一天。我的应用程序需要接收SMS,现在我想做的是我想在应用程序收到消息后立即将数据从BroadcastReceiver插入数据库。这是我的代码。
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ViewModel model = ViewModelProviders.of((FragmentActivity) context).get(ViewModel.class);
Bundle bundle = intent.getExtras();
Object[] objects = (Object[]) Objects.requireNonNull(bundle).get("pdus");
SmsMessage[] smsMessages = new SmsMessage[Objects.requireNonNull(objects).length];
Sms sms = new Sms();
for (int i = 0; i < smsMessages.length; i++) {
smsMessages[i] = SmsMessage.createFromPdu((byte[]) objects[i]);
sms = new Sms(
smsMessages[i].getOriginatingAddress(),
smsMessages[i].getMessageBody(),
smsMessages[i].getTimestampMillis()
);
}
model.insert(new ReplyToVotersQueue(sms.getBody(),sms.getAddress()));
}
}
如我们所见,我正在尝试将数据插入数据库,但是出现错误提示
java.lang.RuntimeException:无法启动接收器 mgb.com.smspoll.Services.SmsReceiver:java.lang.ClassCastException: android.app.ReceiverRestrictedContext无法转换为 androidx.fragment.app.FragmentActivity
在搜索此问题的答案时,我从互联网上发现BroadcastReceiver无法转换为Activity,因为BroadcastReceiver可以在没有上下文的情况下运行。如果是这样,那有什么 短信后使用会议室数据库将数据插入数据库的方法?由于我的应用是短信投票,因此我需要在后台运行我的应用。
答案 0 :(得分:1)
这里的问题是您试图在活动或片段之外检索ViewModel,这不是一个好习惯,而且也不起作用。
解决方案是这样的:
在单独的单例类中将Room DB操作与ViewModel分开。在ViewModel和其他需要的地方使用它。收到广播后,请通过此单例类而不是ViewModel将数据写入DB。
有关更多信息,请查看此帖子: The correct way to obtain a ViewModel instance outside of an Activity or a Fragment