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

时间:2018-04-13 13:58:45

标签: android broadcastreceiver

我有一个网络广播接收器,它可以监听网络状态并在设备断开互联网时禁用某些操作,否则启用它们。问题是它只在退出并重新启动应用程序后才能运行。在初始运行时,即使互联网被切断,该应用也会表现相同。

我创建了一个名为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();
}

1 个答案:

答案 0 :(得分:1)

分别在onStart(),onStop()上尝试注册和取消注册方法

活动注册BroadcastReceivers的唯一原因是以某种方式对当前活动使用事件,以通知用户事件。如果已调用onStop(),则Activity不再位于前台,因此无法更新User.but如果使用onCreate()和OnDestroy,如果系统终止您的进程,则无法保证调用onDestroy()为了节省内存。但是,如果该过程被终止,则该过程无论如何都不会接收广播

onDestroy is not guaranteed to be called