Sök…


Anmärkningar

Se upp för att köra massor av kod eller göra tungt arbete i din JobService , till exempel i onStartJob() . Koden körs på huvud- / UI- tråden och kan därför leda till ett blockerat användargränssnitt, inte längre svara app eller ens en krasch av din app!

Därför måste du ladda ner arbetet, till exempel genom att använda en Thread eller AsyncTask .

Grundläggande användning

Skapa en ny JobService

Detta görs genom att utöka klassen JobService och implementera / åsidosätta de nödvändiga metoderna onStartJob() och onStopJob() .

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;
    }
}

Lägg till den nya JobService till din AndroidManifest.xml

Följande steg är obligatoriskt , annars kan du inte köra ditt jobb:

Förklara din MyJobService klass som ett nytt <service> -element mellan <application> </application> i din 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>

Ställ in och kör jobbet

När du har implementerat en ny JobService och lagt till den i din AndroidManifest.xml kan du fortsätta med de sista stegen.

  • onButtonClick_startJob() förbereder och kör ett periodiskt jobb. Förutom periodiska jobb tillåter JobInfo.Builder att ange många andra inställningar och begränsningar. Du kan till exempel definiera att en ansluten laddare eller en nätverksanslutning krävs för att köra jobbet.
  • onButtonClick_stopJob() avbryter alla löpande jobb
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
    }
}

Efter att ha ringt onButtonClick_startJob() , kommer jobbet ungefär att köras i intervaller på 10 sekunder, även när appen är i pausläge (användartryckt hemknapp och appen är inte längre synlig).

Istället för att avbryta alla pågående jobb i onButtonClick_stopJob() kan du också ringa jobScheduler.cancel() att avbryta ett specifikt jobb baserat på dets jobb-ID.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow