收听网络的广播接收器仅在退出并重新启动应用程序后才有效

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() 不保证被调用如果系统为了节省内存而杀死你的进程。但是,如果进程被杀死,进程无论如何都不会接收广播

onDestroy is not guaranteed to be called