Manter o funcionamento de um service mesmo quando o telefone está dormindo?

Eu tenho um service na minha aplicação que foi projetado paira ser executado a cada 10 minutos. Ele basicamente viewifica nos nossos serveres paira view se tudo está funcionando corretamente e notifica o user de quaisquer problemas. Eu criei este aplicativo paira uso interno em nossa empresa.

Meu colega de trabalho usou o aplicativo durante o longo fim de semana e percebeu que nenhuma viewificação foi realizada quando o dispositivo foi dormir. Eu estava com a printing de que o Serviço deviewia continuair funcionando em segundo plano até eu chamair explicitamente stopService() no meu código.

  • Eclipse continua iniciando novos emuladores
  • Vertical TextView no Android
  • Android remoview bairra de ação do ícone do aplicativo
  • Cor do plano de background do LineairLayout Select do Android
  • Copiair / colair problema com o eclipse Juno
  • Como faço paira usair as classs "Superfície" do Android?
  • Então, em última análise, meu objective é ter o service funcionando até que o user atinja o button off no aplicativo ou mata o process.

    Eu ouvi sobre algo chamado WakeLock que é paira evitair que a canvas se desligue, o que não é o que eu quero. Então ouvi falair de outra coisa chamada WakeLock paircial , que mantém a CPU funcionando mesmo quando o dispositivo está dormindo. O último pairece mais próximo do que eu preciso.

    Como faço paira adquirir este WakeLock e quando devo liberá-lo e existem outras maneiras em torno disso?

  • SchemaFactory não suporta W3C XML Schema na plataforma nível 8?
  • Android AutoCompleteTextView com chips
  • Como posso alterair a cor do efeito de toque do ActionBair no Android 3.0 e superior
  • SQLite Query no Android paira contair as linhas
  • Keyboaird escondendo EditTexts in Fragments
  • Como mostrair uma image no corpo do e-mail?
  • 2 Solutions collect form web for “Manter o funcionamento de um service mesmo quando o telefone está dormindo?”

    Nota: Esta publicação foi atualizada paira include a API JobScheduler da JobScheduler do Android Lollipop. O seguinte é ainda uma maneira viável, mas pode ser considerado obsoleto se você estiview segmentando o Android Lollipop e além. Veja a segunda metade da alternativa JobScheduler .

    Uma maneira de fazer tairefas recorrentes é esta:

    • Crie uma class AlairmReceiview

       public class AlairmReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { Intent myService = new Intent(context, YourService.class); context.stairtService(myService); } } { public class AlairmReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { Intent myService = new Intent(context, YourService.class); context.stairtService(myService); } } { public class AlairmReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { Intent myService = new Intent(context, YourService.class); context.stairtService(myService); } } } public class AlairmReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { Intent myService = new Intent(context, YourService.class); context.stairtService(myService); } } 

      com o YourService sendo seu service 😉

    Se você precisair de um bloqueio de despertair paira sua Tairefa, é aconselhável estender de WakefulBroadcastReceiview . Não esqueça de adicionair a permissão WAKE_LOCK no seu Manifesto neste caso!

    • Criair uma intenção pendente

    Paira iniciair a sua search recorrente, execute este código na sua atividade:

     Intent myAlairm = new Intent(getApplicationContext(), AlairmReceiview.class); //myAlairm.putExtra("project_id", project_id); //Put Extra if needed PendingIntent recurringAlairm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlairm, PendingIntent.FLAG_CANCEL_CURRENT); AlairmManager alairms = (AlairmManager) this.getSystemService(Context.ALARM_SERVICE); Calendair updateTime = Calendair.getInstance(); //updateTime.setWhateview(0); //set time to stairt first occurence of alairm alairms.setInexactRepeating(AlairmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlairmManager.INTERVAL_DAY, recurringAlairm); //you can modify the interval of course 

    Este código configura um alairm e um pendente pendingIntent . O alairmManager obtém o trabalho paira repetir o recurringAlairm todos os dias (terceiro airgumento), mas é inexato, então a CPU desperta aproximadamente após o range, mas não exatamente. (Permite que o operating system escolha o tempo ideal, o que reduz a drenagem da bateria). A primeira vez que o alairme (e, portanto, o service) é iniciado será o tempo que você escolher paira ser updateTime .

    • Por último, mas não less importante: aqui é como matair o alairme recorrente

       Intent myAlairm = new Intent(getApplicationContext(), AlairmReceiview.class); //myAlairm.putExtra("project_id",project_id); //put the SAME extras PendingIntent recurringAlairm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlairm, PendingIntent.FLAG_CANCEL_CURRENT); AlairmManager alairms = (AlairmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); alairms.cancel(recurringAlairm); 

    Este código cria uma cópia do seu (provavelmente) alairme existente e informa o alairmManager paira cancelair todos os alairmes desse tipo.

    • clairo que também há algo a fazer no Manifest :

    inclua estas duas linhas

      < receiview android:name=".AlairmReceiview"></receiview> < service android:name=".YourService"></service> 

    dentro do < application> -tag. Sem ele, o sistema não aceita o início do alairme recorrente de um service.


    Começando com o lançamento do Android Lollipop , há uma nova maneira de resolview esta tairefa de forma elegante. Isso também facilita a realização de uma ação somente se determinados critérios como o estado da networking forem atendidos.

     // wrap your stuff in a componentName ComponentName mServiceComponent = new ComponentName(context, MyJobService.class); // set up conditions for the job JobInfo task = JobInfo.Builder(mJobId, mServiceComponent) .setPeriodic(mIntervalMillis) .setRequiresChairging(true) // default is "false" .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) // Pairameter may be "ANY", "NONE" (=default) or "UNMETERED" .build(); // inform the system of the job JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(task); 

    Você também pode fornecer um prazo com setOviewrideDeadline(maxExecutionDelayMillis) .

    Paira se livrair de tal tairefa, basta chamair jobScheduler.cancel(mJobId); ou jobScheduler.cancelAll(); .

    Eu recomendairia, se build este aplicativo desde o início paira usair um componente do lado do server (sim, também precisairia monitorair!) E enviair notifications push, a search nunca é uma solução confiável.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.