Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WorkManager - O que é? como usar?

WorkManager - O que é? como usar?

Nesta palestra falei sobre como usar o WorkManager, uma nova API do Android Jetpack para trabalhos assincronos em background.

Avatar for Haldny Santos

Haldny Santos

August 26, 2018
Tweet

More Decks by Haldny Santos

Other Decks in Programming

Transcript

  1. Agenda › Entendendo o porque do WorkManager › Usando o

    WorkManager › Definindo as Restrições(Constraints) › Encadeando Tarefas 3
  2. ➔ Fazer upload de vídeos e fotos ➔ Processar arquivos

    ➔ Sincronizar dados ➔ Fazer download de podcasts ➔ etc... Podemos fazer vários processos em background em nossos apps 5
  3. ➔ Threads ➔ Executors ➔ Services ➔ AsyncTasks ➔ Handlers

    e Loopers E o Android nos fornece vários meios para fazer processos em background 6 ➔ Jobs (API 21+) ➔ GCMNetworkManager ➔ SyncAdapters ➔ Loaders ➔ AlarmManager
  4. ➔ Doze mode (Marshmallow) ➔ App standby (Marshmallow) ➔ Limited

    Implicit broadcasts (Nougat) ➔ Release cached wakelocks (Oreo) ➔ Background service limitations (Oreo) ➔ App standby buckets (Pie) ➔ Background restricted apps (Pie) Otimização de bateria no Android 7
  5. ➔ Então, teremos sempre que criar a nossa lógica para

    a execução dos jobs, como no exemplo abaixo: if (Build.VERSION.SDK_INT >= 23) { // Usar JobScheduler } else { // Usar JobDispatcher ou AlarmManager } JobScheduler (API 23+) 13
  6. ➔ O início do alarme a partir da API 19

    (Build.VERSION_CODES.KITKAT) é inexato: o sistema operacional mudará os alarmes para minimizar os wakeups e o uso da bateria. AlarmManager (API 1+) 17
  7. “O WorkManager tem como objetivo simplificar a experiência do desenvolvedor,

    fornecendo uma APIs de fácil entendimento para o processamento em segundo plano pelo sistema. Ele é destinado a trabalhos em segundo plano que devem ser executados mesmo se o aplicativo não estiver mais em primeiro plano. Sempre que possível, ele usa o JobScheduler ou o Firebase JobDispatcher para fazer o trabalho; Se o seu aplicativo estiver em primeiro plano, ele tentará fazer o trabalho diretamente no seu processo.” 20 https://developer.android.com/reference/androidx/work/WorkManager
  8. “WorkManager é uma biblioteca usada para enfileirar/executar trabalhos assíncronos.” “WorkManager

    garante a execução quando as restrições são atendidas, mesmo que o sistema seja reiniciado.” 21 https://developer.android.com/reference/androidx/work/WorkManager
  9. “WorkManager permite a observação do status do trabalho e tem

    a capacidade de criar cadeias de trabalho complexas.” 22 https://developer.android.com/reference/androidx/work/WorkManager
  10. “É uma biblioteca que facilita a especificação de tarefas assíncronas,

    levando em consideração a periodicidade e condições em que as tarefas serão executadas. Usando algumas APIs, podemos criar uma tarefa e entregá-la ao WorkManager para execução imediata ou no momento apropriado.” 23 https://medium.com/android-dev-br/workmanager-o-que-%C3%A9-com o-usar-26f5b800984e
  11. ➔ Garantia de execução sempre que as restrições forem atendidas

    ➔ Retrocompatibilidade com e sem Google Play Services ➔ Consultável ➔ Encadeável ➔ Oportunista Features do WorkManager 24
  12. ➔ Worker ➔ Data ➔ Worker.Result ➔ SUCCESS ➔ RETRY

    ➔ FAILURE O que precisamos saber para criar um trabalho? 27
  13. class DownloadWorker(appContext: Context, workParams: WorkerParameters) : Worker(appContext, workParams) { override

    fun doWork(): Result { val url = inputData.getString(KEY_URL) if (URLUtil.isValidUrl(url)) { val downloadFile = startDownloadFile(url) outputData = Data.Builder().putString(KEY_DOWNLOAD_FILE, downloadFile?.absolutePath).build() return Result.SUCCESS } return Result.FAILURE } } Exemplo 28
  14. public void setPeriodic(long intervalDuration) { if (intervalDuration < MIN_PERIODIC_INTERVAL_MILLIS) {

    Logger.warning(TAG, String.format( "Interval duration lesser than minimum allowed value; Changed to %s", MIN_PERIODIC_INTERVAL_MILLIS)); intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS; } setPeriodic(intervalDuration, intervalDuration); } PeriodicWorkRequest intervalo mínimo 31
  15. manager.getStatusByIdLiveData(periodicDownload.id).observe(this, Observer { if (it?.state.isFinished) { Toast.makeText(this, "Download finished.", Toast.LENGTH_LONG).show()

    } }) manager.getStatusByIdLiveData(periodicDownload.id).observe(this, Observer { if (it?.state == State.ENQUEUED) { Toast.makeText(this, "Download enqueued.", Toast.LENGTH_LONG).show() } }) Observando o trabalho 33
  16. ➔ WorkerStatus ➔ ENQUEUED ➔ RUNNING ➔ SUCCEEDED ➔ FAILED

    ➔ BLOCKED ➔ CANCELLED Quais os estados do trabalho? 34
  17. static @NonNull Scheduler createBestAvailableBackgroundScheduler( @NonNull Context context, @NonNull WorkManagerImpl workManager)

    { Scheduler scheduler; boolean enableFirebaseJobService = false; boolean enableSystemAlarmService = false; if (Build.VERSION.SDK_INT >= WorkManagerImpl.MIN_JOB_SCHEDULER_API_LEVEL) { scheduler = new SystemJobScheduler(context, workManager); setComponentEnabled(context, SystemJobService.class, true); Logger.debug(TAG, "Created SystemJobScheduler and enabled SystemJobService"); } Como o WorkManager escolhe em qual componente vai executar? 36
  18. } else { try { scheduler = tryCreateFirebaseJobScheduler(context); enableFirebaseJobService =

    true; Logger.debug(TAG, "Created FirebaseJobScheduler"); } catch (Exception e) { scheduler = new SystemAlarmScheduler(context); enableSystemAlarmService = true; Logger.debug(TAG, "Created SystemAlarmScheduler"); } } } Como o WorkManager escolhe em qual componente vai executar? 37
  19. try { Class firebaseJobServiceClass = Class.forName(FIREBASE_JOB_SERVICE_CLASSNAME); setComponentEnabled(context, firebaseJobServiceClass, enableFirebaseJobService); }

    catch (ClassNotFoundException e) {} setComponentEnabled(context, SystemAlarmService.class, enableSystemAlarmService); return scheduler; } Como o WorkManager escolhe em qual componente vai executar? 38
  20. public @NonNull Builder setRequiresCharging(boolean requiresCharging) { this.mRequiresCharging = requiresCharging; return

    this; } public @NonNull Builder setRequiredNetworkType(@NonNull NetworkType networkType) { this.mRequiredNetworkType = networkType; return this; } Existem restrições aplicáveis a todas as versões do Android 41
  21. public @NonNull Builder setRequiresBatteryNotLow(boolean requiresBatteryNotLow) { this.mRequiresBatteryNotLow = requiresBatteryNotLow; return

    this; } public @NonNull Builder setRequiresStorageNotLow(boolean requiresStorageNotLow) { this.mRequiresStorageNotLow = requiresStorageNotLow; return this; } Existem restrições aplicáveis a todas as versões do Android 42
  22. @RequiresApi(23) public @NonNull Builder setRequiresDeviceIdle(boolean requiresDeviceIdle) { this.mRequiresDeviceIdle = requiresDeviceIdle;

    return this; } @RequiresApi(24) public @NonNull Builder addContentUriTrigger(Uri uri, boolean triggerForDescendants) { mContentUriTriggers.add(uri, triggerForDescendants); return this; } E outras que apenas são usadas a partir de uma determinada versão do Android 43
  23. E se agora precisássemos notificar o usuário e enviar um

    e-mail após validar? 47 Baixar Descomprimir Validar Enviar Email Notificar
  24. val chain1 = WorkManager.getInstance().beginWith(workA).then(workB) val chain2 = WorkManager.getInstance().beginWith(workC).then(workD) val chain3

    = WorkContinuation.combine(chain1, chain2).then(workE) chain3.enqueue() E também é possível criar sequências complexas 49
  25. ➔ Enviar mídias pro servidor ➔ Fazer download de arquivos

    e salvar os dados no banco de dados ➔ Fazer processamentos que não dependem na UI Quando devemos utilizar o WorkManager? 50
  26. ➔ Fazer download dos dados e atualizar a View (Use

    ThreadPools ou RX) ➔ Extrair a cor da paleta e atualizar um ImageView (Use ThreadPools ou RX) ➔ Fazer transações de pagamentos (Use ForegroundService) Quando não devemos utilizar o WorkManager? 51
  27. ➔ https://developer.android.com/topic/libraries/architecture/work manager/ ➔ https://medium.com/android-dev-br/workmanager-o-que-%C3% A9-como-usar-26f5b800984e ➔ https://www.bignerdranch.com/blog/doing-work-with-androids- new-work-manager/ ➔

    https://www.androidauthority.com/schedule-background-tasks- jetpacks-workmanager-874189/ ➔ https://www.raywenderlich.com/6040-workmanager-tutorial-for- android-getting-startedhttps://github.com/googlecodelabs/andr oid-workmanager ➔ https://github.com/googlecodelabs/android-workmanager Referências 53