在屏幕锁定的情况下运行应用程序时,JobScheduler作业无法启动

时间:2017-12-15 15:17:07

标签: java android multithreading http job-scheduling

我一直在努力制作一款适用于Android中打瞌睡功能的应用,但我遇到的问题是,当手机(Android 6)屏幕最近被锁定时,我运行应用程序Android Studio,这项工作永远不会被执行。阅读完文档后看到这个Doze数字: enter image description here 我希望有一个时间窗口来发出HTTP请求来更新我的应用程序,但我已经等了至少15分钟而且从未发生过。

正在onCreate方法中创建和安排作业,如下所示:

ComponentName componentName =
    new ComponentName(getApplicationContext(), ConnectJobService.class);
jobInfo = new JobInfo.Builder(33, componentName)
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
    .build();
int resultCode = jobScheduler.schedule(jobInfo); //resultCode == JobScheduler.RESULT_SUCCESS > true

这是我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xg.frequencytester">

    <application
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat" >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".ConnectJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            />
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

1 个答案:

答案 0 :(得分:0)

在Android 6上,您关闭屏幕时不会进入打盹模式,而是after an unspecified amount of time

  

如果用户将设备拔出并静止一段时间,屏幕关闭,设备将进入打盹模式。

因此,我怀疑这不是问题所在。一个可能的选择可能是在屏幕关闭几秒后CPU进入低功耗模式会影响JobScheduler。 (相关:Keeping the Device Awake

根据我的经验,即使在设备未锁定的情况下安排任务并且屏幕开启可能会延迟几秒钟,因此您遇到的情况也可能类似于此。

我会尝试使用退避和截止日期。请注意,默认退避策略为指数

ComponentName componentName =
    new ComponentName(getApplicationContext(), ConnectJobService.class);
jobInfo = new JobInfo.Builder(33, componentName)
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
    .setOverrideDeadline(5000L)
    .setBackoffCriteria(500L, JobInfo.BACKOFF_POLICY_LINEAR)
    .build();
int resultCode = jobScheduler.schedule(jobInfo); //resultCode == JobScheduler.RESULT_SUCCESS > true

请注意,default initial backoff为30000毫秒,maximum为18000000毫秒( 5小时!)。