在电话启动时运行android worker不起作用

问题描述 投票:1回答:1

我有一个工作正常的工人。我想在手机启动时启动它。我使用了广播接收器,该广播接收器应该侦听系统的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上进行测试。

c# android xamarin.android broadcastreceiver
1个回答
0
投票

事实证明,从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);
        }
    }

当我这样做时,通常会调用广播播报器中的代码。

© www.soinside.com 2019 - 2024. All rights reserved.