广播接收器仅在打开应用程序时有效
Broadcast receiver only works when app is opened
您好,我创建了一个自动短信应用程序,它会在收到 firebase 通知时自动发送短信。我可以发送扩展 FirebaseMessagingService
的短信。现在为了获得发送状态,我在主 activity 中创建了一个广播接收器。
在这里,我只能在应用程序打开时获取短信发送状态。即使应用程序是后台,我也需要得到它。
我的收件人是:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = null;
switch (getResultCode()) {
case Activity.RESULT_OK:
message = "Message sent!";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
message = "Error. Message not sent.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
message = "Error: No service.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
message = "Error: Null PDU.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
message = "Error: Radio off.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
}
}
};
在 onCreate 中注册接收者:
registerReceiver(receiver, new IntentFilter(Constants.SMS_SENT));
我的 firebase 服务使用以下方式发送短信:
private void sendSms(String phonenumber[],String message)
{
SmsManager manager = SmsManager.getDefault();
PendingIntent piSend = PendingIntent.getBroadcast(this, 0, new Intent(Constants.SMS_SENT), 0);
PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(Constants.SMS_DELIVERED), 0);
int length = message.length();
if(length > MAX_SMS_MESSAGE_LENGTH)
{
ArrayList<String> messagelist = manager.divideMessage(message);
for(String number : phonenumber) {
manager.sendMultipartTextMessage(number, null, messagelist, null, null);
}
}
else
{
for(String number : phonenumber) {
manager.sendTextMessage(number, null, message, piSend, piDelivered);
}
}
}
你在清单中注册了吗class。?
如果没有,则在清单中注册您的广播并使用单独的 class 进行广播
你可以从这里阅读更多。 https://www.c-sharpcorner.com/UploadFile/8836be/how-to-create-global-broadcast-receiver-and-test-service-in/
如果您在 onPause() 中注销接收器,则它可能无法正常工作。尝试将注销代码移动到 onStop() 或 onDestroy()
您好,我创建了一个自动短信应用程序,它会在收到 firebase 通知时自动发送短信。我可以发送扩展 FirebaseMessagingService
的短信。现在为了获得发送状态,我在主 activity 中创建了一个广播接收器。
在这里,我只能在应用程序打开时获取短信发送状态。即使应用程序是后台,我也需要得到它。
我的收件人是:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = null;
switch (getResultCode()) {
case Activity.RESULT_OK:
message = "Message sent!";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
message = "Error. Message not sent.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
message = "Error: No service.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
message = "Error: Null PDU.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
message = "Error: Radio off.";
Log.e("DATA", message);
unregisterReceiver(receiver);
break;
}
}
};
在 onCreate 中注册接收者:
registerReceiver(receiver, new IntentFilter(Constants.SMS_SENT));
我的 firebase 服务使用以下方式发送短信:
private void sendSms(String phonenumber[],String message)
{
SmsManager manager = SmsManager.getDefault();
PendingIntent piSend = PendingIntent.getBroadcast(this, 0, new Intent(Constants.SMS_SENT), 0);
PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(Constants.SMS_DELIVERED), 0);
int length = message.length();
if(length > MAX_SMS_MESSAGE_LENGTH)
{
ArrayList<String> messagelist = manager.divideMessage(message);
for(String number : phonenumber) {
manager.sendMultipartTextMessage(number, null, messagelist, null, null);
}
}
else
{
for(String number : phonenumber) {
manager.sendTextMessage(number, null, message, piSend, piDelivered);
}
}
}
你在清单中注册了吗class。? 如果没有,则在清单中注册您的广播并使用单独的 class 进行广播 你可以从这里阅读更多。 https://www.c-sharpcorner.com/UploadFile/8836be/how-to-create-global-broadcast-receiver-and-test-service-in/
如果您在 onPause() 中注销接收器,则它可能无法正常工作。尝试将注销代码移动到 onStop() 或 onDestroy()