Я реализовал сервис Android, который позволяет регистрировать смс.Мой сервис запускается с самого начала приложения и перезапускается, когда я убиваю приложение (проводя пальцем).Проблема возникла, когда приложение получило смс: приложение и служба зависали без каких-либо исключений.Эта проблема доступна только для версии Android <8.0. </p>
Когда приложение аварийно завершает работу, оно не запускается ни по OnDestroy () службы, ни по MainActivity, ни по 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);
}
}
}
}
}
}
}
Приложениеи служба должна все еще работать после обработки смс