2011-06-04 99 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