2012-05-02 19 views
24

Estoy trabajando en una aplicación que transmitirá información sobre su ubicación a un servidor remoto. Tengo la intención de hacerlo haciendo una simple publicación HTTP en el servidor web y todo es simple y correcto.Android - Servicio de Antecedentes Periódicos - Asesoramiento

Pero de acuerdo con la especificación, la aplicación debe ejecutarse de vez en cuando, digamos una vez cada 30 minutos. Sea independiente de la interfaz, lo que significa que debe ejecutarse incluso si la aplicación está cerrada.

Miré a mi alrededor y descubrí que los servicios de Android son los que se deben usar. ¿Qué podría usar para implementar dicho sistema? ¿Se reiniciará el servicio (u otro mecanismo) cuando se reinicie el teléfono?

Gracias de antemano.

Respuesta

28

Cree un Service para enviar su información a su servidor. Presumiblemente, lo tienes bajo control.

Su Service debe iniciarse con una alarma activada por AlarmManager, donde puede especificar un intervalo. A menos que tenga que informar sus datos exactamente cada 30 minutos, es probable que desee la alarma inexacta para que pueda ahorrar algo de batería.

Por último, puede registrar su aplicación para obtener la emisión de arranque mediante la creación de un BroadcastReceiver así:

public class BootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
      // Register your reporting alarms here.    
     } 
    } 
} 

Usted tendrá que añadir el siguiente permiso a su AndroidManifest.xml para que esto funcione. No olvide registrar sus alarmas cuando ejecuta la aplicación normalmente, o solo se registrarán cuando el dispositivo se inicie.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
0

Puede usar Alarm Manager para iniciar el Servicio a la hora especificada y luego repetir la alarma en el intervalo especificado. Cuando la alarma se enciende puede iniciar el servicio y conectarse al servidor y hacer lo que desee

6

Debe programar su servicio con gestor de alarma, en primer lugar crear la intención pendientes de servicio:

Intent ii = new Intent(getApplicationContext(), MyService.class); 
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii, 
PendingIntent.FLAG_CANCEL_CURRENT); 

Entonces programarlo mediante el administrador de alarma:

//getting current time and add 5 seconds to it 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.SECOND, 5); 
//registering our pending intent with alarmmanager 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi); 

Esto iniciará su servicio después de 5 segundos de la hora actual. Puedes hacer que tu alarma se repita.

+0

probablemente más fácil de hacer algo como 'Sistema .currentTimeMillis() + TIMEOUT_MS' que rebuscar con el 'Calendario', para obtener su retraso inicial. –

+4

Ustedes saben que tienen valores estáticos en el AlarmManager por 1 día, 12 horas, 1 hora, media hora y 15 minutos? 'public static final de INTERVAL_DAY' largo ' pública INTERVAL_FIFTEEN_MINUTES' largo static final 'pública INTERVAL_HALF_DAY' largo static final ' pública INTERVAL_HALF_HOUR' static final largo 'pública INTERVAL_HOUR' largo static final – DaMachk

11

Aquí hay una forma semi-diferente de mantener el servicio en funcionamiento para siempre. Hay maneras de matar en el código si lo desea

servicio en segundo plano:

package com.ex.ample; 

import android.app.Service; 
import android.content.*; 
import android.os.*; 
import android.widget.Toast; 

public class BackgroundService extends Service { 

    public Context context = this; 
    public Handler handler = null; 
    public static Runnable runnable = null; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show(); 

     handler = new Handler(); 
     runnable = new Runnable() { 
      public void run() { 
       Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show(); 
       handler.postDelayed(runnable, 10000); 
      } 
     }; 

     handler.postDelayed(runnable, 15000); 
    } 

    @Override 
    public void onDestroy() { 
     /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */ 
     //handler.removeCallbacks(runnable); 
     Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show(); 
    } 
} 

Así es como se inicia desde su actividad principal o dondequiera que usted desee:

startService(new Intent(this, BackgroundService.class)); 

onDestroy() se llamará cuando la aplicación se cierre o muera, pero el ejecutable simplemente lo inicia de nuevo.

Espero que esto ayude a alguien.

La razón por la que algunas personas hacen esto es debido a las aplicaciones corporativas, donde en algunos casos los usuarios/empleados no deben ser capaces de dejar ciertas cosas :)

http://i.imgur.com/1vCnYJW.png

+1

buena solución, pero esto mantendrá a partir de la controlador después de un tiempo, ya que el servicio comenzará de nuevo después de un tiempo. – Dev

+1

Para evitar el reinicio mover el código de onCreate() para @ Override public int onStartCommand (intención Intención, int banderas, int startID) {// código ejecutable para retorno START_NOT_STICKY; } return START_NOT_STICKY se asegurará de que el servicio no se reinicie y su controlador permanecerá detenido después de onDestroyed(). – Dev

+1

No olvide agregar el servicio a su 'AndroidManifest.xml':' '. –