在Android Oreo中重启设备后PeriodicWorkRequest无法正常工作

时间:2018-07-20 09:30:04

标签: android android-workmanager

我需要根据以下逻辑将应用通知推送给用户。

  • 类型通知将每24小时显示一次。
  • 每7天显示一次B型通知。
  • 每15天显示一次C型通知。

我已按如下方式使用PeriodicWorkRequest工作管理器,在重新启动设备之前,它的工作正常。 重新启动设备后,我的工作就不会触发。

build.gradle ---

implementation 'android.arch.work:work-runtime:1.0.0-alpha04'

Java代码

PeriodicWorkRequest showNotification =
                new PeriodicWorkRequest.Builder(ShowNotificationWorkManager.class, interval,
                        TimeUnit.HOURS)
                        .addTag(notificationType)
                        .setInputData(myData)
                        .build();

getWorkManger().enqueue(showNotification);

6 个答案:

答案 0 :(得分:5)

我已经尝试过此代码并与我一起使用旧的API和新的API: 该代码在设备重启时每15分钟执行一次服务(工作管理器)。 对于AndroidManifest.xml文件:

<receiver android:name=".WorkManagerStartReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

在WorkManagerStartReceiver类上:

public class WorkManagerStartReceiver extends BroadcastReceiver {
    WorkManager mWorkManager;

    @Override
    public void onReceive(Context context, Intent intent) {

        PeriodicWorkRequest.Builder myWorkBuilder =
                new PeriodicWorkRequest.Builder(TestWorker.class,
                        PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
                        TimeUnit.MILLISECONDS);

        PeriodicWorkRequest myWork = myWorkBuilder.build();
        mWorkManager = WorkManager.getInstance(context);
        mWorkManager.enqueue(myWork);

    }
}

TestWorker.class是扩展Worker的类:

public class TestWorker extends Worker {

    public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        //your work that you want to execute here
        return null;
    }
}

如果您希望服务在应用程序打开时开始运行,则此代码段(在MainActivity上)会在应用程序打开时打开。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PeriodicWorkRequest.Builder myWorkBuilder =
            new PeriodicWorkRequest.Builder(TestWorker.class,
                                            PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
                                            TimeUnit.MILLISECONDS);
    PeriodicWorkRequest myWork = myWorkBuilder.build();
    WorkManager.getInstance(MainActivity.this)
            .enqueueUniquePeriodicWork("testworker", ExistingPeriodicWorkPolicy.KEEP, myWork);
}

答案 1 :(得分:0)

在设备完成启动后触发的BroadcastReceiver中重新启动PeriodicWorkRequest。像这样的意图过滤器。

<receiver
        android:name=".warrantyregistration.boot.BootReceiver"
        android:enabled="@bool/configuration_for_receiver_service">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

this答案说明了设备重启时OneTimeWorkRequest的行为。

答案 2 :(得分:0)

请在您的android清单中添加以下权限

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

答案 3 :(得分:0)

您致电了window.MathJax = { tex: { inlineMath: [['$', '$'], ['\\(', '\\)']], displayMath: [['$$', '$$']], macros: { "⌊": '{\\lfloor}', "⌋": '{\\rfloor}' } } }; 。相反,您应该加入定期工作,因为您的工作是定期操作

getWorkManger().enqueue(showNotification)

答案 4 :(得分:-1)

在设备上首次启动应用程序时,可以安排一次定期工作请求。我们可以使用共享首选项来确定该应用是否是首次启动。此外,为了在启动后重复工作,我们可以在BroadcastReceiver中启动工作,该工作将在重启设备后触发。

答案 5 :(得分:-1)

重新启动设备后,Sadly WorkManager确实无法正常工作。 但是好消息是您可以通过其他方式使它工作。

只需定义一个BroadcastReceiver并使用onReceive(-)方法调度WorKManager。

public class WorkManagerStartReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Constraints constraints = new Constraints.Builder()
            .setRequiresCharging(false)
            .build();

    PeriodicWorkRequest saveRequest =
            new PeriodicWorkRequest.Builder(ToastWorker.class, 15, TimeUnit.MINUTES)
                    .setConstraints(constraints)
                    .build();

    WorkManager.getInstance(context)
            .enqueue(saveRequest);
 } }

现在在 manifest.xml 文件

中定义您的BroadcastReceiver
<application
   ----
       >
    <activity android:name=".MainActivity"/>

    <receiver android:name=".WorkManagerStartReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

</application>

嘿,别忘了在清单文件 android.permission.RECEIVE_BOOT_COMPLETED

中添加启动权限