2014-07-24 43 views
7

我有非常基本的問題。這可能很簡單,但我不明白。 我有一個活動,我正在使用一些UI組件。我也有一個廣播接收器(從清單註冊) 我需要更新Activity類的一些UI組件。 象 -從Broadcast Receiver更新活動UI組件?

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

    } 

} 

對於但─的一個解決方案是,使UpdateLayout請()方法公共靜態,並且通過活動參考使用在接收器類方法。但我認爲,這是不正確的做法.. 有沒有任何適當的方法來做到這一點?

+1

你可以繼承廣播接收器的活動裏面,或者,使用委託模式 – Blackbelt

+0

當我繼承接收器類,然後我要讓它靜態類,並再次我要創建方法爲靜態.. –

+0

爲什麼你必須使它靜態? – Blackbelt

回答

4

如果你真的有使用,以保持BroadcastReceiverAndroidManifest.xml註冊,那麼你可以考慮使用事件總線。有一個來自Square的酷開源庫Otto

這是非常漂亮執行發佈/訂閱模式。你會在網上找到很多如何使用它的例子,這很簡單。首先檢查出奧托的website

如果您可以直接從Activity註冊/取消註冊接收器,那麼我會按照@Ritesh吉恩的答案。

6

不是註冊在清單的接收器,你可以註冊並如下運行時註銷它:

另外,還要確保你在意圖過濾正確的行動註冊您的接收器。

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   
    } 
} 

} 

希望它有幫助。

+0

異步任務的目的是什麼? – Blackbelt

+0

僅當基於onReceive()中的結果意圖進行網絡調用時才提供異步任務。在這種情況下,可以在doInBackground()中做到這一點。否則,可以簡單地在postExecute()中更新UI。 @blackbelt,如果有什麼更好的東西可以在這裏完成,我一定會想要學習。日Thnx。 –

2

docs

您可以動態註冊這個類 Context.registerReceiver()或靜態的實例,通過在AndroidManifest.xml中標記發佈一個實現 。

Activity.onResume()中註冊一個接收器並在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

可以使用觀察者模式,活動本身註冊在的onResume()與廣播接收器接收更新,並在onPause()註銷本身。

有很多網上的材料來學習觀察者圖案 - http://en.wikipedia.org/wiki/Observer_pattern

3

可以使用ObservableEvent與擴展可觀察類。

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

製作單件類通知中心

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

}

只是使用添加觀察員觀察通知和燒製方法使用後通知

4

我想肯定是從GreenRobot建議EventBus

EventBus是一個Android優化的發佈/訂閱事件總線。 Android應用程序的典型用例是將Activities,Fragments和後臺線程粘合在一起。這些元素的傳統佈線通常會引入複雜且容易出錯的依賴性和生命週期問題。 EventBus通過所有參與者傳播監聽者(例如,後臺服務 - >活動 - >多個片段或幫助程序類)將被棄用。 EventBus分離事件發送者和接收者,從而簡化應用程序組件之間的通信。代碼少,質量好。而且您不需要實現單個界面!

退房:https://github.com/greenrobot/EventBus

相關問題