亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 BroadcastReceiver 更新 RecyclerView?

如何從 BroadcastReceiver 更新 RecyclerView?

HUH函數 2022-06-23 17:28:20
在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”更新?UPD:我的意思是我需要兩種狀態的解決方案——在一個接收器中運行應用程序和應用程序未運行時的狀態。因為我必須在電話工作時一直接收短信。如果應用程序正在運行,我想更新RecyclerView.
查看完整描述

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 中注冊。


查看完整回答
反對 回復 2022-06-23
?
翻閱古今

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.


查看完整回答
反對 回復 2022-06-23
  • 2 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號