2017-03-25 48 views
0

我正在学习如何使用JobScheduler。如onresume方法中所示,为了执行作业,我设置了要满足的条件,当设备未充电时,将安排作业,不管设备是否空闲,作业将每 7执行秒。如何使用Jobscheduler安排工作

在运行时,USB电缆连接到设备,以便安装应用程序,这意味着设备正在充电,所以在安装应用程序后 作业还没有启动,因为设备正在充电,但我拔掉后,我执行的作业 执行的工作,但发生的事情是,工作从未开始,我不明白为什么

请让我知道为什么这样的行为发生,请让我知道下面的答案问题会帮助我更好地理解 jobScheduler:

问:是setRequiresChargi ng(false)表示只有在设备不充电的情况下才会执行该任务,或者意味着无论设备是否充电,任务都将被执行?

主要活动

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private static int jobId = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.w(TAG, "onCreate"); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.w(TAG, "onResume"); 

    ComponentName serviceComponent = new ComponentName(this, MyJobService.class); 
    JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent); 

    builder.setRequiresCharging(false); 
    builder.setRequiresDeviceIdle(false); 
    builder.setPeriodic(7 * 1000); 

    JobScheduler jobScheduler = (JobScheduler) getApplication().getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    jobScheduler.schedule(builder.build()); 
} 

}

jobService

package example.com.jobscheduler_00; 

public class MyJobService extends JobService { 
private static final String TAG = MyJobService.class.getSimpleName(); 

@Override 
public boolean onStartJob(JobParameters params) { 
    Log.w(TAG, "onStartJob JobId: " + params.getJobId()); 
    Toast.makeText(this, "onStartJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show(); 

    jobFinished(params, false); 
    return true; 
} 

@Override 
public boolean onStopJob(JobParameters params) { 
    Log.w(TAG, "onStopJob"); 
    Toast.makeText(this, "onStopJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show(); 

    return true; 
} 

}

+0

“并且该作业每7秒执行一次” - Android 7.0+的最短时间为15分钟。我不记得Android 5.0-6.0的最低期限,但如果不到一分钟,我会感到惊讶。 – CommonsWare

+0

谢谢先生..但正如你所说的“我不记得在Android 5.0-6.0的最短时间”..有没有其他的选择? – user2121

回答

0

我setRequiresCharging(false)意味着,只有在设备不充电的情况下才会执行该任务,或者意味着无论设备是否在充电,任务都将被执行?

documentation

指定运行此作业时,设备需要被插入此默认为false。

换句话说,如果你希望你的工作只在条件下运行,当设备正在充电 - 你应该通过true。默认情况下,它是false,这意味着收费标准被忽略,即您的工作将被执行,无论设备是否收费或否(假设其他标准得到满足)。

您可以检查您的作业是否已成功启动intJobScheduler.schedule(JobInfo job)返回。它将返回RESULT_SUCCESSRESULT_FAILURE

+1

但你会告诉我为什么拔掉USB电缆后,预定的作业不会马上启动? – user2121

+0

当它发现这是一个方便的时候,系统就会启动你的工作。如果你想要精确,你必须使用AlarmManager。 – azizbekian