2011-06-04 78 views
0

我在這我想檢測WHEN Internet連接出現,當它消失的應用程序。問題的理解廣播接收機

此刻,當它出現時,我開始它我的應用程序連接到遠程服務器一個新的線程(從UI不同)。

爲此,我很難嘗試實現一個廣播接收器,它可以連接,但我在理解這個概念時遇到了問題。

在我onCreate()我有somethig這樣的:

onCreate()  
{ 
    cThread = new Thread(new ClientThread(syncToken)); 
    cThread.start(); 
} 

當有連接到互聯網,我通過套接字發送數據時,會有不,我存儲在數據庫中的數據。當互聯網出現時,我正在重新啓動我的線程以重新連接併發送舊數據(因網絡崩潰而未發送)和新數據。

比方說,我想實現這樣的事情:

DoRefreshBroadcastReceiver refreshBroadcastReceiver; 
...  
onResume() {  
    // register the refreshing complete broadcast receiver  
    IntentFilter intentFilter = new IntentFilter(DO_REFRESH);  
    refreshBroadcastReceiver = new doRefreshBroadcastReceiver();  
    registerReceiver(refreshBroadcastReceiver, intentFilter);   
} 

public class DoRefreshBroadcastReceiver extends BroadcastReceiver {  
    @Override 
    public void onReceive(Context context, Intent intent) {  
     // call method to run fetch code... 
    } 
} 

這是否意味着當檢測到Internet連接時,我的onReceive()被調用?我可以在那裏開始我的線程?

什麼是使用意圖的概念?因爲我真的不明白。如何使用它,以及它的目的是什麼?


想法:我真的不知道如何在這種情況下使用這個意圖或如何在我的應用程序中使用它!

請問這個東西檢測對Internet的連接,甚至當我在這個活動我不?


編輯:

這裏是我的onReceive看起來像:


onCreate() 
{ 
    cThread = new Thread(new ClientThread(syncToken)); 
    // cThread.start(); 

    connIntentFilter = new IntentFilter(
          "android.net.conn.CONNECTIVITY_CHANGE"); 
    connListener = new MyConnectivityListener(); 
} 

public void onReceive(Context context, Intent intent) 
{ 
    mNetworkInfo = (NetworkInfo) intent 
      .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

    if (mNetworkInfo != null && mNetworkInfo.isConnected()) 
    { 
     /* 
     * if(mNetworkInfo.getType()==ConnectivityManager.TYPE_WIFI); 
     * 
     * 
     * else 
     */ 

     cThread.start(); 
    } 

    else { 
     System.out.println("There is no internet connection!"); 

     try { 
      cThread.stop(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

mNetworkInfo != null && mNetworkInfo.isConnected()  

這是否意味着它的連接,或者我應該驗證某種類型的仿真器連接的?

*我認爲,我應該直接啓動我的線程onReceive()。一旦我的應用程序啓動它檢測到互聯網連接和BroadcastReceiver被解僱,不是嗎?

+0

我要求太多? – adrian 2011-06-04 20:45:58

回答

3

嘗試這樣的事情......

public class MyActivity extends Activity { 

    private MyConnectivityListener connListener = null; 
    private IntentFiler connIntentFilter = null; 
    private Boolean connIntentFilterIsRegistered = false; 

    @Override 
    protected void onCreate(...) { 
     ... 
     connIntentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); 
     connListener = new MyConnectivityListener(); 
    } 

    @Override 
    protected void onResume() { 
     ... 
     if (!connIntentFilterIsRegistered) { 
      registerReceiver(connListener, connIntentFilter); 
      connIntentFilterIsRegistered = true; 
     } 
    } 

    @Override 
    protected void onPause() { 
     ... 
     if (connIntentFilterIsRegistered) { 
      unregisterReceiver(connListener); 
      connIntentFilterIsRegistered = false; 
     } 
    } 

    protected class MyConnectivityListener extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // The NetworkInfo for the affected network is sent 
      // as an extra; it should be consulted to see what 
      // kind of connectivity event occurred. 
     } 
    } 
} 

一個BroadcastReceiver是一個有效的「聽衆」監聽事件可能由系統或發送的,在某些情況下,通過自己的應用程序組件。

在這種情況下,只要有連接更改(連接/斷開連接),系統就會廣播android.net.conn.CONNECTIVITY_CHANGE。通過註冊您的BroadcastReceiver來「聽」該事件,您可以從您的BroadcastReceiver的onReceive(...)方法中獲取意圖中包含的extra,並根據需要做相應的操作。額外的是一個NetworkInfo對象,它將包含關於特定網絡的信息以及它是否連接。

+0

如果我把這個connIntentFilter = new IntentFilter(「android.net.conn.CONNECTIVITY_CHANGE」);在我的onCreate()這是告訴我的廣播時,網絡的狀態變化的事情?我不需要別的東西......?其次,在onReceive()我驗證什麼樣的連接是...如果WiFi或類似的東西,這意味着我可以重新啓動我的線程...亞??? .....如果是連接,是好的我可以在onReceive()中啓動我的線程嗎?或者線程重啓的這部分是如何工作的???感謝你清理更多的東西:) – adrian 2011-06-04 21:25:21

+0

@george:onCreate()中的位是隻需在那裏用你想要聽的'事件'的名字來初始化connIntentFilter。然後將它與您的BroadcastReceiver實例一起傳遞給'registerReceiver(...)'。通過註冊,您告訴系統您想要通知連接更改。通過檢查onReceive中的NetworkInfo,可以判斷'事件'是否是連接或斷開連接,以便相應地啓動/停止線程。 – Squonk 2011-06-04 21:59:29

+0

你能否看看我的問題編輯,最後幾個問題:D!謝謝你 – adrian 2011-06-04 22:23:26