gpt4 book ai didi

每次我打开我的应用程序时都会触发 Android 工作管理器

转载 作者:行者123 更新时间:2023-12-05 04:48:57 24 4
gpt4 key购买 nike

我做了一个周期性的工作管理器,它的行为很严重。它不是在设定的时间间隔内执行工作,而是每分钟执行一次。每次我打开应用程序时它也会被触发。这意味着如果我在一分钟内打开我的应用程序 50 次,它会完成 50 次工作。这是我的代码

public class UpdateUserDataService extends Worker {
public UpdateUserDataService(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}

@RequiresApi(api = Build.VERSION_CODES.O)
@NonNull
@Override
public Result doWork() {
FirebaseMessaging.getInstance().getToken().addOnSuccessListener(s -> {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Update");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy_h:mm a", Locale.getDefault());
Calendar c = Calendar.getInstance();
String currentDate = dateFormat.format(c.getTime());
JobFooter jobFooter = new JobFooter(currentDate, s);
reference.child(dateFormat.format(new Date())).setValue(jobFooter);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
notificationIntent.putExtra("Notification", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(getApplicationContext(), 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationHelper notificationHelper = new NotificationHelper(getApplicationContext(), defaultSoundUri);
Notification.Builder notificationBuilder = notificationHelper.getNotification("Title", currentDate, intent);
notificationHelper.notify(10, notificationBuilder);
});
return Result.success();
}
}

并且在我的 oncreate 方法下的主要 Activity 中

 Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build();
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(
UpdateUserDataService.class, 15, TimeUnit.MINUTES)
.setConstraints(constraints)
.build();

WorkManager.getInstance(this).enqueue(periodicWorkRequest);

我只想让我的代码按照操作系统规范和约束每 15 分钟执行一次,而不管我的应用程序是否打开。

最佳答案

String EXPIRY_CHECK = "unique_worker_name";

Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();

PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
.Builder(UpdateUserDataService.class, 1, TimeUnit.DAYS)
.setConstraints(constraints).build();

WorkManager.getInstance(this)
.enqueueUniquePeriodicWork(EXPIRY_CHECK, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);

这将检查一个已经存在的 worker 是否已初始化,如果它已经在运行,则不会启动一个新的 worker。

关于每次我打开我的应用程序时都会触发 Android 工作管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67752157/

24 4 0
文章推荐: php - 如果 WooCommerce 购物车至少包含 X 产品,则自动添加百分比折扣
文章推荐: javascript - 如何更改