Android 广播接收机的理解问题
我有一个应用程序,我试图检测互联网连接何时出现,何时消失 此时,当它出现时,我正在启动一个新线程(与UI不同),将我的应用程序连接到远程服务器 为此,我几乎没有尝试实现一个监听连接的广播接收器,但我在理解这个概念时遇到了问题 在我的Android 广播接收机的理解问题,android,multithreading,broadcastreceiver,broadcast,Android,Multithreading,Broadcastreceiver,Broadcast,我有一个应用程序,我试图检测互联网连接何时出现,何时消失 此时,当它出现时,我正在启动一个新线程(与UI不同),将我的应用程序连接到远程服务器 为此,我几乎没有尝试实现一个监听连接的广播接收器,但我在理解这个概念时遇到了问题 在我的onCreate()中,我有如下内容: onCreate() { cThread = new Thread(new ClientThread(syncToken)); cThread.start(); } 当连接到Internet时,我通
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连接时,会调用myonReceive()
?我可以在那里开始我的线程
使用意图的概念是什么?因为我真的不明白。如何使用它,它的用途是什么
想法:我真的不知道如何在这种情况下使用这个意图,或者如何在我的应用程序中使用它 即使我不参与此活动,此设备是否会检测到与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.
}
}
}