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.
添加回答
舉報