Manter o aplicativo sendo executado em segundo plano no Android o tempo todo

Eu tenho que pegar a trajetória das pessoas (de casa para o trabalho, por exemplo), então meu aplicativo recebe latitude e longitude (eu tenho dois botões: 1. Comece a ter lat e lon 2. Pare para obter lat e lon). No entanto, eu quero que o Android não mata o aplicativo, eu quero manter meu aplicativo em execução enquanto o usuário usa facebook, twitter (por exemplo) ou simplesmente o usuário bloqueia seu smartphone. Meu aplicativo funciona bem quando o usuário usa o aplicativo ao usar o Facebook ou o Twitter (por exemplo), mas quando eu bloqueio meu smartphone, o Android mata o aplicativo. Eu tentei usar intentservice e service, mas eles não funcionam quando eu bloqueio a canvas. Devo usar o PowerManager.WakeLock? Eu não sei exatamente como funciona e o que faz.

Este é um exemplo que fiz para experimentar serviços, não sei se estou errado, mas não funciona quando: 1. Estou no aplicativo (iniciei o serviço) 2. Toque no botão home (enquanto serviço está sendo executado) 3. Eu bloqueio a canvas. 4. Em seguida, o serviço e o aplicativo são mortos por android (e o serviço não terminou de fazer suas coisas)

Manifesto

            

activity_main

   

Layout

Atividade principal

 package com.javosoft.intentservice; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, MyService.class); startService(intent); } }); } public void stopService (View view){ Intent intent = new Intent(this, MyService.class); stopService(intent); } } 

Classe do serviço

 package com.javosoft.intentservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; public class MyService extends Service { final class MyThreadClass implements Runnable{ int service_id; MyThreadClass(int service_id){ this.service_id = service_id; } @Override public void run() { synchronized (this){ int count = 0; while (count < 10){ Log.i("servicio", "while: " + String.valueOf(count)); try { wait(2000); count++; } catch (InterruptedException e) { e.printStackTrace(); } } } stopSelf(service_id); } } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "El servició ha empezado D:", Toast.LENGTH_SHORT).show(); Log.i("servicio", "El servició ha empezado D:"); Log.i("servicio", "onStartCommand arriba"); Thread thread = new Thread(new MyThreadClass(startId)); thread.start(); Log.i("servicio", "onStartCommand abajo"); return START_STICKY; //return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { //super.onDestroy(); Toast.makeText(this, "El servicio ha padarado ._.", Toast.LENGTH_SHORT).show(); Log.i("servicio", "El servicio ha padarado ._."); } //@Nullable @Override public IBinder onBind(Intent intent) { return null; } } 

Experimente o nosso presente

 public class ForegroundService extends Service { private static final String LOG_TAG = "ForegroundService"; @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Your logical code here return START_STICKY; } @Override public void onTaskRemoved(Intent rootIntent) { //When remove app from background then start it again startService(new Intent(this, ForegroundService.class)); super.onTaskRemoved(rootIntent); } @Override public void onDestroy() { super.onDestroy(); Log.i(LOG_TAG, "In onDestroy"); } @Override public IBinder onBind(Intent intent) { // Used only in case of bound services. return null; } } 

No botão Iniciar, clique em:

 Intent startIntent = new Intent(MainActivity.this, ForegroundService.class); startService(startIntent); 

No manifesto

  

Como diz @Gudin, parece que você parou o serviço depois de 20 segundos. No entanto, como você diz que isso funciona às vezes, imagino que seja apenas um código de teste. Eu suspeito que seu problema está em como você inicia o serviço. Passar o contexto da Atividade significa que seu Serviço está vinculado ao ciclo de vida dessa Atividade. Se isso for destruído, acho que o seu serviço vai com isso. (Simplesmente passando por onStop() da atividade e não onDestroy() deixa o serviço intacto). Tente isso

  Intent intent = new Intent(getApplicationContext(), MyService.class); 

Eu tentei duplicar seu problema, mas não pude, então não posso dizer com certeza que esse é o seu problema. Este é um bom lugar para começar embora.

Eu li que alguns smartphones têm esse tipo de problema, descobri que a Huawei, Xiaomi entre outros tem problemas com os serviços de implementação, e adivinhem: Meu smartphone é um Huawei. O problema vem de programas pré-instalados nesses dispositivos para economia de energia. Por isso, tentei executar meu programa em um Nexus (simulador para este), um Sony e um Moto G, o programa rodou bem para esses 3 dispositivos. Obrigado por ajuda.