Android
Programación de trabajos
Buscar..
Observaciones
Tenga cuidado con ejecutar un montón de código o hacer un trabajo pesado dentro de su JobService
, por ejemplo en onStartJob()
. El código se ejecutará en el subproceso principal / UI y, por lo tanto, puede llevar a una IU bloqueada, que ya no responda a la aplicación o incluso a que se bloquee la aplicación.
Debido a eso, debe descargar el trabajo, por ejemplo, utilizando un Thread
o AsyncTask
.
Uso básico
Crear un nuevo servicio de empleo
Esto se hace extendiendo la clase JobService
e implementando / reemplazando los métodos requeridos en onStartJob()
y 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;
}
}
Agregue el nuevo servicio de trabajo a su AndroidManifest.xml
El siguiente paso es obligatorio , de lo contrario no podrá ejecutar su trabajo:
Declare su clase MyJobService
como un nuevo elemento <service>
entre <application> </application>
en su 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>
Configura y ejecuta el trabajo
Después de implementar un nuevo JobService y agregarlo a su AndroidManifest.xml , puede continuar con los pasos finales.
-
onButtonClick_startJob()
prepara y ejecuta un trabajo periódico. Además de los trabajos periódicos,JobInfo.Builder
permite especificar muchas otras configuraciones y restricciones. Por ejemplo, puede definir que se requiere un cargador enchufado o una conexión de red para ejecutar el trabajo. -
onButtonClick_stopJob()
cancela todos los trabajos en ejecución
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
}
}
Después de llamar a onButtonClick_startJob()
, el trabajo se ejecutará aproximadamente en intervalos de 10 segundos, incluso cuando la aplicación se encuentre en estado de pausa (el botón de inicio presionado por el usuario ya no está visible).
En lugar de cancelar todos los trabajos en onButtonClick_stopJob()
dentro de onButtonClick_stopJob()
, también puede llamar a jobScheduler.cancel()
para cancelar un trabajo específico en función de su ID de trabajo.