android通过BroadcastReceiver监听网络和NFC状态

项目使用手机NFC读身份证,测试提bug,页面不提示NFC状态和网络连接状态。改为通过监听提示用户,mark一下:

public class MainActivity extends Activity {

    private Context mContext;
    private boolean isSupportNfc = true;
    NetWorkStateReceiver netWorkStateReceiver;
    NFCStateReceiver nfcStateReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (netWorkStateReceiver == null) {
            netWorkStateReceiver = new NetWorkStateReceiver();
        }
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(netWorkStateReceiver, filter);
//
        if (nfcStateReceiver == null) {
            nfcStateReceiver = new NFCStateReceiver();
        }
        IntentFilter nfcFilter = new IntentFilter();
        filter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
        registerReceiver(nfcStateReceiver, filter);
        checkNFC();
        startReader();
    }

    private void startReader(){
       //读证
    }


    private void checkNFC(){
        isSupportNfc = isSupportNfc(this);
        if (!isSupportNfc) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("手机不支持NFC功能!");
            builder.create();
            builder.show();
        }
    }

    public static boolean isSupportNfc(Context context){
        PackageManager pm = context.getPackageManager();
        return pm.hasSystemFeature("android.hardware.nfc");
    }

    //NFC状态监听
    private class NFCStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                NfcManager manager = (NfcManager) mContext.getSystemService(Context.NFC_SERVICE);
                NfcAdapter adapter = manager.getDefaultAdapter();
                if (adapter != null) {
                    if (!adapter.isEnabled()){
                        TdrIDReader.stop(mContext);
                        mTxtWarning.setVisibility(View.VISIBLE);
                        mTxtWarning.setText("请开启NFC");
//                        Toast.makeText(mContext,"请开启NFC", Toast.LENGTH_LONG).show();
                    }else {
                        mTxtWarning.setVisibility(View.GONE);
                        startReader();
                    }
                }
            } catch (Exception e) {
                mTxtWarning.setVisibility(View.VISIBLE);
                mTxtWarning.setText("请开启NFC");
            }
        }
    }

    //网络状态监听
    private class NetWorkStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                ConnectivityManager connectivity = (ConnectivityManager) mContext
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                if (connectivity != null) {
                    NetworkInfo info = connectivity.getActiveNetworkInfo();
                    if (info != null && info.isConnected()) {
                        if (info.getState() != NetworkInfo.State.CONNECTED) {
                            mTxtWarning.setVisibility(View.VISIBLE);
                            mTxtWarning.setText("您的网络未开启,请检查您的网络配置");
                        } else {
                            mTxtWarning.setVisibility(View.GONE);
                        }
                    }else {
                        mTxtWarning.setVisibility(View.VISIBLE);
                        mTxtWarning.setText("您的网络未开启,请检查您的网络配置");
                    }
                }
            } catch (Exception e) {
                mTxtWarning.setVisibility(View.VISIBLE);
                mTxtWarning.setText("您的网络未开启,请检查您的网络配置");
            }
        }
    }

}

 

注:华为手机下拉通知栏,本以为当前Activity会进入onPause()结果并没有,查资料实验最后发现:

onPause()是否调用的关键就是,是否有另一个Activity参与进来了。
而网上流传甚广的onPause()onStop()调用中提到的“遮挡”,应该修正为“被Activity遮挡”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 中,可以通过监听系统的网络状态变化来实现网络连接状态的判断。具体实现方式如下: 1. 在 AndroidManifest.xml 文件中添加网络状态权限: ``` xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` 2. 在需要监听网络状态变化的地方,注册广播接收器: ``` java IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkChangeReceiver, intentFilter); ``` 3. 实现广播接收器类: ``` java public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { // 网络已连接 } else { // 网络断开 } } } } ``` 完整代码如下: ``` java public class MainActivity extends AppCompatActivity { private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册广播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 取消注册广播接收器 unregisterReceiver(networkChangeReceiver); } /** * 网络状态变化广播接收器 */ public static class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { // 网络已连接 } else { // 网络断开 } } } } } ``` 在以上代码中,我们首先在 onCreate() 方法中注册了一个广播接收器,并指定了监听的广播事件为 ConnectivityManager.CONNECTIVITY_ACTION。然后在广播接收器的 onReceive() 方法中,我们通过 ConnectivityManager 获取当前网络状态,并判断网络是否可用。最后,在 onDestroy() 方法中取消注册广播接收器。 至此,我们就实现了 Android 监听网络状态的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值