【问题标题】:Android job scheduler periodic task is not working after sometime or after device restartAndroid作业调度程序定期任务在某个时间或设备重启后不起作用
【发布时间】:2017-01-30 15:00:33
【问题描述】:

我正在尝试使用作业调度程序执行定期任务。我想每 10 秒后调用一次服务,它可以正常工作几个小时,但有时它会停止工作,并且在设备重启后它不起作用。

这是我尝试过的

ComponentName getAlertJobComponent = new ComponentName(context.getPackageName(), GetAlertJobService.class.getName());
JobInfo.Builder getAlertbuilder = new JobInfo.Builder(Constants.getAlertJobid, getAlertJobComponent);
getAlertbuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // require unmetered network
getAlertbuilder.setRequiresDeviceIdle(true); // device should be idle
getAlertbuilder.setPeriodic(10 * 1000);
getAlertbuilder.setRequiresCharging(false); // we don't care if the device is charging or not
JobScheduler getAlertjobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
getAlertjobScheduler.schedule(getAlertbuilder.build());

我的工作服务是

public class GetAlertJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {

        if (!Utility.isServiceRunning(GetAlertService.class, getApplicationContext())) {
            startService(new Intent(getApplicationContext(), GetAlertService.class));
        }
        jobFinished(params, false);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
    }
}

这里的GetAlertService 是调用网络服务的服务

编辑

我也在引导接收器上添加了这个,如下所示

 public class Boot extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                ComponentName getAlertJobComponent = new ComponentName(context.getPackageName(), GetAlertJobService.class.getName());
                JobInfo.Builder getAlertbuilder = new JobInfo.Builder(Constants.getAlertJobid, getAlertJobComponent);
                getAlertbuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // require unmetered network
                getAlertbuilder.setRequiresDeviceIdle(true); // device should be idle
                getAlertbuilder.setPeriodic(10 * 1000);
                getAlertbuilder.setPersisted(true);
                getAlertbuilder.setRequiresCharging(false); // we don't care if the device is charging or not
                JobScheduler getAlertjobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
                getAlertjobScheduler.schedule(getAlertbuilder.build());
            }
        }
    }

在清单中

<receiver
    android:name=".broadcastreceiver.Boot"
    android:enabled="true">

    <intent-filter android:priority="999">
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

【问题讨论】:

    标签: android android-jobscheduler


    【解决方案1】:

    通过在作业生成器上添加setPersisted(true) 解决了重置问题。对于长时间后停止工作-设备是否处于睡眠状态?如果是这样,则可能是打瞌睡问题。

    【讨论】:

    • 是的,设备处于睡眠状态。如果是这样,我该如何克服这个
    • 你不能。 JobScheduler 不会在打瞌睡状态下运行。您可以下拉到 AlarmManager 并使用 setExactAndAllowWhileIdle,但它仍然不允许您像您希望的那样频繁地醒来(IIRC 警报之间的最短时间为 2 分钟,并且您可以在任何 15 分钟内拥有的最大数量期间)。
    • 其实你可以做一件事——你可以要求用户关闭你应用的电池优化。它在我发布的那个链接中。
    • 请检查我的编辑我也在引导接收器中添加了这个,可以吗?
    • @GabeSechan 打盹模式是可以理解的,但在设备唤醒几个小时后,它仍然无法工作
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多