用于检查在线连接的动态 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;
}
}
}
}
通过此设置,您将能够在连接更改时通知应用程序的组件。
我想动态设置 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;
}
}
}
}
通过此设置,您将能够在连接更改时通知应用程序的组件。