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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow