[英]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.