当前位置: 代码迷 >> 综合 >> 4.1.3.3 Android 网络状态监听的静态广播接受者和动态广播接受者Broadcast-Receiver
  详细解决方案

4.1.3.3 Android 网络状态监听的静态广播接受者和动态广播接受者Broadcast-Receiver

热度:99   发布时间:2023-12-16 16:00:23.0
静态注册广播接收者。
可以理解为静态变量,可以直接使用。 可以直接使用,用完生命周期就结束了,需要用的时候再直接使用。
动态注册广播接收者,可以理解为实例变量,需要对象才能调用。


静态注册广播接收者
<!--组册广播接收者:告诉系统这个接收者,关注,检测哪一种广播消息,-->
        <receiver android:name=".receivers.NetworkReceiver"
            >
            <!--使用intent filter 来告诉Android系统,这个接收者需要接受哪种广播消息-->
            <intent-filter>
                <!--设置接受者接收的消息类型action,代表intent中getAction()返回的内容-->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>






public class NetworkReceiver extends BroadcastReceiver{
    /**
     * 广播接收者当收到广播信息(Intent数据)的时候,进行回调,大部分情况,这个方法是运行在主线程的。
     * 可以通过手动设置的形式让这个方法在子线程执行,
     * @param context
     * @param intent
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        //广播中的重要数据:
        //1.ACTION-》getAction()返回当前广播的类型。!!!需要背下来,
        Log.d("NetworkReceiver", "收到广播消息" +intent );
        String action = intent.getAction();
        //2.判断广播消息的类型,使用网络变化状态为例,
        if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            ConnectivityManager connectivitManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            //如果是WIFI 就是Context.WIFI_SERVICEI
            //如果是短信Context.TELEPHONY_SERVICE
            NetworkInfo activeNetworkInfo = connectivitManager.getActiveNetworkInfo();


           String netWorkState="无网络";


            if (activeNetworkInfo != null) {
                //获取枚举类型的 网络状态
                NetworkInfo.State state = activeNetworkInfo.getState();
                Log.d("NetworkRecevier", "当前状态 " + state);
                activeNetworkInfo.getReason();
                activeNetworkInfo.getSubtype();//当前是3G,还是WiFI
                String typeName = activeNetworkInfo.getTypeName();
                int type = activeNetworkInfo.getType();
                switch (type){
                    case ConnectivityManager.TYPE_MOBILE:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到手机网络";
                        }
                        break;
                    case ConnectivityManager.TYPE_WIFI:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到wifi网络";
                        }
                        break;
                    default:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到其他网络";
                        }
                        break;
                }
                Log.d("NetworkRecevier", "TypeName"+typeName );


                int subtype = activeNetworkInfo.getSubtype();
                switch (subtype){
                    case ConnectivityManager.TYPE_MOBILE_DUN:
                        break;
                }


                String subTypeName = activeNetworkInfo.getSubtypeName();


                Log.d("NetworkRecevier", "subTypeName"+subTypeName );
            }else{
                Log.d("NetworkRecevier", "已经断线");
            }
            sendNotification(context,"网络变化 ",netWorkState);
        }
    }


    /**
     * 发送通知消息
     * @param context
     * @param content
     */
    public static void sendNotification(Context context,String title,String content){
        //1.
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title).setContentText(content);
        Notification n = builder.build();
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(188,n);
    }
}
  相关解决方案