BroadcastReceiver больше не срабатывает после смерти активности - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь запланировать автоматический запуск моего приложения каждый день в определенный час.У меня есть куча кода, который работает хорошо, пока моя деятельность выполняется (на переднем плане или в фоновом режиме), но она перестает работать, когда активность прекращается (с помощью диспетчера задач или принудительно уничтожается).Я много искал, но ничего не помогло.

Вот мой облегченный код:

[BroadcastReceiver(Enabled = true, Exported = true)]
public class AutoWakeUpReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        AutoWakeUpReceiver.SetNextAutoWakeUp(AlarmManager.IntervalDay);

        Intent wakeUpIntent = new Intent(context, typeof(MainActivity));
        wakeUpIntent.SetFlags(ActivityFlags.ReorderToFront | ActivityFlags.BroughtToFront | ActivityFlags.NewTask);
        context.StartActivity(wakeUpIntent);
    }

    public static void SetNextAutoWakeUp(long delayInMillis)
    {
        Intent wakeUpIntent = new Intent(AndroidContext.Instance.MainActivity, typeof(AutoWakeUpReceiver));
        PendingIntent existing = PendingIntent.GetBroadcast(AndroidContext.Instance.MainActivity, 0, wakeUpIntent, PendingIntentFlags.NoCreate);
        existing?.Cancel();

        PendingIntent pending = PendingIntent.GetBroadcast(AndroidContext.Instance.MainActivity, 0, wakeUpIntent, PendingIntentFlags.UpdateCurrent);
        AlarmManager alarmManager = (AlarmManager)AndroidContext.Instance.MainActivity.GetSystemService(Context.AlarmService);

        if (Build.VERSION.SdkInt < BuildVersionCodes.M)
            alarmManager.Set(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + delayInMillis, pending);
        else
            alarmManager.SetAndAllowWhileIdle(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + delayInMillis, pending);
    }
}

Я также включил это в свою активность OnCreate (), чтобы экран разблокировался и загорелся (работает)и установить первый сигнал тревоги:

protected override void OnCreate(Bundle bundle)
{
    this.Window.AddFlags(WindowManagerFlags.TurnScreenOn | WindowManagerFlags.DismissKeyguard | WindowManagerFlags.ShowWhenLocked);
    AutoWakeUpReceiver.SetNextAutoWakeUp(0);
}

Я попытался объявить свой приемник в манифесте, но ничего не изменил, и я прочитал, что Ксамарин сделает это сам.Кстати, у меня есть эта проблема во всех версиях Android (от 19 до 27), так что это не проблема оптимизации батареи.Я предполагаю, что это проблема трансляции, но я не могу заставить ее работать после смерти активности.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Ваш 'BroadcastReceiver' никогда не останется зарегистрированным после смерти активности (посмотрите на this ).Это потому, что вашему получателю нужно что-то зарегистрировать.Если ваша деятельность разрушена, этого «связывания» больше не будет.

Я бы посоветовал вам запустить фоновую службу и запустить приложение в указанное время (посмотрите на this ).

0 голосов
/ 08 июня 2018

Если пользователь явно «принудительно остановил» ваше приложение, оно не будет получать никаких трансляций и не запустится, пока пользователь не откроет его снова явно.

Итак, ожидается, что ваш BroadcastReceiver не получит события в этом случае.Вот хороший ответ на подобный вопрос: https://stackoverflow.com/a/41938584/3086818

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...