收听网络的广播接收器仅在退出并重新启动应用程序后才有效
Broadcast receiver that listens to the network only works after exiting and restarting the app
我有一个网络广播接收器,它侦听网络状态并在设备断开与 Internet 的连接时禁用某些操作,否则启用它们。问题是它仅在退出并重新启动应用程序后才有效。在初始 运行 时,即使互联网被切断,该应用程序的行为也是一样的。
我做了一个 class 叫做 NetworkStateReceiver
:
public class NetworkStateReceiver extends BroadcastReceiver {
public interface NetworkListener {
void onNetworkAvailable();
void onNetworkUnavailable();
}
private NetworkListener networkListener;
public NetworkStateReceiver(NetworkListener networkListener) {
this.networkListener = networkListener;
}
public void onReceive(Context context, Intent intent) {
if (intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Log.d("app", "There's no network connectivity");
networkListener.onNetworkUnavailable();
} else {
Log.i("app", "Network connected");
networkListener.onNetworkAvailable();
}
}
}
我在我的 MainActivity 上实例化并注册它 onCreate
:
networkStateReceiver = new NetworkStateReceiver(new NetworkStateReceiver.NetworkListener() {
@Override
public void onNetworkAvailable() {
btnViewDiscoverFeed.setEnabled(true);
btnViewExplore.setEnabled(true);
btnViewNotification.setEnabled(true);
btnViewUserProfile.setEnabled(true);
setActiveFragment(activeFragment);
viewPager.disableScroll(false);
}
@Override
public void onNetworkUnavailable() {
btnViewDiscoverFeed.setEnabled(false);
btnViewExplore.setEnabled(false);
btnViewNotification.setEnabled(false);
btnViewUserProfile.setEnabled(false);
setActiveFragment(2);
viewPager.disableScroll(true);
}
});
registerReceiver(networkStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
然后,我在 onDestroy
:
上注销了它
@Override
public void onDestroy(){
unregisterReceiver(networkStateReceiver);
super.onDestroy();
}
分别在 onStart()、onStop() 中尝试注册和取消注册方法,
Activity 注册 BroadcastReceivers 的唯一原因是以某种方式在当前 activity 上使用事件来通知用户事件。如果 onStop() 已经被调用,那么 Activity 不再在前台,因此不能更新 User.but 如果你使用 onCreate() 和 OnDestroy,onDestroy() 不保证被调用如果系统为了节省内存而杀死你的进程。但是,如果进程被杀死,进程无论如何都不会接收广播
我有一个网络广播接收器,它侦听网络状态并在设备断开与 Internet 的连接时禁用某些操作,否则启用它们。问题是它仅在退出并重新启动应用程序后才有效。在初始 运行 时,即使互联网被切断,该应用程序的行为也是一样的。
我做了一个 class 叫做 NetworkStateReceiver
:
public class NetworkStateReceiver extends BroadcastReceiver {
public interface NetworkListener {
void onNetworkAvailable();
void onNetworkUnavailable();
}
private NetworkListener networkListener;
public NetworkStateReceiver(NetworkListener networkListener) {
this.networkListener = networkListener;
}
public void onReceive(Context context, Intent intent) {
if (intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Log.d("app", "There's no network connectivity");
networkListener.onNetworkUnavailable();
} else {
Log.i("app", "Network connected");
networkListener.onNetworkAvailable();
}
}
}
我在我的 MainActivity 上实例化并注册它 onCreate
:
networkStateReceiver = new NetworkStateReceiver(new NetworkStateReceiver.NetworkListener() {
@Override
public void onNetworkAvailable() {
btnViewDiscoverFeed.setEnabled(true);
btnViewExplore.setEnabled(true);
btnViewNotification.setEnabled(true);
btnViewUserProfile.setEnabled(true);
setActiveFragment(activeFragment);
viewPager.disableScroll(false);
}
@Override
public void onNetworkUnavailable() {
btnViewDiscoverFeed.setEnabled(false);
btnViewExplore.setEnabled(false);
btnViewNotification.setEnabled(false);
btnViewUserProfile.setEnabled(false);
setActiveFragment(2);
viewPager.disableScroll(true);
}
});
registerReceiver(networkStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
然后,我在 onDestroy
:
@Override
public void onDestroy(){
unregisterReceiver(networkStateReceiver);
super.onDestroy();
}
分别在 onStart()、onStop() 中尝试注册和取消注册方法,
Activity 注册 BroadcastReceivers 的唯一原因是以某种方式在当前 activity 上使用事件来通知用户事件。如果 onStop() 已经被调用,那么 Activity 不再在前台,因此不能更新 User.but 如果你使用 onCreate() 和 OnDestroy,onDestroy() 不保证被调用如果系统为了节省内存而杀死你的进程。但是,如果进程被杀死,进程无论如何都不会接收广播