TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

android 自定义网络变化时全局提醒(转)

Laughing博主
2020-12-06
/
0 评论
/
1,253 阅读
/
326 个字
/
百度已收录
12/06
本文最后更新于2024年03月18日,已超过185天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

实现思路

  1. 定时获取当前网络状态
  2. 利用广播发送当前网络状态,并且触发网络状态改变的监听
  3. 在baseActivity中实现网络状态改变的监听,并作出相应的响应(例如显示没有网络的布局)

代码实现

定义网络状态变化监听接口

public interface CheckNetworkStatusChangeListener {
    /*
      网络变化会调用
     */
    void onEvent(Status status);

    /**
     * 网络状态
     * TYPE_UN_NETWORK 沒有网络
     * TYPE_WIFI WiFi连接
     * TYPE_MOBILE 移动数据
     */
    enum Status {
        TYPE_UN_NETWORK,
        TYPE_WIFI,
        TYPE_MOBILE,
    }
}

定义接收网络变化的广播

public class CheckNetworkStatusChangeReceiver extends BroadcastReceiver {
    public static final String EVENT = "event";
    public static final String ACTION="action";
    private CheckNetworkStatusChangeListener mCheckNetworkStatusChangeListener;

    public CheckNetworkStatusChangeReceiver() {

    }

    public void setCheckNetworkStatusChangeListener(CheckNetworkStatusChangeListener mCheckNetworkStatusChangeListener) {
        this.mCheckNetworkStatusChangeListener = mCheckNetworkStatusChangeListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        CheckNetworkStatusChangeListener.Status mStatus = (CheckNetworkStatusChangeListener.Status) intent.getSerializableExtra(EVENT);
        mCheckNetworkStatusChangeListener.onEvent(mStatus);
    }
}

检测当前网络状态工具类

public class NetworkUtil {
    /**
     * 获取当前网络类型 CheckNetworkStatusChangeListener.Status
     *
     * @return 返回网络类型 CheckNetworkStatusChangeListener.Status
     */
    public static CheckNetworkStatusChangeListener.Status getNetworkConnectionType(Context context) {
        //获取连接管理器
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager == null)
            return CheckNetworkStatusChangeListener.Status.TYPE_UN_NETWORK;
        //获取网络连接信息
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isAvailable()) {
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                return CheckNetworkStatusChangeListener.Status.TYPE_WIFI;
            }
            if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                return CheckNetworkStatusChangeListener.Status.TYPE_MOBILE;
            }
        }
        return CheckNetworkStatusChangeListener.Status.TYPE_UN_NETWORK;
    }
}

自定义Handler,发送广播

public class SimpleHandler<T extends Activity> extends Handler {
    WeakReference<T> weakReference;

    public SimpleHandler(T t) {
        this.weakReference = new WeakReference<>(t);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (weakReference.get() != null) {
            //发送广播
            Intent mCheckNetworkIntent = new Intent();
            mCheckNetworkIntent.setAction(CheckNetworkStatusChangeReceiver.ACTION);
            CheckNetworkStatusChangeListener.Status status= (CheckNetworkStatusChangeListener.Status) msg.obj;
            mCheckNetworkIntent.putExtra(CheckNetworkStatusChangeReceiver.EVENT,status);
            weakReference.get().sendBroadcast(mCheckNetworkIntent);
        }
    }

}

实现每秒检测1次网络状态,因为是耗时操作所有在子线程中去获取当前网络状态

@Override
    protected void onResume() {
        super.onResume();
        new Thread(mRunnable).start();
    }
 
    Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
 
            //实现每隔一秒检测一次网络
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                CheckNetworkStatusChangeListener.Status status = NetworkUtil.getNetworkConnectionType(BaseActivity.this);
                Message message = new Message();
                message.obj = status;
                simpleHandler.sendMessage(message);
            }
 
        }
    };

检测网络状态后发送Message到handle,handle去发送广播,这注意handle内存泄漏

public class SimpleHandler<T extends Activity> extends Handler {
    WeakReference<T> weakReference;
 
    public SimpleHandler(T t) {
        this.weakReference = new WeakReference<>(t);
    }
 
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (weakReference.get() != null) {
            //发送广播
            Intent mCheckNetworkIntent = new Intent();
            mCheckNetworkIntent.setAction(CheckNetworkStatusChangeReceiver.ACTION);
            CheckNetworkStatusChangeListener.Status status= (CheckNetworkStatusChangeListener.Status) msg.obj;
            mCheckNetworkIntent.putExtra(CheckNetworkStatusChangeReceiver.EVENT,status);
            weakReference.get().sendBroadcast(mCheckNetworkIntent);
        }
    }
}

BaseActivity完整代码

public class BaseActivity extends AppCompatActivity implements CheckNetworkStatusChangeListener {
    private CheckNetworkStatusChangeReceiver mCheckNetworkStatusChangeReceiver;
    private String LOG = BaseActivity.class.getSimpleName();
    private SimpleHandler<BaseActivity> simpleHandler;
    private NetworkStatusLayout mNetworkStatusLayout;
    private boolean checkNetworkStatusChangeListenerEnable=true;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_base);
        init();
        new Thread(mRunnable).start();
    }

    @Override
    public void setContentView(int layoutResID) {
        LinearLayout mRootLayout = findViewById(R.id.root_linear_layout);
        //将网络状态view添加到根视图
        mNetworkStatusLayout = new NetworkStatusLayout(this);
        //默认隐藏状态
        mNetworkStatusLayout.setVisibility(View.GONE);
        mRootLayout.addView(mNetworkStatusLayout, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        //将子类的layout,添加到根目录
        View mContentView = LayoutInflater.from(this).inflate(layoutResID, null);
        mRootLayout.addView(mContentView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }

    private void init() {
        mCheckNetworkStatusChangeReceiver = new CheckNetworkStatusChangeReceiver();
        mCheckNetworkStatusChangeReceiver.setCheckNetworkStatusChangeListener(this);
        IntentFilter mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(CheckNetworkStatusChangeReceiver.ACTION);
        registerReceiver(mCheckNetworkStatusChangeReceiver, mIntentFilter);
        simpleHandler = new SimpleHandler<BaseActivity>(this);
    }

    public void setCheckNetworkStatusChangeListenerEnable(boolean checkNetworkStatusChangeListener) {
        this.checkNetworkStatusChangeListenerEnable = checkNetworkStatusChangeListener;
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    Runnable mRunnable = new Runnable() {
        @Override
        public void run() {

            //实现每隔一秒检测一次网络
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                CheckNetworkStatusChangeListener.Status status = NetworkUtil.getNetworkConnectionType(BaseActivity.this);
                Message message = new Message();
                message.obj = status;
                simpleHandler.sendMessage(message);
            }

        }
    };


    @Override
    public void onEvent(Status status) {
        Log.w(LOG, "status: " + status.name());
        if (!checkNetworkStatusChangeListenerEnable)
            return;
        if (status == Status.TYPE_UN_NETWORK) {
            if (mNetworkStatusLayout.getVisibility() == View.GONE)
                mNetworkStatusLayout.setVisibility(View.VISIBLE);
        } else {
            if (mNetworkStatusLayout.getVisibility() == View.VISIBLE)
                mNetworkStatusLayout.setVisibility(View.GONE);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mCheckNetworkStatusChangeReceiver);
        simpleHandler.removeCallbacks(mRunnable);
    }
}

那么下一步就是在onEvent()判断网络状态,没有网络时的页面提示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@color/gray"
    android:layout_height="50dp">
    <TextView
        android:id="@+id/tv_network_status"
        android:layout_centerInParent="true"
        android:text="@string/not_network"
        android:textColor="@color/red"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

使用

activity继承自BaseActivity

public class MainActivity extends BaseActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("我是首页");
    }
}

源码下载

链接: https://pan.baidu.com/s/1G0A1Irlk0Iw_DjtKPhrWUA 密码: jmfh

朗读
赞(23)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/app/android-user-defined-global-alert-when-network-changes-1.html(转载时请注明本文出处及文章链接)

评论 (0)
  1. 中国人 闲逛
    MacOS · Google Chrome

    非常好用的

    2018-06-10 回复