我想在11:59 Pm上准确地在服务器上上传一些数据。这次我想收集数据,并且只要有Internet,就应该上传数据。首选是使用WorkManager
,但是我无法将其设置为准确的时间。对于确切的时间,我们必须使用AlarmManager
,并且必须实现自己的逻辑或Internet的广播接收器。
因此,我正在使用AlarmManager为此设置OneTimeWorkRequest
。但是问题是它在后台运行时无法正常运行,而当应用程序在前台时运行正常。
清单
<service android:name=".Home.services.WorkerService"
android:enabled="true"
android:exported="true"/>
从片段开始服务
private void setUpService(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.MINUTE,59);
Intent intent = new Intent(getActivity(), WorkerService.class);
PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) pendingIntent = PendingIntent.getForegroundService(getActivity(),0,intent,0);
else pendingIntent = PendingIntent.getService(getActivity(),0,intent,0);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
assert alarmManager != null;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);
}
WorkService
public class WorkerService extends Service {
AppDatabase database;
@Override
public void onCreate() {
super.onCreate();
database = AppDatabase.getInstance(this);
readSteps();
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
int user_id = database.getUserDao().getSuperUser().id;
Date date = new Date();
String formattedDate = String.valueOf(DateFormat.format("yyyy-MM-dd",date));
float steps = database.getFitnessDao().getDateData(date,user_id).getSteps();
Data data = new Data.Builder()
.putInt("user_id",user_id)
.putString("date",formattedDate)
.putFloat("steps",steps)
.build();
OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(StepWorker.class)
.setConstraints(constraints)
.setInputData(data)
.build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);
}
private void readSteps(){
Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
.readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener(dataSet -> {
int super_user = database.getUserDao().getSuperUser().id;
float total = dataSet.isEmpty() ? 0 : dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
database.getFitnessDao().updateSteps(super_user,total,new Date());
})
.addOnFailureListener(e -> {
});
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
除非您没有从Doze列入白名单,否则什么都不会让您选择确切的时间。这必须由用户而不是应用程序完成。警报和WorkManager均受其影响。如果在应接警报或进行工作时手机已关机,则如果该应用未列入白名单,它将等待下一个“打ze”窗口。
您需要修改服务类WorkerService
才能在后台连续运行它,我已经编辑了您的服务类,使用它