我实现了一个允许注册短信的android服务。我的服务从应用程序的开头开始,并且在我杀死应用程序(通过轻扫)后重新启动。该应用程序收到短信时出现问题:该应用程序和服务崩溃,没有任何异常。该问题仅适用于Android版本<8.0。
当应用崩溃时,它不会触发服务或MainActivity的OnDestroy()或OnTaskRemoved。我可以在OnReceive方法中执行任何操作,问题仍然存在,当应用程序完成该过程时,该应用程序和服务停止了。
这是OnReceive方法
public override async void OnReceive(Context context, Intent intent)
{
//start service
if (intent.Action.Equals(SERVICE_ACTION))
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
context.StartForegroundService(new Intent(context, typeof(BackgroundService)));
}
else
{
var intentTmp = new Intent(context, typeof(BackgroundService));
context.StartService(intentTmp);
}
}
//receive sms
else if (intent.Action.Equals(SMS_ACTION))
{
var result = GoAsync();
await ReceiveSMSBroadcast(intent);
result.Finish();
}
}
//Sms processing
private async Task ReceiveSMSBroadcast(Intent intent)
{
var transmitter = "";
var message = "";
long timestamp = 0;
//A mapping from String values : Retrieves a map of extended data from the intent.
Bundle bundle = intent.Extras;
if (bundle != null)
{
if (intent.HasExtra("pdus"))
{
//Retrieve sms message
var smsArray = (Java.Lang.Object[])bundle.Get("pdus");
SmsMessage[] smsMessages = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
foreach (var smsItem in smsMessages)
{
transmitter = smsItem.OriginatingAddress;
message = smsItem.MessageBody;
timestamp = smsItem.TimestampMillis / 1000;
var servers = await _serverRepository.ReadAll();
foreach (var server in servers)
{
foreach (var phone in server.PhoneNumbersBlob)
{
if (phone.Equals(transmitter))
{
await CreateAlarm(server, message, timestamp);
}
}
}
}
}
}
}
短信处理后,应用程序和服务仍应正常工作