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
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
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? –
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