|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Problema con servicio
Hola a todos y gracias de antemano a todos aquellos que puedan ayudarme a resolver mis dudas. Llevo muy poco tiempo desarrollando (o intentandolo) aplicaciones en android y estos días probando diferentes cosas me he encontrado con el siguiente problema:
He creado una activity que simplemente al pulsar un botón lanza un service el cual por medio de geolocalización me proporciona las coordenadas de latitud y longitud para almacenarlas en una base de datos. En principio todo funciona correctamente. Arranca la activity y al pulsar el botón para lanzar el servicio aparece en la barra de notificaciones el icono de uso del GPS, el servicio captura las coordenadas y se guardan en una base de datos. Si salgo de la activity y compruebo en mi dispositivo las aplicaciones que estan en ejecución puedo ver que mi aplicación está ejecutando un proceso y un servicio. El problema surge al ejecutar una aplicación para liberar memoria tipo "Clean Master", en ese momento el icono de GPS de la barra de notificaciones desaparece y el servicio deja de capturar coordenadas, como es normal. Al dirigirme nuevamente a las aplicaciones en ejecución de mi dispositivo veo que mi aplicación ahora está ejecutando cero procesos y un servicio. La pregunta es obvia, ¿Que puedo hacer para evitar esto?. este es el código que utilizo: Servicio: public class mServicio extends Service { private LocationManager mLocManager; private LocationListener mLocListener; public mServicio() { Log.v("krt", "mServicio-> Constructor"); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.v("krt", "mServicio-> onCreate"); mLocManager= (LocationManager)getSystemService(LOCATION_SERVICE ); mLocListener= new LocationListener() { @Override public void onLocationChanged(Location location) { //Obtengo las coordenadas y las almaceno en la bd } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; mLocManager.requestLocationUpdates(LocationManager .GPS_PROVIDER, 10000, 0, mLocListener, Looper.getMainLooper()); } @Override public void onDestroy() { super.onDestroy(); Log.v("krt", "mServicio-> onDestroy"); mLocManager.removeUpdates(mLocListener); } } Actividad Principal: public class MainAct extends Activity { private Intent mServicio; private Button btnIniciarServicio; public MainAct() { Log.v("krt", "MainAct-> Constructor"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v("krt", "MainAct-> onCreate"); setContentView(R.layout.main); IniciarVariables(); } @Override protected void onStart() { super.onStart(); Log.v("krt", "MainAct-> onStart"); } @Override protected void onRestart() { super.onRestart(); Log.v("krt", "MainAct-> onReStart"); } @Override protected void onResume() { super.onResume(); Log.v("krt", "MainAct-> onResume"); } @Override protected void onPause() { super.onPause(); Log.v("krt", "MainAct-> onPause"); } @Override protected void onStop() { super.onStop(); Log.v("krt", "MainAct-> onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.v("krt", "mainAct-> OnDestroy"); } public void IniciarVariables(){ btnIniciarServicio= (Button) findViewById(R.id.btnIniciarServicio); btnIniciarServicio.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mServicio= new Intent (getApplicationContext(), mServicio.class); startService(mServicio); } }); } } Pd: También he intentado ejecutar el servicio en un hilo aparte con idénticos resultados. |
|
|
|
#2
|
||||
|
||||
|
Tienes que sobreescribir onStartCommand en el servicio y devolver START_STICKY o START_REDELIVER_INTENT, dependiendo de lo que necesites, en tu caso con START_STICKY será suficiente:
public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); return START_STICKY; } De todas formas te recuerdo que mientras el dispositivo esté en modo suspensión (pantalla apagada) tu servicio no va a funcionar. |