如何从BroadcastReceiver更新RecyclerView?

时间:2019-02-17 18:01:28

标签: java android android-recyclerview broadcastreceiver

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“ SmsMonitor”中更新BroadcastReceiver

UPD:我的意思是我需要在两个接收器中同时解决两种状态-运行应用程序以及运行未运行状态的问题。因为我必须在电话工作时始终接收短信。如果应用程序正在运行,我想更新RecyclerView

2 个答案:

答案 0 :(得分:0)

您还需要在BrodcastReceiverMainActivity中包含Fragment,它承载着RecyclerView。这样,当收到新的SMS时,您可以在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的{​​{1}}函数中创建此onCreate的实例,并注册接收者。

您需要先在MainActivity中请求SMS许可,如下所示。

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); } } 的{​​{1}}功能中注销接收器。

希望有帮助!

更新

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

情况1.该应用程序正在运行。
 情况2。应用未运行。

对于情况1:如上所示,本地onDestroy足以在收到新SMS时立即更新MainActivity。在处理BroadcastReceiver中的RecyclerView时,这应该没有问题,因为您可以参考BroadcastReceiver

现在情况2:如果您能够检测到任何新的SMS到达,则可以将收到的新SMS保存在本地数据库中。您需要为您的应用程序提供一个SQLite数据库,该数据库将存储所有SMS,并且应用程序中的MainActivity应该从存储SMS的数据库表中填充数据。希望您能想到-只需将SMS存储在与应用程序关联的本地数据库中,然后在运行应用程序并启动RecyclerView时,从本地数据库中读取SMS并将其显示在{{1} }。

答案 1 :(得分:0)

我尝试通过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,然后处理在MainActivity中注册的BroadcastReceiver