BroadcastReceiver使用OnReceive()方法使我的应用和服务崩溃

时间:2019-07-08 15:23:47

标签: android xamarin.forms service xamarin.android broadcastreceiver

我实现了一个允许注册短信的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);
                                }
                            }

                        }
                    }
                }
            }
        }

短信处理后,应用程序和服务仍应正常工作

0 个答案:

没有答案