为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 BroadcastReceiver 更新 RecyclerView?

如何从 BroadcastReceiver 更新 RecyclerView?

HUH函数 2022-06-23 17:28:20
在AndroidManifest.xml我有一个BroadcastReceiver:<receiver android:name=".SmsMonitor">    <intent-filter android:priority="-100">        <action android:name="android.provider.Telephony.SMS_RECEIVED" />    </intent-filter></receiver>在我的MainActivity中,我有RecyclerView一个收到的短信列表。我的问题是 - 如果在应用程序运行时收到新的 SMS,我如何RecyclerView从我的BroadcastReceiver“SmsMonitor”更新?UPD:我的意思是我需要两种状态的解决方案——在一个接收器中运行应用程序和应用程序未运行时的状态。因为我必须在电话工作时一直接收短信。如果应用程序正在运行,我想更新RecyclerView.
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

我试图通过 来做到这一点Service,但我没有成功。但我找到了简单的解决方案:


我还有BroadcastReceiver SmsMonitor,注册在AndroidManifest.xml


在我创建我的实例的地方RecyclerAdapter:


mainAdapter = new MainAdapter(this);

在此之后我注册另一个BroadcastReceviver:


BroadcastReceiver br = new BroadcastReceiver() {

    @Override

    public void onReceive(Context context, Intent intent) {

        setInitialData();

        mainAdapter.notifyDataSetChanged();

    }

};

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

this.registerReceiver(br, filter);

在setInitialData()我重新创建所有数据列表RecyclerView。


而现在我有两个独立工作BroadcastReceiver。第一个工作BroadcastReceiver来自AndroidManifest.xml,然后工作BroadcastReceiver在 MainActivity 中注册。


查看完整回答
反对 回复 2022-06-23
?
翻阅古今

TA贡献1780条经验 获得超5个赞

您需要BrodcastReceiver在您的MainActivity或Fragment托管RecyclerView. 这样当收到新短信时,您可以调用您notifyDataSetChanged的适配器上的RecyclerView更新它。


BroadcastReceiver在你Activity喜欢的下面声明一个。这可以是您班级的内部MainActivity班级。


class SMSBroadcastReceiver extends BroadcastReceiver {


    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    private static final String TAG = "SMSBroadcastReceiver";


    @Override

    public void onReceive(Context context, Intent intent) {


            if (intent.getAction() == SMS_RECEIVED) {

                Bundle bundle = intent.getExtras();

                if (bundle != null) {

                    // Update your RecyclerView here 

                    // by calling notifyDataSetChanged on the adapter

                }

            }

       }

}

现在BroadcastReceiver在你的onCreate函数中创建一个实例MainActivity并注册接收器。


您需要先在您Activity的下面请求短信许可。


if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.RECEIVE_SMS}, 0);

} else {

        // register sms receiver

        IntentFilter filter = new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);

        registerReceiver(smsReceiver, filter);

}


@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);


    if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {


    } else {

        // register sms receiver

        IntentFilter filter = new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);

        registerReceiver(smsReceiver, filter);

    }

}

不要忘记在onDestroy您的MainActivity.


希望有帮助!


更新


根据此答案下方的评论,您有两种情况。


案例 1. 应用程序正在运行。

案例 2. 应用程序未运行。


对于案例1:BroadcastReceiver像我上面显示的本地,足以RecyclerView在新短信到达时立即更新。当您处理BroadcastReceiverfrom 时,MainActivity这应该不是问题,因为您参考了RecyclerView.


现在来看案例 2:如果您能够检测到任何新的 SMS 到达,您可以将收到的新 SMS 保存在本地数据库中。您需要为您的应用程序提供一个 SQLite 数据库,该数据库将存储所有 SMS,并且RecyclerView在您的应用程序中应该从存储 SMS 的数据库表中填充数据。我希望你明白 - 只需将 SMS 存储在与应用程序关联的本地数据库中,当你运行应用程序并启动时MainActivity,从本地数据库中读取 SMS 并将它们显示在你的RecyclerView.


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信