Запуск android Worker, когда телефон не загружается - PullRequest
1 голос
/ 05 января 2020

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

В своем манифесте я добавил это разрешение: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Вот мой широковещательный приемник:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
public class BootBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        //Notify that the broadcast receiver is launched
        await AndroidNotificationService.NotifyUser("Device boot", "The device is booting", 11, context);
        OneTimeWorkRequest notifWork = new OneTimeWorkRequest.Builder(typeof(Services.Background.NotificationsBackgroundWorker))
            .Build();
        WorkManager.Instance.Enqueue(notifWork);
    }
}

Но это не поможет. приемник никогда не запускается при перезагрузке устройства. Я проверяю это на android 9.

1 Ответ

0 голосов
/ 08 января 2020

Получается, что начиная с API 26 Android ограничивает доступ к широковещательным приемникам. Способ, которым я преодолел это, заключался в том, что я создал службу переднего плана в моем приемнике вещания, которая выполняла работу, которую я хотел в фоновом режиме, или которая запустила мой WorkManager.

 [BroadcastReceiver]
[IntentFilter(new [] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.HighPriority)]
public class BootBroadcastReceiver : BroadcastReceiver
{
    public async override void OnReceive(Context context, Intent intent)
    {
        context.StartForegroundServiceCompat<AfterBootSyncService>();
    }
}

Вот реализация метода расширения StartForegroundServiceCompat:

    public static void StartForegroundServiceCompat<T>(this Context context, Bundle args = null) where T : Service
    {
        var intent = new Intent(context, typeof(T));
        if (args != null)
        {
            intent.PutExtras(args);
        }

        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
        {
            context.StartForegroundService(intent);
        }
        else
        {
            context.StartService(intent);
        }
    }

Когда я делаю это, код в моем трансивере открывается как обычно.

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