在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
。
答案 0 :(得分:0)
您还需要在BrodcastReceiver
或MainActivity
中包含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
。