2016-05-05 15 views
1

Ich habe einen Code, der verfügbare Wifi-Netzwerk verfolgen will, unabhängig davon, ob die App funktioniert oder nicht.Verwirrt über Android BroadcastReceiver & Service

Basierend auf einigen Probe ich im Web ich folgendes tun gefunden:

  1. registrieren eine entsprechende WakefulBroadcastReceiver
  2. Im Empfänger feuern eine Intent die
  3. einer meiner IntentService beginnt
  4. Schließlich im Service analysieren Sie die Ergebnisse und speichern Sie sie in einer statischen Variablen (sollte für den gesamten Prozess zugänglich sein).

Hoffentlich meine ganze Anwendung läuft in einem Prozess (ich glaube, ich eine Fahne sah, zu spezifizieren, dass ein Tag .. nicht sicher, wo ..)

Jetzt habe ich ein paar Fragen:

  • Warum nicht die Arbeit im Empfänger, warum einen Dienst starten?
  • Warum einen Wakeful-Empfänger anstelle eines reinen Empfängers verwenden? Insbesondere wenn die Arbeit zu einem Dienst umgeleitet wird
  • Wäre mein Dienst und die Aktivität meiner App im selben Prozess? Art von notwendig für den Austausch von Daten über statische Variablen ...

Antwort

0

Okay, ein paar Dinge. Wenn Sie mit dem Dienst kommunizieren möchten, müssen Sie eine ServiceConnection verwenden und eine Verbindung herstellen, indem Sie "binden". Wenn Sie eine Bindung an einen Dienst nach es gestartet wurde, wird der Dienst außerhalb des Lebenszyklus der Aktivität im Hintergrund beibehalten.

an den Dienst zu binden:

public ServiceConnection mServiceConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     // initialize the service and bind to the tracking service 
     YourService.YourBinder binder = (YourService.YourBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
     } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     } 
    }; 

Der Binder in Ihrem Dienst verschachtelt ist und verwendet, um eine Instanz des Dienstes zurückzukehren. So könnten Sie einen Dienst haben, der Ihren Standort im Hintergrund aufzeichnet und nur mit Ihrer Aktivität kommuniziert, wenn sie ausgeführt wird.

Also, Ihr Dienst wäre nicht im selben Prozess - es ist ein ganz anderer Thread.

Sie können Ihre Daten im Dienst selbst speichern und darauf zugreifen, indem Sie eine öffentliche getData() - Methode in Ihren Dienst einfügen; Sie können auf diese Methode zugreifen, indem Sie die Variable mService wie oben zugewiesen verwenden.

Wenn Sie schließlich vom Dienst zur Aktivität kommunizieren möchten, senden Sie eine Absicht an den BroadcastReceiver.

+1

'Schließlich, wenn Sie von dem Dienst zu der Aktivität kommunizieren möchten, dann würden Sie eine Absicht an den BroadcastReceiver senden. Nicht wirklich, wie Sie sagten:" Wenn Sie mit dem Dienst kommunizieren möchten, müssen Sie verwenden eine ServiceConnection und verbinden Sie sich mit ihr durch Binding - verwenden Sie also verbindlich - es kann perfekt in beide Richtungen arbeiten – pskink

+0

^guter Punkt, Empfänger ist nicht notwendig –