后台服务未运行可能是因为打ze模式

问题描述 投票:0回答:2

我想在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;
}
}
android service android-service android-workmanager
2个回答
0
投票

除非您没有从Doze列入白名单,否则什么都不会让您选择确切的时间。这必须由用户而不是应用程序完成。警报和WorkManager均受其影响。如果在应接警报或进行工作时手机已关机,则如果该应用未列入白名单,它将等待下一个“打ze”窗口。


0
投票

您需要修改服务类WorkerService才能在后台连续运行它,我已经编辑了您的服务类,使用它

© www.soinside.com 2019 - 2024. All rights reserved.