Android
Jobbplanering
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återJobInfo.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.