簡體   English   中英

注冊廣播接收器后多次調用廣播接收器

[英]Broadcast Receiver is called multiple times after registering broadcast receiver

我正在開發應該發送短信的 android 應用程序。 發送第一條 SMS onReceive ,Broadcast Receiver 的onReceive方法根據收到的響應將 SMS 的狀態顯示為SMS SentSMS DelieveredGeneric Failure 但是當再次發送 SMS 時, onReceiver首先顯示以前發送的消息的狀態,然后是更新的消息。 意味着每次調用 onReceiver 時,它都會顯示之前發送的每條消息的狀態。 以下類是通過擴展Worker編寫的,因此無法在此處覆蓋onStoponResume等活動生命周期方法。

任何幫助表示贊賞。 代碼如下。

PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0,
            new Intent(SENT), PendingIntent.FLAG_ONE_SHOT);

PendingIntent deliveredPI = PendingIntent.getBroadcast(getApplicationContext(), 0,
            new Intent(DELIVERED), PendingIntent.FLAG_ONE_SHOT);


 
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    status = sms_id + " : SMS Sent";
                    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    status = sms_id + " : Generic failure ";
                    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    status = sms_id + " : No service ";
                    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    status = sms_id + " : Null PDU  ";
                    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    status = sms_id + " : Radio off ";
                    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };
    IntentFilter filter = new IntentFilter(SENT);
    getApplicationContext().registerReceiver(broadcastReceiver, filter);
    //---when the SMS has been delivered---
    BroadcastReceiver broadcastReceiver1 = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    receiverStatus = sms_id + " : SMS delivered ";
                    Toast.makeText(context, receiverStatus, Toast.LENGTH_SHORT).show();
                    addItem(receiverStatus);
                    break;
                case Activity.RESULT_CANCELED:
                    receiverStatus = sms_id + " : SMS not delivered ";
                    Toast.makeText(context, receiverStatus, Toast.LENGTH_SHORT).show();
                    addItem(receiverStatus);
                    break;
            }
        }
    };
    IntentFilter filter1 = new IntentFilter(DELIVERED);
    getApplicationContext().registerReceiver(broadcastReceiver1, filter1);
    try {
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
        handler.post(() -> Toast.makeText(getApplicationContext(), " Do Work", Toast.LENGTH_SHORT).show());
        return Result.success();
    } catch (Exception e) {
        handler.post(() -> Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show());
        return Result.retry();
    }

你在這里做了很多錯誤的事情。 首先,不應在Worker Thread調用Broadcast Receiver 它始終適用於UI Thread 因此,每當您創建工作請求時, Broadcast Receiver被注冊,因此將注冊與創建工作請求一樣多的次數。 而且您不會在任何地方取消注冊。 所以它會被執行多次。 您應該在onCreate注冊 Broadcast Receiver 並在onStop/onResume取消注冊。 這樣他們就不會被注冊兩次。

希望能幫助到你 ;)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM