Android
Taakplanning
Zoeken…
Opmerkingen
Pas op voor het uitvoeren van veel code of zwaar werk in uw JobService
, bijvoorbeeld in onStartJob()
. De code wordt uitgevoerd op de hoofdthread / UI- thread en kan daarom leiden tot een geblokkeerde UI, niet langer reagerende app of zelfs een crash van uw app!
Daarom moet u het werk ontladen, bijvoorbeeld door een Thread
of AsyncTask
.
Basis gebruik
Maak een nieuwe JobService
Dit wordt gedaan door de JobService
klasse uit te breiden en de vereiste methoden onStartJob()
en onStopJob()
implementeren / overschrijven.
public class MyJobService extends JobService
{
final String TAG = getClass().getSimpleName();
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.i(TAG, "Job started");
// ... your code here ...
jobFinished(jobParameters, false); // signal that we're done and don't want to reschedule the job
return false; // finished: no more work to be done
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.w(TAG, "Job stopped");
return false;
}
}
Voeg de nieuwe JobService toe aan uw AndroidManifest.xml
De volgende stap is verplicht , anders kunt u uw taak niet uitvoeren:
Verklaar uw MyJobService
klasse als een nieuw <service>
-element tussen <application> </application>
in uw AndroidManifest.xml .
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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=".MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
De taak instellen en uitvoeren
Nadat u een nieuwe JobService hebt geïmplementeerd en aan uw AndroidManifest.xml hebt toegevoegd, kunt u doorgaan met de laatste stappen.
-
onButtonClick_startJob()
bereidt een periodieke taak voor en voert deze uit. Naast periodieke taken kunt u metJobInfo.Builder
vele andere instellingen en beperkingen opgeven. U kunt bijvoorbeeld definiëren dat een oplader of een netwerkverbinding nodig is om de taak uit te voeren. -
onButtonClick_stopJob()
annuleert alle lopende taken
public class MainActivity extends AppCompatActivity
{
final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onButtonClick_startJob(View v) {
// get the jobScheduler instance from current context
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
// MyJobService provides the implementation for the job
ComponentName jobService = new ComponentName(getApplicationContext(), MyJobService.class);
// define that the job will run periodically in intervals of 10 seconds
JobInfo jobInfo = new JobInfo.Builder(1, jobService).setPeriodic(10 * 1000).build();
// schedule/start the job
int result = jobScheduler.schedule(jobInfo);
if (result == JobScheduler.RESULT_SUCCESS)
Log.d(TAG, "Successfully scheduled job: " + result);
else
Log.e(TAG, "RESULT_FAILURE: " + result);
}
public void onButtonClick_stopJob(View v) {
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
Log.d(TAG, "Stopping all jobs...");
jobScheduler.cancelAll(); // cancel all potentially running jobs
}
}
Nadat onButtonClick_startJob()
, wordt de taak ongeveer met intervallen van 10 seconden uitgevoerd, zelfs als de app in de pauzestand staat (de gebruiker heeft op de startknop gedrukt en de app is niet meer zichtbaar).
In plaats van alle lopende taken binnen onButtonClick_stopJob()
te annuleren, kunt u ook jobScheduler.cancel()
aanroepen om een specifieke taak te annuleren op basis van de taak-ID.