Как обновить RecyclerView из BroadcastReceiver? - PullRequest
0 голосов
/ 17 февраля 2019

В 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» в случае, если новые SMS были получены при запуске приложения?

UPD: я имею в виду, что мне нужно решение для обоих состояний - для запуска приложения И длясостояние, когда приложение не запущено, в одном приемнике.Потому что я должен принимать СМС все время, пока телефон работает.И если приложение запущено, я хочу обновить RecyclerView.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я пытался сделать это через 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.

0 голосов
/ 17 февраля 2019

Вы должны иметь 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...