Android 广播接收机的理解问题

Android 广播接收机的理解问题,android,multithreading,broadcastreceiver,broadcast,Android,Multithreading,Broadcastreceiver,Broadcast,我有一个应用程序,我试图检测互联网连接何时出现,何时消失 此时,当它出现时,我正在启动一个新线程(与UI不同),将我的应用程序连接到远程服务器 为此,我几乎没有尝试实现一个监听连接的广播接收器,但我在理解这个概念时遇到了问题 在我的onCreate()中,我有如下内容: onCreate() { cThread = new Thread(new ClientThread(syncToken)); cThread.start(); } 当连接到Internet时,我通

我有一个应用程序,我试图检测互联网连接何时出现,何时消失

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

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

在我的
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连接时,会调用my
onReceive()
?我可以在那里开始我的线程

使用意图的概念是什么?因为我真的不明白。如何使用它,它的用途是什么


想法:我真的不知道如何在这种情况下使用这个意图,或者如何在我的应用程序中使用它

即使我不参与此活动,此设备是否会检测到与Internet的连接


编辑:

以下是我的onReceive的外观:




这是否意味着它已连接,或者我应该在模拟器上验证某种类型的连接


*我认为我应该直接在
onReceive()
中启动线程。当我的应用程序启动时,它会检测到互联网连接并且
BroadcastReceiver
会被触发,不是吗?

试试这样的方法

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\u CHANGE
。通过将您的BroadcastReceiver注册为“侦听”该事件,您可以从您的BroadcastReceiver的
onReceive(…)
方法中获得包含在意图中的
额外的
,并相应地执行您需要执行的任何操作。额外的是一个“NetworkInfo”对象,它将包含有关特定网络的信息,以及该网络是否已连接。

请尝试以下操作

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\u CHANGE
。通过将您的BroadcastReceiver注册为“侦听”该事件,您可以从您的BroadcastReceiver的
onReceive(…)
方法中获得包含在意图中的
额外的
,并相应地执行您需要执行的任何操作。额外的是一个“NetworkInfo”对象,它将包含有关特定网络以及是否连接的信息。

我要求的太多了?我要求的太多了?如果我把这个conintentfilter=newintentfilter(“android.net.conn.CONNECTIVITY_CHANGE”);在我的onCreate()中,当网络状态发生变化时,这是告诉我广播的东西吗???我不需要别的东西。。。?其次,在onReceive()中,我验证连接的类型…如果是WiFi或类似的东西,这意味着我可以重新启动我的线程…是吗?…如果连接良好,我可以在onReceive()中启动我的线程??或者线程重启的这一部分是如何工作的???感谢你进一步澄清了一些事情:)@george:onCreate()中的位只是用来用你想要监听的“事件”的名称初始化connIntentFilter。然后将其与BroadcastReceiver实例一起传递给注册表接收程序(…)
。通过注册,您告诉系统您希望收到连接更改的通知。通过检查onReceive中的网络信息,您可以判断“事件”是连接还是断开连接,因此相应地启动/停止线程。请查看我的问题的编辑,最后几个问题:D!谢谢你lot@george当前位置我想你差不多到了。回答一个问题-不,如果您在onPause()中实现了我的示例中用于注销接收器的代码(建议这样做),那么一旦您退出活动,接收器将无法继续工作。如果你需要它一直工作,那么事情就会变得更复杂。我建议您现在就试用它,进一步了解广播接收器和意图广播是如何工作的。如果我启动我的应用程序并连接到internet,它将连接到远程服务器,但如果我删除internet连接,它将不会显示任何System.out.println()..…或者如果我将此conintentfilter=new IntentFilter(“android.net.conn.CONNECTIVITY_CHANGE”)放入,则不重新连接到远程服务器;在我的onCreate()中,当网络状态发生变化时,这是告诉我广播的东西吗???我不需要别的东西。。。?其次,在onReceive()中,我验证连接的类型…如果是WiFi或类似的东西,这意味着我可以重新启动我的线程…是吗?…如果连接良好,我可以在onReceive()中启动我的线程??或者线程重启的这一部分是如何工作的???感谢你进一步澄清了一些事情:)@george:onCreate()中的位只是用来用你想要监听的“事件”的名称初始化connIntentFilter。然后将其与BroadcastReceiver实例一起传递给注册表接收程序(…)
。通过注册,您告诉系统您希望收到连接更改的通知。通过检查onReceive中的网络信息,您可以判断“事件”是连接还是断开连接,因此相应地启动/停止线程。请查看
mNetworkInfo != null && mNetworkInfo.isConnected()    
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.
        }
    }
}