如何在BroadcastReceiver中使用会议室数据库?

时间:2019-11-28 17:39:02

标签: android broadcastreceiver android-room

美好的一天。我的应用程序需要接收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可以在没有上下文的情况下运行。如果是这样,那有什么 短信后使用会议室数据库将数据插入数据库的方法?由于我的应用是短信投票,因此我需要在后台运行我的应用。

1 个答案:

答案 0 :(得分:1)

这里的问题是您试图在活动或片段之外检索ViewModel,这不是一个好习惯,而且也不起作用。

解决方案是这样的:

  

在单独的单例类中将Room DB操作与ViewModel分开。在ViewModel和其他需要的地方使用它。收到广播后,请通过此单例类而不是ViewModel将数据写入DB。

有关更多信息,请查看此帖子: The correct way to obtain a ViewModel instance outside of an Activity or a Fragment