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 met JobInfo.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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow