【问题标题】:Android Workmanger PeriodicWorkRequest API work only once?Android Workmanager PeriodicWorkRequest API 只能工作一次?
【发布时间】:2018-12-13 07:04:08
【问题描述】:

正在使用 androidx 工作管理器 API,在工作管理器中使用 PeriodicWorkRequest 每 4 小时触发一次工作。但它只在运行应用程序后工作一次。

PeriodicWorkRequest 编码:-

Constraints constraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

PeriodicWorkRequestpendingCampaignWork = new PeriodicWorkRequest.Builder(PendingCampaignWorker.class, 4, TimeUnit.HOURS)
            .setConstraints(constraints)
            .build();

将请求排队的工作管理器代码:-

WorkManager.getInstance().enqueueUniquePeriodicWork(LATEST_CAMPAIGN_WORK, ExistingPeriodicWorkPolicy.KEEP, pendingCampaignWork);

为了测试,将系统时间手动更改为在模拟器中运行应用程序以触发工作后的 4 小时。

我的代码中是否有任何问题帮助我解决问题。

更新:-

工作管理器工作正常,它不能像 m.hassan 在回答部分所说的那样根据系统时间工作。我测试每 20 分钟触发一次工作,它工作正常。

【问题讨论】:

    标签: android android-jetpack android-workmanager


    【解决方案1】:

    工作管理器不基于系统时间。您可以提出 15 分钟的定期工作请求。这样你就可以测试你的代码了。

    这是一个例子:

    我的定期工作请求:

    private static final String TAG = "PeriodicWorkTag";
    private static final int PERIODIC_WORK_INTERVAL = 15;
    
    public static void schedulePeriodicWork() {
        androidx.work.PeriodicWorkRequest periodicWorkRequest = new androidx.work.PeriodicWorkRequest.Builder(PeriodicWorkRequest.class, PERIODIC_WORK_INTERVAL,
                TimeUnit.MINUTES)
                .addTag(TAG)
                .build();
        WorkManager.getInstance().enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
    }
    
    public static void cancelPeriodicWork() {
        WorkManager.getInstance().cancelAllWorkByTag(TAG);
    }
    

    我的工人阶级:

    public static final String CHANNEL_ID = "VERBOSE_NOTIFICATION" ;
    public PeriodicWorkRequest(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
    
    @NonNull
    @Override
    public Result doWork() {
        showNotification(getApplicationContext());
        return Result.SUCCESS;
    }
    
    private void showNotification(Context context) {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("My notification")
                .setContentText("ddd")
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("ddd"))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "Channel_name";
            String description = "description";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
        notificationManager.notify(100, mBuilder.build());
    }
    

    【讨论】:

    • OneTimeWorkRequest 有效,但 PeriodicWorkRequest 无效
    【解决方案2】:

    这在我的例子中起到了作用:将您的应用添加到 IGNORE_BATTERY_OPTIMIZATIONS 列表。

    @SuppressLint("BatteryLife")
        public void showIgnoreBatteryOpt() {
            String packageName = getPackageName();
            Intent intent = new Intent();
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                Log.d(TAG, "showIgnoreBatteryOpt: NOT ignoring");
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
                startActivity(intent);
            }
            else {
                Log.d(TAG, "showIgnoreBatteryOpt: ignoring");
            }
    
        }
    

    添加到AndroidManifest.xml:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多