Descubriendo si la actividad de Android se está ejecutando

Estoy usando C2DM, mis BroadcastReceivers propagar los eventos C2DM a un servicio local. El servicio completa el registro enviando el identificador a mi webserver pus es responsable de dejar que el dispositivo sepa sobre nuevos mensajes, sin embargo si la aplicación (una de las actividades) es hacia arriba queremos enviar una intención a esa actividad con los nuevos datos así Se puede actualizar, si no es que el NotificationManager se utiliza para notificar al usuario.

El problema es saber cómo se está ejecutando la actividad. El objeto de aplicación no es una opción ya que el servicio es parte de la aplicación que obviamente va a estar presente. Unregister en el onDesroy de cada aplicación tampoco es una opción ya que puede ocurrir en el cambio de orientación …

Cualquier manera estándar de hacerlo?

Solución 1: Puede utilizar ActivityManager para comprobar 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 manifiesto.

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

Solución 2: Puede usar una variable estática en su actividad para la que desea comprobar que se esté ejecutando o no y almacenarla en algún lugar para acceder desde su servicio o receptor de difusión como:

 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 fue útil!

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

Registre un BroadcastReceiver en el archivo de manifiesto. Este receptor manejará mensajes C2D cuando la aplicación no esté en funcionamiento. Registre otro BroadcastReceiver de forma programática en su actividad. Este receptor manejará mensajes C2D siempre que se esté ejecutando una 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 capturar emisiones primero, la prioridad de dynamicReceiver IntentFilter debe ser mayor que la prioridad de la instancia StaticReceiver IntentFilter (la prioridad predeterminada es '0').

PD. Parece que las emisiones emitidas por Google Cloud Messaging Service son emisiones ordenadas. Idea original autor: CommonsWare

La forma más sencilla de comprobar si una actividad se está ejecutando 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.

Copiado de aquí .

Puede utilizar 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; } } 
  • ID de registro de android c2dm
  • ¿Cómo puedo enviar un mensaje a un dispositivo usando C2DM desde un servidor que ha sido autenticado con OAuth2?
  • Utilizar C2DM en Android-x86
  • Java.lang.RuntimeException: WakeLock bajo-bloqueado C2DM_LIB
  • Tamaño máximo de Android C2DM Registration_ID
  • Fiabilidad de C2DM
  • Id de registro de Android c2dm falla
  • ¿Existe un patrón de registro de GCM?
  • ¿Es posible detectar la desinstalación de la aplicación de Android?
  • Google Cloud Messaging para la biblioteca de Android contra Google Play Services
  • Notificaciones push en Android: Google GCM vs Amazon SNS?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.