2014-07-24 5 views
7

Ich habe sehr grundlegende Fragen. und es könnte sehr einfach sein, aber ich verstehe es nicht. Ich habe eine Aktivität, bei der ich einige UI-Komponenten verwende. und ich habe auch einen Rundfunkempfänger (Registrierung aus Manifest) wo ich einige UI-Komponente der Activity-Klasse aktualisieren müssen. wie -Aktualisiere Activity UI-Komponente von Broadcast Receiver?

Class MyActivity extends Activity 
    { 

     onCreate(){ 

     //using some UI component lets say textview 
      textView.setText("Some Text"); 
     } 

     updateLayout() 
     { 
     textView.setText("TextView Upadated..."); 
     } 
} 


Class broadCastReceiver 
{ 

    onReceive() 
    { 
     //here I want to update My Activity component like 
     UpdateLayout(); 

    } 

} 

Für dass- Eine Lösung besteht darin, dass die updateLayout() Methode public static machen und diese Methode in Empfänger Klasse Aktivität Referenz verwenden. Aber ich denke, das ist nicht der richtige Weg, dies zu tun. Gibt es einen richtigen Weg, das zu tun?

+1

Sie können entweder den Rundfunkempfänger in Ihrer Aktivität Unterklasse, oder verwenden Sie die Delegation Muster – Blackbelt

+0

Wenn ich Empfänger Klasse Unterklasse dann muss ich es statische Klasse machen und wieder muss ich schaffen Methode als statisch .. –

+0

warum müssen Sie es statisch machen? – Blackbelt

Antwort

4

Wenn Sie wirklich halten müssen mit BroadcastReceiver registriert von AndroidManifest.xml dann könnten Sie Event Bus in Betracht ziehen. Es gibt eine coole Open-Source-Bibliothek Otto von Square.

Es implementiert Publisher/Subscriber-Muster sehr schön. Sie werden viele Beispiele im Web finden, wie man es benutzt, es ist sehr einfach.Zunächst einmal die Otto's website

Wenn Sie Empfänger direkt von Activity registrieren/abmelden können, dann würde ich @Ritesh Gune Antwort folgen.

6

Statt einen Empfänger in Manifest der Registrierung, können Sie es zur Laufzeit registrieren und deregistrieren wie folgt:

Auch stellen Sie sicher, dass Ihr Receiver mit der richtigen Aktion in Intent Filter registrieren.

public class MyActivity extends Activity{ 

// used to listen for intents which are sent after a task was 
// successfully processed 
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     new UpdateUiTask().execute(); 
    } 
}; 

@Override 
public void onResume() {   
    registerReceiver(mUpdateReceiver, new IntentFilter(
      YOUR_INTENT_ACTION)); 
    super.onResume(); 
} 

@Override 
public void onPause() {  
    unregisterReceiver(mUpdateReceiver); 
    super.onPause(); 
} 


// used to update the UI 
private class UpdateUiTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected String doInBackground(Void... voids) { 
     Context context = getApplicationContext(); 
     String result = "test"; 
     // Put the data obtained after background task. 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO: UI update   
    } 
} 

} 

Ich hoffe, es hilft.

+0

Was ist der Zweck der asynchronen Task? – Blackbelt

+0

Async-Task wird nur dann bereitgestellt, wenn ein Netzwerkaufruf basierend auf der Ergebnisabsicht in onReceive() ausgeführt werden soll. In diesem Fall kann man das in doInBackground() tun. Andernfalls kann man einfach die Benutzeroberfläche in postExecute() aktualisieren. @blackbelt, würde ich gerne lernen, wenn hier etwas Besseres getan werden kann. Thnx. –

2

Vom docs:

Sie können entweder dynamisch eine Instanz dieser Klasse mit Context.registerReceiver() oder statisch eine Implementierung durch den Tag in Ihrem AndroidManifest.xml veröffentlichen registrieren.

Registrieren Sie einen Empfänger in Activity.onResume() Implementierung und Registrierung in Activity.onPause().

public class MyActivity extends Activity 
{ 
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      MyActivity.this.broadcastReceived(intent); 
     } 
    }; 

    public void onResume() { 
     super.onResume(); 
     IntentFilter intentFilter = new IntentFilter(); 
     // add action, category, data to intentFilter 
     this.registerReceiver(this.mBroadcastReceiver, intentFilter); 
    } 

    public void onPause() { 
     super.onPause(); 
     this.unregisterReceiver(this.mBroadcastReceiver); 
    } 

    public void broadcastReceived(Intent intent) { 
     // Update the UI component here. 
    } 
} 
0

können Sie verwenden Beobachter Muster die Aktivität registriert sich in onResume() mit dem Rundfunkempfänger-Updates zu erhalten und in onPause() hebt die Registrierung selbst.

Es gibt viel Material auf Netto-Beobachter zu lernen Muster- http://en.wikipedia.org/wiki/Observer_pattern

3

Sie erstreckt sich beobachtbare Klasse verwenden ObservableEvent können.

public class ObservableEvent extends Observable { 
public void setChanged(){ 
    super.setChanged(); 
} 
} 

Fabrikat Singletonklasse Benachrichtigungszentrum

public class NSNotificationCenter { 

private HashMap<String, ObservableEvent> observables = new HashMap<String, ObservableEvent>(); 

/** 
* Lazy load the event bus 
*/ 

public void addObserver(String notification, Observer observer) { 
    ObservableEvent observable = observables.get(notification); 
    if (observable == null) { 
     observable = new ObservableEvent(); 
     observables.put(notification, observable); 
    } 
    observable.addObserver(observer); 
} 

public void removeObserver(String notification, Observer observer) { 
    Observable observable = observables.get(notification); 
    if (observable != null) { 
     observable.deleteObserver(observer); 
    } 
} 


public void postNotification(String notification, Object object) { 
     ObservableEvent observable = observables.get(notification); 
     if (observable != null) { 
      observable.setChanged(); 
      if (object == null) { 
       observable.notifyObservers(); 
      } else { 
       observable.notifyObservers(object); 
      } 
     } 
} 

}

nur Beobachter hinzufügen verwenden für benachrichtigen Beobachtung und Verfahren Verwendung Nachmeldung zum Brennen

4

Ich würde sicherlich EventBus von Greenrobot

EventBus empfehlen ist ein Android-optimierte Eventbus Publish/Subscribe. Ein typischer Anwendungsfall für Android-Apps ist das Zusammenkleben von Aktivitäten, Fragmenten und Hintergrundthreads. Die herkömmliche Verdrahtung dieser Elemente führt oft zu komplexen und fehleranfälligen Abhängigkeiten und Problemen im Lebenszyklus. Mit EventBus wird die Weitergabe von Listenern über alle Teilnehmer (z. B. Hintergrunddienst -> Aktivität -> mehrere Fragmente oder Hilfsklassen) veraltet. EventBus entkoppelt Event-Sender und -Empfänger und vereinfacht damit die Kommunikation zwischen App-Komponenten. Weniger Code, bessere Qualität. Und Sie müssen keine einzige Schnittstelle implementieren!

Check-out: https://github.com/greenrobot/EventBus