Вы должны иметь 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
в функции 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);
}
}
Не забудьте отменить регистрацию приемника в функции onDestroy
вашего MainActivity
.
Надеюсь, это поможет!
Обновление
На основании комментария под этим ответом у вас есть два случая.
Случай 1. Приложение работает.
Случай 2. Приложение не запущено.
Для случая 1: локальный BroadcastReceiver
, как я показал выше, достаточно хорош дляобновите RecyclerView
мгновенно, когда придет новое SMS.Поскольку вы обрабатываете BroadcastReceiver
из MainActivity
, это не должно быть проблемой, так как у вас есть ссылка на ваш RecyclerView
.
Теперь для случая 2. Если вы можете обнаружить любое новое прибытие SMS, вы можете сохранить новое SMS, полученное в вашей локальной базе данных.Для вашего приложения должна быть база данных SQLite, в которой будут храниться все SMS, а RecyclerView
в вашем приложении должно заполнять данные из таблицы базы данных, в которой хранятся SMS.Я надеюсь, что вы поняли идею - просто сохраните SMS в вашей локальной базе данных, связанной с вашим приложением, и когда вы запустите приложение и запустите MainActivity
, прочитайте SMS из вашей локальной базы данных и покажите их в своем RecyclerView
.