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 中注册。
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.
添加回答
举报