动态广播员检查在线连接



我想动态设置一个广播员,以检查我的应用在前景中运行时是否在线。在我的主类中,我创建了一个意图过滤器,一个嵌套的broadcastreceiver类,最后在on Resume和onpause方法中分别注册/取消接收器。

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

如果没有,我该如何创建此动态广播接收器才能在我的应用程序运行时执行?

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

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

添加连接操作 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;
}

这是这样做的标准方法。

创建一个接口,该接口将具有两种方法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您可以轻松检查设备是否连接到Internet。只是Google。

现在,假设您希望您的主要目的性听取NetWrork的更改,您要做的就是在主要活动调用中实现NetworkConnectivityListener,并创建一个通过Main Activitive的NetworkBroadCastreCeiver的实例,它将开始获得网络的上下文更新。

添加IntentFilter Connectivity_Action

您将需要创建一个服务,因为您希望在后台执行长期运行的任务。

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

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

stopWithTask会导致所有活动被销毁时被破坏(默认值为真)。

您将需要注册并登记向服务类中的Changnitive_change行动注册并取消广播。

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

,然后在广播中您必须收听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;
            }
        }
    }
}

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

最新更新