2010-02-17 8 views
23

Forse è facile, ma non riuscivo a capirlo bene finora ... Ho ottenuto un BroadcastReceiver in attesa di essere attivato da AlarmMangager - questo funziona correttamente.Informa l'attività da un BroadcastReceiver SOLO se è in primo piano

Ora: perché l'evento, se si verifica, ha bisogno di aggiornare alcuni elementi sullo schermo del principale attività, vorrei inviare un'Intent da quello sfondo BroadcastReceiver alla mia attività - ma solo se è attualmente in il primo piano, noto anche come attivo.

Se non è in esecuzione o non è visibile, non mi interessa - e l'ultima cosa che voglio fare è avviare l'attività dal mio intento! Gestisco la riverniciatura delle viste nel mio metodo onResume(), quindi non mi interessa affatto.

Eventuali suggerimenti su come farlo? Grazie!

MODIFICA: my BroadcastReceiver è in attesa di allarmi che devono essere notificati all'utente. Quindi, deve essere lì e dichiarato nel manifest. Il problema è: dovrà decidere se l'attività menzionata è attualmente in primo piano o meno.

risposta

37

Quindi questa è quasi la risposta di Bino, ma: invece di mo Ving il ricevitore nell'attività, utilizzare due ricevitori, con diversi Intenti. Il primo è l'intento di allarme originale, con un ricevitore registrato nel manifest come già fatto, e quindi quel ricevitore invia un secondo tentativo di trasmissione, che viene gestito da un ricevitore registrato dall'attività come dice Bino.

Ho fatto questo nel mio progetto di timer, su github. Ecco lo alarm receiver e lo requery receiver. Spero possa aiutare.

+0

Grazie per una soluzione facile che non pensavo ancora :) –

+0

Perfetto - proprio quello che stavo cercando! +1 a te. – barry

+0

Esattamente quello che stavo cercando. – wendelbsilva

42

Credo che ora abbiate familiarità con AlarmManager (creazione di un nuovo allarme, registrazione di un ricevitore ...) quindi non parlerò di questo. Basta darti una soluzione per la tua domanda.

Invece di registrare un BroadcastReceiver in un file di classe e in manifest, devi solo creare un nuovo BroadcastReceiver nella tua attività, quindi registrarlo nel metodo onResume e annullarlo nel metodo onPause, come nella tua attività:

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //do something  
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction("your alarm action"); 
    ... 
} 

@Override 
protected void onResume() { 
registerReceiver(mIntentReceiver, mIntentFilter); 
    ... 
super.onResume(); 
} 

@Override 
protected void onPause() { 
unregisterReceiver(mIntentReceiver); 
    ... 
super.onPause(); 
} 

il ricevitore riceverà solo l'intento di allarme quando la vostra attività è in primo piano :)

(Scusate se il mio inglese non è chiaro)

+2

Ciao Bino! Grazie per la tua risposta - Vedo, devo aggiornare la mia domanda in quanto la tua risposta imporrebbe un nuovo problema ... Ho bisogno che il BroadcastReceiver sia sempre ** sempre lì, non SOLO se l'attività è in esecuzione e in primo piano! È un allarme: precisamente informa l'utente di un autobus che vuole catturare. Ora: gli allarmi devono essere notificati indipendentemente da ciò che sta facendo l'attività. MA: se e solo se è attivo e in primo piano ho bisogno di aggiornare una casella di controllo che indica che questo allarme specifico non è più impostato! :-( – Zordid

Problemi correlati