Android BroadcastReceiver onReceive() called twice on android 4.0

前端 未结 15 2330
梦谈多话
梦谈多话 2020-12-29 20:38

I faced to one problem on android 4.0.3 (on 4.1.2 it works fine). I have in my Activity BroadcastReceiver. When I send a broadcast, method onReceive() called always twice. P

15条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-29 21:03

    I had fixed this issue by using a static value.

    Please find my code below.

    My Activity

    private static Snackbar mSnackbar;
    private NetworkChangeReceiver mNetworkChangeReceiver;
    
    @Override
    protected void onResume() {
        super.onResume();
        registerReceivers();
    }
    @Override
    protected void onPause() {
        super.onPause();
        unRegisterReceivers();
    }
    private void registerReceivers() {
        mNetworkChangeReceiver = new NetworkChangeReceiver() {
            @Override
            protected void onNetworkChange(boolean status) {
                if (!status) {
                    if (mSnackbar == null) {
                        mSnackbar = Snackbar
                                .make(drawer, R.string.no_internet, Snackbar.LENGTH_INDEFINITE)
                                .setActionTextColor(Color.YELLOW)
                                .setAction(R.string.ok, new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                    }
                                });
                        mSnackbar.show();
                    }
                } else {
                    if (mSnackbar != null) {
                        mSnackbar.dismiss();
                        mSnackbar = null;
                    }
                }
            }
        };
        IntentFilter nwStateChangeFilter = new IntentFilter();
        nwStateChangeFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        nwStateChangeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        registerReceiver(mNetworkChangeReceiver, nwStateChangeFilter);
    }
    private void unRegisterReceivers() {
        unregisterReceiver(mNetworkChangeReceiver);
    }
    

    NetworkChangeReceiver.Class

    public abstract class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) { // connected to the internet
                    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI){
                        // connected to wifi
                        onNetworkChange(true);
                    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                        // connected to the mobile provider's data plan
                        onNetworkChange(true);
                    } else {
                        // not connected to the internet
                        onNetworkChange(false);
                    }
            } else {
                // not connected to the internet
                onNetworkChange(false);
            }
        }
        protected abstract void onNetworkChange(boolean status);
    }
    

提交回复
热议问题