2010-02-17 4 views
23

Vielleicht ist es einfach, aber ich konnte das bisher nicht richtig herausfinden ... Ich habe eine BroadcastReceiver, die darauf wartet, vom AlarmManger ausgelöst zu werden - das funktioniert einwandfrei.NUR Aktivität von einem BroadcastReceiver informieren, wenn sie im Vordergrund ist

Jetzt: weil das Ereignis, wenn es auftritt, einige Elemente auf dem Bildschirm der Hauptaktivität auffrischen muss, würde Ich mag ein Intent aus diesem Hintergrund BroadcastReceiver meine Aktivität senden - aber nur wenn es derzeit in der Vordergrund, aka aktiv.

Wenn es nicht läuft oder nicht sichtbar ist, ist mir egal - und das letzte, was ich tun möchte, ist die Aktivität mit meiner Absicht zu starten! Ich überarbeite die Ansichten in meiner onResume() -Methode, also ist mir das egal.

Irgendwelche Hinweise, wie man das macht? Danke!

EDIT: mein BroadcastReceiver wartet auf Alarme, die dem Benutzer mitgeteilt werden müssen. Also muss es da sein und im Manifest deklariert sein. Das Problem ist, dass es entscheiden muss, ob die oben genannte Aktivität im Vordergrund steht oder nicht.

Antwort

37

diese Antwort ist so fast Bino, aber: statt von mo Wenn Sie den Empfänger in die Aktivität einbeziehen, verwenden Sie zwei Empfänger mit unterschiedlichen Intents. Der erste ist Ihr ursprünglicher Alarm Intent, mit einem Empfänger, der im Manifest registriert ist, wie Sie bereits haben, und dann sendet dieser Empfänger einen zweiten Übertragungszweck, der von einem Empfänger gehandhabt wird, der von der Aktivität registriert wird, wie Bino sagt.

Ich habe dies in meinem eigenen Timer-Projekt getan, auf GitHub. Hier sind die alarm receiver und die requery receiver. Ich hoffe, das hilft.

+0

Danke für eine einfache Lösung, an die ich noch nicht gedacht habe :) –

+0

Perfekt - genau das, was ich gesucht habe! +1 für dich. – barry

+0

Genau das, was ich gesucht habe. – wendelbsilva

42

Ich glaube, dass Sie mit AlarmManager jetzt vertraut sind (Erstellen eines neuen Alarms, registrieren Sie einen Empfänger ...), damit ich nicht darüber sprechen werde. Gib dir einfach eine Lösung für deine Frage.

Anstatt einen BroadcastReceiver in einer Klassendatei und in einem Manifest zu registrieren, erstellen Sie nur einen neuen BroadcastReceiver in Ihrer Aktivität, registrieren ihn dann in der onResume-Methode und heben ihn in der onPause-Methode auf, wie in Ihrer Aktivität:

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(); 
} 

Der Empfänger wird der Alarm Absicht, wenn Sie Ihre Aktivitäten im Vordergrund ist nur erhalten :)

(Sorry, wenn mein Englisch ist nicht klar)

+2

Hallo Bino! Danke für deine Antwort - ich sehe, ich muss meine Frage aktualisieren, da deine Antwort ein neues Problem aufzwingen würde ... Ich brauche den BroadcastReceiver um ** immer ** da zu sein, NICHT NUR wenn die Aktivität läuft und im Vordergrund steht! Es ist ein Alarm - genau wird es den Benutzer über einen Bus informieren, den er fangen möchte. Jetzt: Alarme müssen unabhängig von der Aktivität gemeldet werden. ABER: wenn und nur wenn es aktiv und im Vordergrund ist, muss ich eine Checkbox aktualisieren, die anzeigt, dass dieser spezifische Alarm nicht mehr gesetzt ist! :-( – Zordid

Verwandte Themen