13

我需要根据以下逻辑向用户推送应用程序通知。

  • A 类通知将在每 24 小时后显示。
  • B 类通知将在每 7 天后显示。
  • C 类通知将在每 15 天后显示。

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);
4

6 回答 6

8

我已经尝试过这段代码并与我一起处理旧 API 和新 API:此代码在设备重新启动时每 15 分钟执行一次服务(workmanager)。对于 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);
}
于 2020-05-18T11:44:42.330 回答
1

You called getWorkManger().enqueue(showNotification). Instead, you should enqueue periodic work because yours is a Periodic Operation:

workManager = WorkManager.getInstance(this)
workManager.enqueueUniquePeriodicWork(
   WORKER_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest
 )
于 2020-06-08T20:04:55.380 回答
0

我已经尝试过了,也适用于 HTC 手机。

<receiver android:name=".WorkManagerStartReceiver" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
                <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            </intent-filter>
</receiver>
于 2022-01-31T17:18:34.370 回答
-1

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

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2019-04-28T08:00:52.017 回答
-1

如果在设备重新启动后 PeriodicWorkRequest 不工作,您可以通过执行以下步骤来解决此问题。

只需定义一个 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中添加启动权限

于 2019-09-19T06:23:04.783 回答
-2

当应用程序在设备上首次启动时,可以安排一次定期工作请求。我们可以使用共享偏好来识别应用程序是否是第一次启动。此外,为了在启动后重复工作,我们可以在一个广播接收器中启动工作,该广播接收器将在重启设备后触发。

于 2019-09-17T16:32:29.870 回答