簡體   English   中英

發送消息后,在OnReceive中注銷廣播接收器

[英]Unregister broadcastreceiver in OnReceive after message has been sent

我已經為注冊/注銷廣播接收器苦了一段時間。 如果滿足特定條件並且接收器已動態注冊,則必須發送一條消息。

public void sendSMS(String phoneNumber, String message) {
    brSendSMS = new BroadcastReceiverSendSMS();

    try {
        PendingIntent piSend = PendingIntent.getBroadcast(context, 0, new Intent(SMS_SENT), 0);

        int length = message.length();


        context.getApplicationContext().registerReceiver(brSendSMS, new IntentFilter(SMS_SENT));


        SmsManager smsManager = SmsManager.getDefault();
        if (length > MAX_SMS_MESSAGE_LENGTH) {

        } else {
            smsManager.sendTextMessage(phoneNumber, null, message, piSend, null);
        }

    } catch (Exception ex) {
        Toast.makeText(context, ex.getMessage(), Toast.LENGTH_LONG).show();
    }
}

我必須等待幾秒鍾才能獲得廣播結果。 在接收器的OnReceive方法中傳遞了結果之后,這也是我放置注銷的地方。

public class BroadcastReceiverSendSMS extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
        switch (getResultCode()) {
            case AppCompatActivity.RESULT_OK:
                result = "Message sent.";
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                result = "Message not sent.";
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                result = "No service.";
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                result = "Null PDU.";
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                result = "Radio off.";
                break;
        }
        context.getApplicationContext().unregisterReceiver(this);

     }
}

使用this關鍵字是否足以訪問該接收者的實例並注銷它? 保留或刪除此行代碼不會引發任何異常。 它甚至沒有顯示出泄漏的跡象。

如果這不是正確的方法,那會是什么?

您正在使用sendSMS方法初始化廣播接收器。 因此要注冊,您需要傳遞sendSms所在活動的上下文。 因此,在您初始化而不是:

brSendSMS = new BroadcastReceiverSendSMS();

采用:

brSendSMS = new BroadcastReceiverSendSMS(getContext());

還要在其中設置的BroadcastReceiverSendSMS類中創建構造函數

Context context;
this.context = context;

為此,在@Override之前添加以下代碼:

Context parentActivityContext;
public BroadcastReceiverSendSMS (Context activityContext)
    {
        this.parentActivityContext = activityContext;
    }

還要更改此:

context.getApplicationContext().unregisterReceiver(this);

至:

unregisterReceiver(parentActivityContext);

暫無
暫無

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

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