【问题标题】:Dynamic BroadcastReceiver to Check Online Connectivity动态广播接收器检查在线连接
【发布时间】:2017-02-18 13:06:47
【问题描述】:

我想动态设置一个 BroadcastReceiver 以仅在我的应用程序在前台运行时检查我是否在线。在我的主类中,我创建了一个 Intent Filter、一个嵌套的 BroadcastReceiver 类,最后分别在 onResume 和 onPause 方法中注册/取消注册接收器。

我的问题是,是否有一个意图 ACTION 可以添加到我的意图过滤器中以检查在线连接?

如果没有,我如何创建此动态广播接收器以仅在我的应用运行时执行?

这是我的班级的样子......

public class MainActivity extends AppCompatActivity {
private IntentFilter onlineIntentFilter;
private CheckOnlineReceiver checkOnlineReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    onlineIntentFilter = new IntentFilter();
    checkOnlineReceiver = new CheckOnlineReceiver();
    //*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY******
    onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);

    }

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(checkOnlineReceiver, onlineIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(checkOnlineReceiver);
}


private class CheckOnlineReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show();
    }
}}

【问题讨论】:

    标签: android android-intent intentfilter


    【解决方案1】:

    添加连接操作 onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)

    别忘了添加权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    广播接收器的onReceive() 将在连接更改时调用,这意味着连接和断开连接。因此,每当您收到广播时,您都会按如下方式检查连接

    public boolean isNetworkAvailable() {
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = cm.getActiveNetworkInfo();
      if (networkInfo != null && networkInfo.isConnected()) {
          return true;
      }
      return false;
    }
    

    【讨论】:

      【解决方案2】:

      这是执行此操作的标准方法。

      创建一个接口,它有两个方法 onNetworkConnected() 和 onNetworkDisconnected()

      public interface NetworkConnectivityListener {
           public void onNetworkConnected();
           public void onNetworkDisconnected();
      }
      

      任何想要监听网络变化的类都会实现这个接口并覆盖它的两个方法。

      创建一个扩展广播接收器的类,这个接收器的 onReceive() 将捕获连接变化。在这个类中创建一个函数来注册监听器

      public class NetworkBroadcastReceiver extends BroadcastReceiver {
      
      private NetworkConnectivityListener listener;
      
      public NetworkBroadcastReceiver(NetworkConnectivityListener listener) {
          this.listener = listener;
      }
      
      @Override
      public void onReceive(Context context, Intent intent) {
          String action = intent.getAction();
      
          if (listener != null) {
              if (isConnectedToInternet()) {
                  listener.onNetworkConnected();
              } else {
                  listener.onNetworkDisconnected();
              }
          } 
      }
      

      PS 您可以轻松检查您的设备是否已连接到互联网。只是谷歌。

      现在假设你想让你的 MainActivity 监听网络变化,你所要做的就是在你的主 Activity 调用中实现 NetworkConnectivityListener 并创建一个 NetworkBroadcastReceiver 的实例,传递 MainActivity 的上下文,它将开始获取网络更新。

      【讨论】:

        【解决方案3】:

        添加意图过滤器CONNECTIVITY_ACTION

        【讨论】:

        • 说是无法解决。这是我添加的内容: onlineIntentFilter.addAction(Intent.CONNECTIVITY_ACTION);
        【解决方案4】:

        当您希望在后台执行长时间运行的任务时,您需要创建一个服务。

        需要在清单中的<application> 标签内注册服务。

        <service android:name=".WifiService"
                 android:stopWithTask="true"
                 android:enabled="true"/>
        

        stopWithTask 会在您的所有活动都被销毁时导致服务被销毁(默认值为 true)。

        您需要在服务类中的 CONNECTIVITY_CHANGE 操作中注册和取消注册 BroadcastReceiver。

        public class WifiService extends Service {
        
            private BroadcastReceiver mReceiver;
        
            @Nullable
            @Override
            public IBinder onBind(Intent intent) {
                IntentFilter filter = new IntentFilter();
                filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        
                // Your BroadcastReceiver class
                mReceiver = new WifiReceiver();
                registerReceiver(mReceiver, filter);
                return null;
            }
        
            @Override
            public boolean onUnbind(Intent intent) {
                unregisterReceiver(mReceiver);
                return super.onUnbind(intent);
            }
        }
        

        然后您必须在 BroadcastReceiver 中监听 CONNECTIVITY_CHANGE。

        public class WifiReceiver extends BroadcastReceiver {
        
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        
                boolean isConnected = networkInfo != null &&
                                      networkInfo.isConnectedOrConnecting();
        
                if (isConnected) {
                    switch (networkInfo.getType()) {
                        case ConnectivityManager.TYPE_WIFI:
                            // Connected via wifi
                            break;
        
                        case ConnectivityManager.TYPE_ETHERNET:
                            // Connected via ethernet
                            break;
        
                        case ConnectivityManager.TYPE_MOBILE:
                            // Connected via mobile data
                            break;
                    }
                }
            }
        }
        

        通过此设置,您将能够在连接更改时通知应用程序的组件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-25
          • 1970-01-01
          相关资源
          最近更新 更多