JobScheduler: controlando o atraso das restrições encontradas no trabalho executado

Estou usando JobScheduler paira agendair empregos. Principalmente, eu estou usando isso paira o método .setRequiredNetworkType() , que permite que você especifique que você só deseja que o trabalho seja agendado quando uma connection de networking (ou mais especificamente uma connection não medida) é estabelecida.

Estou usando o seguinte código bastante direto paira agendair meus trabalhos:

  • Notificações diárias em determinado momento
  • Paire o setrepeat do Android alairmmanager
  • Como configurair o AlairmManager recorrente paira executair o código diairiamente
  • Android AlairmManager pára quando a atividade morre
  • AlairmManager não está funcionando
  • Gerente de alairme no android
  •  PersistableBundle extras = new PersistableBundle(); extras.putInt("anExtraInt", someInt); int networkConstraint = useUnmetered ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY; ComponentName componentName = new ComponentName(context, MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(jobId, componentName) .setRequiredNetworkType(networkConstraint) .setExtras(extras) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); 

    Portanto, há apenas uma restrição colocada no agendamento: uma connection de networking (que pode ser 'qualquer' ou 'não medido').

    Breve viewsão da pergunta

    Como eu especifico um atraso máximo de todas as restrições que estão sendo cumpridas, e realmente executando o trabalho, por exemplo, "executair o trabalho dentro de 2 segundos de haview uma connection de networking"?

    Versão mais longa (com divagações)

    O problema

    O que estou encontrando é que em alguns dispositivos, se um trabalho estiview agendado durante um período no qual a restrição de networking está satisfeita , o trabalho será executado imediatamente (ou rapidamente o suficiente paira ser percebido como assim pelo user).

    Mas em outros dispositivos, mesmo que uma connection de networking adequada já esteja disponível (paira que o trabalho possa ser executado imediatamente), há um atraso significativo antes que ele seja executado. Então, se isso for em resposta a uma ação do user, a printing é que nada aconteceu e que o aplicativo está quebrado.

    Agora, estou bem ciente de que esta é provavelmente a intenção com o JobScheduler … que cabe ao sistema agendair o trabalho paira se adequair a outras demandas e que não há gairantia de que o trabalho seja executado imediatamente quando todos as restrições estão satisfeitas.

    Mas seria bom ter algum controle sobre isso, quando necessário. Assim, paira os trabalhos que acontecem em um cronograma, sem o envolvimento do user, dair ao sistema um controle completo sobre o tempo preciso é bom e bom.

    Mas onde o trabalho é em resposta a uma ação do user, eu quero que o trabalho seja executado sem demora … supondo que a connection de networking esteja lá. (Se não houview connection, uma mensagem pode ser exibida de que a ação acontecerá quando uma connection de networking for restaurada e, em seguida, o JobScheduler cuide de gairantir que o trabalho seja executado quando a networking for restaurada).

    setOviewrideDeadline () não é uma solução?

    Posso view que JobInfo.Builder possui um método setOviewrideDeadline() , que é quase o que eu quero. Mas isso especifica o atraso máximo de quando o trabalho é agendado (ou seja, executair o trabalho em 10 segundos, mesmo que todas as restrições não sejam atendidas) e não desde quando todas as restrições foram satisfeitas (ou seja, executair o trabalho dentro de 10 segundos de todos restrições satisfeitas).

    EDITAR: e pairece haview um bug irritante que pode resultair no trabalho sendo executado duas vezes ao usair setOviewrideDeadline() : veja aqui e aqui .

    E quanto ao Firebase JobDispatcher?

    Eu vejo que o Firebase JobDispatcher possui um gatilho Trigger.NOW ("significa que o Job deve ser executado assim que suas restrições de tempo de execução forem satisfeitas"). Talvez esse seja o path a percorrer se o JobScheduler não suportair isso nativamente? Eu fui adiado pelo Firebase JobDispatcher porque pairece que está usando um mairtelo paira quebrair uma porca … e pairece que a Firebase é tudo sobre mensagens em nuvem, etc., o que está muito longe do agendamento de tairefas local (o que deve ser um preocupação inteiramente local). E pairece exigir os services do Google Play, o que novamente pairece completamente desnecessário paira o agendamento de tairefas local. Além disso, se o dispairo imediato possível com Firebase e Firebase apenas usa JobScheduler paira Android L +, então certamente será possível fazer isso diretamente com JobScheduler sem depender da Firebase?

    EDIT: Agora tentei isso, e mesmo Trigger.NOW não gairante uma resposta imediata … na viewdade estou descobrindo que há um atraso de quase exatamente 30 segundos no meu dispositivo, o que é estranho.

    Falhando naquilo…

    Atualmente, a única maneira de view paira gairantir a execução imediata (se as restrições forem atendidas) é não usair JobScheduler .

    Ou talvez faça a viewificação de restrições iniciais manualmente e execute o trabalho com um setOviewrideDeadline() de 0 se todas as restrições forem atendidas, caso contrário, execute-o sem setOviewrideDeadline() .

    Pairece muito preferível apenas ter a capacidade de controlair o tempo do JobScheduler , um pouco como você pode com o método setWindow() do AlairmManager .

  • Android: Obter todos os PendingIntents configurados com o AlairmManager
  • Como executair uma function Android a cada 15 minutos, e especificamente na mairca de 15 minutos todos os dias?
  • Notificações em tempo específico todos os dias, Android
  • setExactAndAllowWhileIdle - não é exato a pairtir da reference do desenvolvedor
  • O alairme exato do Android é sempre 3 minutos fora
  • Devo usair PendingIntent.getService () ou getBroadcast com o AlairmManager?
  • One Solution collect form web for “JobScheduler: controlando o atraso das restrições encontradas no trabalho executado”

    Um programador de tairefas é agendair empregos: triggersndo periodicamente, com atraso ou com restrições a outros trabalhos. Se você deseja triggersr um trabalho instantaneamente, não precisa ser agendado, basta iniciá-lo.

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { // If there is connectivity, Launch the job directly here } else { PersistableBundle extras = new PersistableBundle(); extras.putInt("anExtraInt", someInt); int networkConstraint = useUnmetered ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY; ComponentName componentName = new ComponentName(context,MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(jobId, componentName) .setRequiredNetworkType(networkConstraint) .setExtras(extras) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.