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 …
- ¿Qué es la cuota de dispositivo por día para Android c2dm?
- Entrega garantizada de mensajes mediante la mensajería de Android a dispositivo (C2DM)
- ¿En Blackberry el jugador androide apoya notificaciones del empuje o C2dm?
- Recepción de notificaciones de GCM de Android cuando la aplicación está en estado detenido
- AppEngine RequestFactory o enfoque "Normal"?
Cualquier manera estándar de hacerlo?
- Java.lang.SecurityException: No se permite iniciar el servicio
- Registro de GCM pero no recibe mensajes en pre 4.0.4. Dispositivos
- Enviar notificaciones push en android sin utilizar C2DM
- Cómo agregar una notificación de inserción en mi propia aplicación de Android
- Iniciar un assínctar desde un receptor de difusión
- Error de c2dm 401 al enviar mensajes después de recibir id y token de autenticación
- La Notificación de empuje de Android de GCM muestra siempre el mensaje antiguo. Intención recibida incorrecta
- Implementación C2DM código PHP
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; } }
- ¿Es necesario el NDK para un buen desempeño en el desarrollo de un juego Android?
- Obtener ruta de la imagen desde la intención de la cámara