【发布时间】:2020-03-13 04:59:01
【问题描述】:
我想在晚上 11:59 准确地在服务器上上传一些数据。在这个时候我想收集数据,只要互联网可用,它就应该上传数据。首选是使用WorkManager 但是,我无法将其设置为准确的时间。对于确切的时间,我们必须使用AlarmManager,并且我们必须为互联网实现我们自己的逻辑或广播接收器。
所以,我正在使用 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);
}
工作服务
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;
}
}
【问题讨论】:
标签: android service android-service android-workmanager