用于检查在线连接的动态 BroadcastReceiver

Dynamic BroadcastReceiver to Check Online Connectivity

我想动态设置 BroadcastReceiver 以仅当我的应用 运行 在前台时检查我是否在线。在我的 main class 中,我分别在 onResume 和 onPause 方法中创建了一个 Intent Filter、一个嵌套的 BroadcastReceiver Class 和最后 register/unregister 接收器。

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

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

这是我的 Class 的样子....

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();
    }
}}

添加 intentfilter CONNECTIVITY_ACTION

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

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

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

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

创建一个 class 来扩展 BroadcastReceiver 并且此接收器的 onReceive() 将捕获连接更改。在此class中创建一个函数来注册监听器

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 您可以轻松检查您的设备是否已连接到互联网。就 google.

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

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

别忘了添加权限

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

广播接收器的 onReceive() 将在连接发生变化时被调用,这意味着连接和断开连接。因此,无论何时您收到 braodcast,您都必须检查连接情况,如下所示

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

您需要创建一个服务,因为您希望在后台执行 long-running 任务。

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

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

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

您需要在服务 class 中向 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;
            }
        }
    }
}

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