Android
Arbeit planen
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. MitJobInfo.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.