2011-10-11 52 views
0

我想實現一個BroadcastReceiver,但它不工作。 我想用它從一個實現網絡io的類返回進度,這是從我的Activity中的一個AsyncTask調用的。如何在Android中實現BroadcastReceiver

這裏是我的活動代碼:

package com.ClinicalInterface; 

public class TestActivity extends ListActivity { 

    static AsyncDataLoader mAsyncDataLoader; 
    static ProgressDialog dialog; 
    static ArrayList<String> list; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     dialog = new ProgressDialog(this); 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
     mAsyncDataLoader = new AsyncDataLoader(); 
     mAsyncDataLoader.execute(); 
    } 

    public class AsyncDataLoader extends AsyncTask<Void, Integer, String> {   

     public class mTestReceiver extends BroadcastReceiver { 
      @Override 
      public void onReceive(Context context, Intent intent){ 
       System.out.println("I've received something!"); 
       publishProgress(2); 
      } 
     } 

     @Override 
     protected String doInBackground(Void ... params) {    
      TestLoader tl = new TestLoader(); 
      tl.setContext(getApplicationContext()); 
      tl.setServeraddress("192.168.2.109"); 
      list = tl.doLST(null); 
      return "COMPLETE!"; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      if (values[0] == 2) { 
       dialog.setMessage("Loading data ..."); 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      dialog.dismiss(); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(TestActivity.this, R.layout.list_item, list); 
      TestActivity.this.setListAdapter(adapter);      
     } 
    }   
} 

這應該顯示一個列表,然後在該列表中的數據從服務器返回一個進度對話框覆蓋這一點。這工作正常。 我想在網絡io完成時更新進度對話框中的文本。 這是一個實現了網絡IO代碼:

package com.ClinicalInterface; 

public class TestLoader { 
    private Context mContext; 

    public void setContext(Context context) { 
     mContext = context; 
    } 

    public ArrayList<String> doLST(String arg) { 

     // Send intent to AsyncTask   
     Intent intent = new Intent(mContext, mTestReceiver.class); 
     intent.setAction("PROGRESS"); 
     mContext.sendBroadcast(intent); 
     System.out.println("message sent"); 

     // Code that actually does network io removed for brevity 
    } 
} 

在我已經添加了以下Android清單文件:

<activity android:name="TestActivity" android:label="TestActivity"> 
    <receiver android:name=".AsyncDataLoader.mTestReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PROGRESS" /> 
     </intent-filter> 
    </receiver> 
</activity> 

我得到 但不是在日誌打印「發送消息」日誌打印「我收到了一些東西」

我是一個Android新手,所以我假設我沒有正確實施。 任何想法?

當創建意圖時,使用意圖過濾器和一組操作更新了原始帖子。還是行不通。

+0

所以,你的廣播接收器應該啓動,當你收到一條消息? –

+0

不可以。接收方應在收到發送意圖後收到意圖。它在DoLST被調用時發送。 一旦我有了意圖發送一次,我可以發送多次,因爲網絡io進展 - 然後我可以用它來更新ui與調用publishProgress。 – AndroidJerry

回答

0

好 好像答案。是,它不可能使用清單以註冊接收 如果我更改代碼,以便它使用registerReceiver那麼好的工作 代碼更新這樣的:

@Override 
protected String doInBackground(Void ... params) {    
    TestLoader tl = new TestLoader(); 
    IntentFilter intentFilter = new IntentFilter("PROGRESS"); 
    mReceiver mmReceiver = new mReceiver(); 
    registerReceiver(mmReceiver, intentFilter);    
    tl.setContext(getApplicationContext()); 
    tl.setServeraddress("192.168.2.109"); 
    list = tl.doLST(null); 
    unregisterReceiver(mmReceiver); 
    return "COMPLETE!"; 
} 

而且從清單中刪除與接收者有關的任何內容。

注意:發送廣播的代碼是這樣的:

Intent intent = new Intent(); 
intent.setAction("PROGRESS"); 
mContext.sendBroadcast(intent); 
2

您的<receiver>標記需要包含一個<intent-filter>來告訴Android您實際上想要接收哪些廣播意圖。

編輯:

一個Intent不大於消息的容器更爲;這是您打電話發送Intent的功能,該功能可確定您需要設置哪些字段。

從文檔爲Intent

[Intent]可以與startActivity用來啓動一個ActivitybroadcastIntent將其發送到任何感興趣BroadcastReceiver組件和startService(Intent)bindService(Intent, ServiceConnection, int)與背景進行通信Service

這些功能是您發送Intent s的選項。 startActivitystartService/bindService函數使用明確的Intent s; sendBroadcast沒有。

注意startActivity拋出一個異常,如果它不能找到你Intent的目標類startService將返回null,如果它不能找到你的目標類。 sendBroadcast不會做這樣的事情,因爲它甚至沒有看到那個領域。 sendBroadcast「將給定的意圖廣播給全部感興趣的BroadcastReceivers。「

由於您使用Context.sendBroadcast()送你的意圖,你應該在你的Intent設置一個動作,你BroadcastReceiver應該有一個包含該操作的入口的意圖過濾器。

+0

這是正確的嗎? 在文檔中有關意圖的說明: 「明確命名目標組件的意圖將激活該組件;過濾器不起作用」 – AndroidJerry

+0

請參閱我的編輯。 –

+0

嗨亞倫, 我已經更新了一些意向過濾器和setAction更改我原來的帖子。但它仍然不起作用。 – AndroidJerry

相關問題