【问题标题】:Problem in understanding broadcast receiver理解广播接收器的问题
【发布时间】:2011-06-04 19:38:37
【问题描述】:

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

目前,当它出现时,我正在启动一个新线程(不同于 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,不是吗?

【问题讨论】:

  • 我要求的太多了?

标签: android multithreading broadcastreceiver broadcast


【解决方案1】:

试试这样的...

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(...) 方法获取 Intent 中包含的 extra 并执行您需要执行的任何操作。额外的是一个 `NetworkInfo 对象,它将包含有关特定网络以及它是否已连接的信息。

【讨论】:

  • 如果我把这个 connIntentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");在我的 onCreate() 中,这是在网络状态发生变化时告诉我的广播吗???我不需要别的东西...?其次,在 onReceive() 我验证什么样的连接是......如果是 WiFi 或类似的东西意味着我可以重新启动我的线程......是的???.....如果连接并且是好的我可以在 onReceive() 中启动我的线程吗????或者这部分重新启动线程的工作原理是什么?谢谢你把事情弄清楚了一点:)
  • @george:onCreate() 中的位只是用于使用您要监听的“事件”的名称来初始化 connIntentFilter。然后您将它与您的 BroadcastReceiver 的实例一起传递给registerReceiver(...)。通过注册,您告诉系统您希望收到有关连接更改的通知。通过检查 onReceive 中的 NetworkInfo,您可以判断“事件”是连接还是断开连接,因此相应地启动/停止您的线程。
  • 能否请您看一下我的问题的编辑,最后几个问题:D!非常感谢您
  • @george:我想你已经差不多了。要回答一个问题 - 不,如果您在我的示例中实施代码以在 onPause() 中取消注册接收器(推荐),那么一旦您离开 Activity,接收器将无法继续工作。如果您需要它始终工作,那么事情会变得更加复杂。我建议您像现在一样尝试它,并进一步了解 BroadcastReceivers 和 Intent 广播的工作原理。
  • 如果我启动我的应用程序并且我有互联网连接它会连接到远程服务器但如果我删除互联网连接它不会显示任何 System.out.println() .....或不重新连接到我的远程服务器
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多