Suche…


Bemerkungen

Hüten Sie sich vor dem Ausführen von viel Code oder dem Ausführen schwerer Arbeit in Ihrem JobService , beispielsweise in onStartJob() . Der Code wird auf dem Haupt- / UI- Thread ausgeführt und kann daher zu einer blockierten Benutzeroberfläche, nicht mehr reagierenden Apps oder sogar zum Absturz Ihrer App führen!

Aus diesem Grund müssen Sie die Arbeit AsyncTask , z. B. mithilfe eines Thread oder einer AsyncTask .

Grundlegende Verwendung

Erstellen Sie einen neuen JobService

Dies erfolgt durch Erweitern der JobService Klasse und Implementieren / Überschreiben der erforderlichen Methoden onStartJob() und 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;
    }
}

Fügen Sie den neuen JobService Ihrer AndroidManifest.xml hinzu

Der folgende Schritt ist obligatorisch , andernfalls können Sie Ihren Job nicht ausführen:

Deklarieren Sie Ihre MyJobService Klasse als neues <service> -Element zwischen <application> </application> in Ihrer 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>

Richten Sie den Job ein und führen Sie ihn aus

Nachdem Sie einen neuen JobService implementiert und zu Ihrer AndroidManifest.xml hinzugefügt haben , können Sie mit den letzten Schritten fortfahren.

  • onButtonClick_startJob() bereitet einen periodischen Job vor und führt ihn aus. Mit JobInfo.Builder können neben periodischen Jobs viele andere Einstellungen und Einschränkungen festgelegt werden. Sie können beispielsweise festlegen, dass ein angeschlossenes Ladegerät oder eine Netzwerkverbindung erforderlich ist, um den Job auszuführen.
  • onButtonClick_stopJob() bricht alle laufenden Jobs ab
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
    }
}

Nach dem Aufruf von onButtonClick_startJob() wird der Job ungefähr in Intervallen von 10 Sekunden ausgeführt, auch wenn sich die App im angehaltenen Status befindet (der Benutzer hat die Home-Taste gedrückt und die App ist nicht mehr sichtbar).

Anstatt alle laufenden Jobs in onButtonClick_stopJob() , können Sie auch jobScheduler.cancel() aufrufen, um einen bestimmten Job basierend auf seiner Job-ID abzubrechen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow