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

问题描述 投票:0回答:1

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

android broadcastreceiver android-room
1个回答
0
投票

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

解决方案是这样:

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

[更多,请看这篇文章:The correct way to obtain a ViewModel instance outside of an Activity or a Fragment

© www.soinside.com 2019 - 2024. All rights reserved.