理解广播接收器的问题

时间:2011-06-04 19:38:37

标签: android multithreading broadcastreceiver broadcast

我有一个应用程序,我正在尝试检测 WHEN 互联网连接何时显示以及何时消失。

目前,当它出现时,我正在启动一个新的线程(与UI不同),它将我的应用程序连接到远程服务器。

为此,我几乎没有尝试实现 LISTENS 用于连接的广播接收器,但我在理解这个概念时遇到了问题。

在我的onCreate()我有点像:

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

当有连接到Internet时,我正在通过套接字发送数据,当我没有将数据存储在数据库中时。当互联网出现时,我正在重新启动我的线程以重新连接并发送旧数据(由于网络崩溃而未发送)和新数据。

让我说我会实现这样的事情:

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()开始我的主题。一旦我的应用程序启动它就会检测到Internet连接并且BroadcastReceiver被触发,不是吗?

1 个答案:

答案 0 :(得分: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的extra方法中获取Intent中包含的onReceive(...),并根据需要做任何事情。额外的是一个`NetworkInfo对象,它将包含有关特定网络的信息以及它是否已连接。