2012-05-27 15 views
6

Estoy usando C2DM, mis BroadcastReceivers propagan los eventos C2DM a un servicio local. el servicio completa el registro enviando el id. a mi servidor web; es responsable de informar al dispositivo de los mensajes nuevos; sin embargo, si la aplicación (una de las actividades) está activa, queremos enviar un intento a esa actividad con los nuevos datos, se puede actualizar, si no es así, el NotificationManager se usa para notificar al usuario.Descubriendo si la actividad de Android se está ejecutando

El problema es, ¿cómo saber qué actividad se está ejecutando? el objeto Aplicación no es una opción ya que el Servicio es parte de la aplicación que obviamente va a estar presente. anular el registro en el onDesroy de cada aplicación tampoco es una opción, ya que puede ocurrir en el cambio de orientación ...

¿Alguna forma estándar de hacerlo?

Respuesta

17

Solución 1: Puede utilizar ActivityManager de Comprobación de si la actividad se está ejecutando o no:

public boolean isActivityRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isActivityFound = false; 
    for (int i = 0; i < activitys.size(); i++) { 
     if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) { 
      isActivityFound = true; 
     } 
    } 
    return isActivityFound; 
} 

necesidad de agregar el permiso a su manifiesta ..

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

Solución 2 : Puedes usar una variable estática en tu actividad para la que quieras comprobar si está funcionando o no y almacenarla algunos donde para acceder a su servicio o como receptor de radiodifusión de:

static boolean CurrentlyRunning= false; 
     public void onStart() { 
     CurrentlyRunning= true; //Store status of Activity somewhere like in shared //preference 
     } 
     public void onStop() { 
     CurrentlyRunning= false;//Store status of Activity somewhere like in shared //preference 
     } 

Espero que esto era útil!

+0

el primer método parece interesante, pero quiero saber si se está ejecutando alguna actividad o más si mi aplicación se está ejecutando (servicio excluido) el método estático no es bueno ya que la actividad puede tener más de una instancia. hacer el truco ... – codeScriber

+0

Podría estar equivocado, pero creo que esto solo verifica la actividad principal actual en una tarea. Si es así, ¿qué pasa con las otras actividades (detenidas o detenidas) en la misma tarea? –

+7

NO use el primer método. Desde la documentación de ActivityManager: "Nota: este método solo está destinado a la depuración y presentación de interfaces de usuario de administración de tareas. Esto nunca debería usarse para la lógica central en una aplicación, como decidir entre diferentes comportamientos según la información que se encuentra aquí." – yarian

-1

Copiado de here.

puede usar una variable estática dentro de la actividad.

class MyActivity extends Activity { 
    static boolean active = false; 

     public void onStart() { 
     active = true; 
     } 

     public void onStop() { 
     active = false; 
     } 
} 
+0

encuentra una pareja perfecta en otra pregunta y sus respuestas, no deberías responder aquí, pero marca esta pregunta como duplicada ... –

4

El siguiente enfoque funcionaría bien si desea manejar entrante mensaje de Google Cloud (C2DM) por su actividad (si lo hay en marcha) o emitir una notificación si no hay actividades se están ejecutando.

Registre un BroadcastReceiver en el archivo de manifiesto. Este receptor manejará mensajes C2D siempre que la aplicación no se ejecute. Registre otro BroadcastReceiver programmatically en su actividad. Este receptor manejará mensajes C2D siempre que se esté ejecutando actividad.

AndoroidManifest.xml

<receiver 
    android:name=".StaticReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="com.mypackage" /> 
    </intent-filter> 
</receiver> 

MyReceiver.java

public class StaticReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Trigger a Notification 
    } 
} 

MyActivity.java

public class MyActivity extends ActionBarActivity { 

    @Override 
    protected void onResume() { 
    super.onResume(); 

     final IntentFilter filter = new 
       IntentFilter("com.google.android.c2dm.intent.RECEIVE"); 
     filter.addCategory("com.mypackage"); 
     filter.setPriority(1); 
     registerReceiver(dynamicReceiver, filter, 
       "com.google.android.c2dm.permission.SEND", null); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(dynamicReceiver); 
    } 

    private final BroadcastReceiver dynamicReceiver 
      = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      // TODO Handle C2DM 

      // blocks passing broadcast to StaticReceiver instance 
      abortBroadcast(); 
     } 
    }; 
} 

Nota! Para captar primero las transmisiones, la prioridad de dynamicReceiver IntentFilter debe ser mayor que la prioridad de la instancia de StaticReceiver IntentFilter (la prioridad predeterminada es '0').

PS. Parece que las transmisiones emitidas por el servicio de mensajería en la nube de Google son transmisiones ordenadas.Autor original idea: CommonsWare

1

manera más fácil de controlar que si una actividad está funcionando o no, es:

Context context = MyActivity.this; 

if (! ((Activity) context).isFinishing()) { 
    // Activity is running 
} else { 
    // Activity has been finished 
} 

Nota: Si la actividad no se está ejecutando no debe realizar ninguna operación relacionada con la interfaz de usuario.

Cuestiones relacionadas