2014-04-07 1 views
8

Ho un paio di attività e un servizio di intenti che gestisce i messaggi in arrivo di GCM.GCM Android: modalità di gestione diverse a seconda che l'app sia visibile o meno

In questo momento per ogni push, sto inviando una notifica, e dopo che l'utente lo ha fatto, viene reindirizzato alla schermata appropriata.

Vorrei modificare questo comportamento se l'app è visibile (qualsiasi attività è in primo piano), invece della notifica viene visualizzato un messaggio di dialogo (con l'azione appropriata).

Qualche idea su come implementarlo?

Ho 2 idee, ma nessuno di loro è perfetto:

  • tenere traccia di ogni attività nella domanda, se l'attività è visibile, non mostrano la notifica, ma mandò un intento di attività (non bella soluzione)
  • registra/annulla la registrazione del secondo ricevitore di broadcast in ogni attività onResume/onPause, "cattura" la trasmissione GCM in arrivo (non sono sicuro che sia possibile).

Altre soluzioni?

risposta

1

Non l'ho provato, ma i documenti dicono che è possibile ottenere il number of running activities per ogni attività.

Prova a trovare compito dell'applicazione tra attività attualmente in esecuzione:

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 ha aggiunto una nota sul getRunningTasks():

Nota: questo metodo è destinato solo per il debug e la presentazione di gestione delle attività di interfacce utente . Questo non dovrebbe mai essere usato per la logica di base in un'applicazione, come decidere tra diversi comportamenti basati sulle informazioni trovate qui. Tali usi non sono supportati e probabilmente si romperanno in futuro. Ad esempio, se più applicazioni possono essere attive contemporaneamente, le ipotesi fatte sul significato dei dati qui a scopo di controllo del flusso non saranno corrette.

Quindi usarlo a proprio rischio.


Controllare anche se le trasmissioni GCM sono ordered. In tal caso, puoi "ignorare" il valore predefinito BroadcastReceiver con gli altri in ciascuna attività. Gioca con lo priority di IntentFilter s.Quando lo BroadcastReceiver con priorità più alta riceve il messaggio, può abort è un'ulteriore propagazione. Per la tua applicazione questo significa che quando alcuni Activity sono in esecuzione, registra il ricevitore che mostra la finestra di dialogo e interrompe la trasmissione. Se nessuna attività è attiva, il ricevitore predefinito mostra la notifica.

+0

Non volevo usare la prima soluzione per la ragione che hai menzionato. La seconda soluzione sembra essere la promissiong, la controllerò io. – kmalmur

+0

Le trasmissioni GCM sono davvero ordinate! Grazie – kmalmur

3

Una possibile soluzione (idea 1):

per rilevare se la vostra applicazione è in esecuzione back o in primo piano, si può semplicemente impostare un valore booleano in onPause/onResume:

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

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

Quando si avvia un nuovo intento da una notifica viene chiamato questo metodo: (se si utilizza singleTop), con il booleano è possibile determinare cosa fare nel metodo onNewIntent.

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

Spero che sia d'aiuto!

+0

beh, in realtà stavo cercando di evitare questo. Se hai un paio di attività, il codice diventa complicato e c'è anche una transizione quando si cambiano le attività. Se la spinta arriva durante questo stato, potrebbe non essere gestita correttamente. – kmalmur