2014-04-07 4 views
8

Ich habe ein paar Aktivitäten und einen Intent-Service, der eingehende GCM-Nachrichten behandelt.Android GCM: andere Art der Handhabung drücken, je nachdem, ob die App sichtbar ist oder nicht

Momentan sende ich für jeden Push eine Benachrichtigung, und nachdem der Benutzer darauf klickt, wird er zum entsprechenden Bildschirm weitergeleitet.

Ich möchte dieses Verhalten ändern, dass, wenn die App sichtbar ist (jede Aktivität ist im Vordergrund), anstelle der Benachrichtigung eine Dialogmeldung angezeigt wird (mit entsprechender Aktion).

Irgendeine Idee, wie man es umsetzt?

Ich habe 2 Ideen, aber keiner von ihnen ist perfekt:

  • Behalten jeder Aktivität in der Anwendung, wenn die Aktivität sichtbar ist, keine Benachrichtigung nicht zeigen, aber eine Absicht auf die Aktivität gesendet (nicht nette Lösung)
  • registrieren/die Registrierung des zweiten Broadcast-Empfänger in jeder Aktivität onResume/onPause, "fangen" die eingehende GCM Broadcast (ich bin mir nicht sicher, ob es möglich ist).

Irgendwelche anderen Lösungen?

Antwort

1

Ich habe es nicht getestet, aber die Dokumente sagen, Sie können die number of running activities für jede Aufgabe bekommen.

Versuchen Sie, Ihre Anwendung Aufgabe unter aktuell laufenden Aufgaben zu finden:

Hinweis:

ActivityManager acitivityManager = (ActivityManager) 
    context.getSystemService(Context.ACTIVITY_SERVICE); 
// Get the top of running tasks, limit by 100 
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100); 
for (RunningTaskInfo taskInfo : tasks) { 
    if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) { 
     if (taskInfo.numRunning > 0) { 
      // Show dialog 
     } else { 
      // Show notification 
     } 
     break; 
    } 
} 

Google eine Notiz auf getRunningTasks() hinzugefügt wird diese Methode nur für das Debuggen und präsentiert Task-Management-Benutzeroberflächen vorgesehen . Dies sollte niemals für Kernlogik in einer Anwendung verwendet werden, z. B. die Entscheidung zwischen verschiedenen Verhaltensweisen basierend auf den hier gefundenen Informationen. Solche Anwendungen werden nicht unterstützt und werden wahrscheinlich in der Zukunft unterbrochen. Wenn beispielsweise mehrere Anwendungen gleichzeitig aktiv ausgeführt werden können, sind die Annahmen hinsichtlich der Bedeutung der Daten für die Zwecke des Kontrollflusses inkorrekt.

Verwenden Sie es auf eigene Gefahr.


Prüfen Sie auch, ob GCM Sendungen ordered sind. Wenn dies der Fall ist, können Sie Ihre Standardeinstellungen BroadcastReceiver mit den anderen in jeder Aktivität überschreiben. Spielen Sie einfach mit der priority von IntentFilter s.Wenn der BroadcastReceiver mit höherer Priorität die Nachricht empfängt, kann es abort es ist weitere Propagierung. Für Ihre Anwendung bedeutet dies, dass, wenn einige Activity läuft, registriert den Empfänger, der den Dialog zeigt und Broadcast abbricht. Wenn keine Aktivität aktiv ist, zeigt Ihr Standardempfänger die Benachrichtigung an.

+0

Ich wollte die erste Lösung aus dem von Ihnen erwähnten Grund nicht verwenden. Die zweite Lösung scheint promissiong zu sein, ich werde es überprüfen – kmalmur

+0

GCM-Sendungen sind in der Tat bestellt! Vielen Dank – kmalmur

3

Eine mögliche Lösung (idea 1):

Um festzustellen, ob Ihre App Hinter- oder Vordergrund ausgeführt wird, können Sie einfach einen boolean in onPause gesetzt/onResume:

@Override 
protected void onResume() { 
    super.onResume(); 
    runningOnBackground = false; 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    runningOnBackground = true; 
} 

Wenn Sie ein Start Neue Absicht aus einer Benachrichtigung, die diese Methode aufruft: (Wenn Sie singleTop verwenden), können Sie mit dem booleschen Wert festlegen, was in der onNewIntent-Methode zu tun ist.

@Override 
protected void onNewIntent (Intent intent){ 
    if(runningOnBackground){ 
    //do this 
    } 
    else{ 
    //do that 
    } 
} 

Hoffe es hilft!

+0

Nun, eigentlich habe ich versucht, dies zu vermeiden. Wenn Sie ein paar Aktivitäten haben, wird der Code kompliziert und es gibt auch einen Übergang beim Wechsel der Aktivitäten. Wenn der Druck in diesem Zustand eintritt, wird er möglicherweise nicht richtig gehandhabt. – kmalmur

Verwandte Themen