10分钟让你实现在APP中对网络状态变化进行全局提示

栏目: Android · 发布时间: 6年前

内容简介:一个新项目刚刚开始推广工作,市场人员向我抱怨用户使用时总会出现各种各样的问题,大部分问题都是因为用户操作不当导致的,但是在用户眼中的结论就是“你们的 APP 不好用”。举一个例子,有的用户在使用时禁用了 APP 访问移动网络,或者有的用户干脆都没有打开移动数据开关或者 WIFI 开关。但是作为开发人员,我们应该避免用户思考,当用户使用出现问题时,APP 应该能够引导用户前往设置,故有此文。我们希望当用户网络连接不可用时,及时提醒用户当前的网络状态。当连接恢复时,将提示用的视图隐藏,并且我们希望这个提示视图
  • 永远不要期望用户按照你预设的步骤操作 APP

一个新项目刚刚开始推广工作,市场人员向我抱怨用户使用时总会出现各种各样的问题,大部分问题都是因为用户操作不当导致的,但是在用户眼中的结论就是“你们的 APP 不好用”。

举一个例子,有的用户在使用时禁用了 APP 访问移动网络,或者有的用户干脆都没有打开移动数据开关或者 WIFI 开关。但是作为开发人员,我们应该避免用户思考,当用户使用出现问题时,APP 应该能够引导用户前往设置,故有此文。

我们希望当用户网络连接不可用时,及时提醒用户当前的网络状态。当连接恢复时,将提示用的视图隐藏,并且我们希望这个提示视图可以工作在所有需要网络的页面中。

思路如下:使用 BaseActivity ,所有页面继承该文件,在该文件中实现根据网络状态显示提示、隐藏提示。

好了,废话少说,show u the code。

1. 实现监听网络状态变更的广播接收器

我们使用广播接收器接收网络变化的 Intent,这里直接使用静态注册的方法,因为我们不需要在每个页面单独注册这个 Receiver,那太重量级了。

NetworkConnectChangedReceiver.java

public class NetworkConnectChangedReceiver extends BroadcastReceiver { 
    private static final String TAG = "NetworkConnectChanged"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
        //**判断当前的网络连接状态是否可用*/ 
        boolean isConnected = NetUtils.isConnected(context); 
        Log.d(TAG, "onReceive: 当前网络 " + isConnected); 
        EventBus.getDefault().post(new NetworkChangeEvent(isConnected)); 
    } 
} 

事件Event:

public class NetworkChangeEvent { 
    public boolean isConnected; //是否存在网络 
 
    public NetworkChangeEvent(boolean isConnected) { 
        this.isConnected = isConnected; 
    } 
} 

判断网络连接是否可用:

/** 
     * 判断网络是否连接 
     * @param context 
     * @return 
     */ 
    public static boolean isConnected(Context context) { 
        ConnectivityManager connectivity = (ConnectivityManager) context 
                .getSystemService(Context.CONNECTIVITY_SERVICE); 
 
        if (null != connectivity) { 
            NetworkInfo info = connectivity.getActiveNetworkInfo(); 
            if (null != info && info.isConnected()) { 
                if (info.getState() == NetworkInfo.State.CONNECTED) { 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 

静态注册Receiver:

<receiver android:name=".receiver.NetworkConnectChangedReceiver"> 
    <intent-filter> 
        <action android:name="android.NET.conn.CONNECTIVITY_CHANGE" /> 
        <action android:name="android.Net.wifi.WIFI_STATE_CHANGED" /> 
        <action android:name="android.net.wifi.STATE_CHANGE" /> 
    </intent-filter> 
</receiver> 

2. 在 BaseActivity中监听事件并处理提示视图

看到 EventBus 的时候你是不是已经知道我的实现方式了(笑 XD),是的就是那个已经很久没人提了的 EventBus。当然还可以使用观察者模式来实现,这样就不用依赖第三方库了,但是我们需要的是快速实现,且对原有代码尽可能少的改动,引入观察者模式显然不如直接拿 EventBus来的方便。

BaseActivity.java

public class BaseActivity extends Activity { 
 
    protected Context mContext; 
    protected ACache mACache; 
    protected boolean mCheckNetWork = true; //默认检查网络状态 
    View mTipView; 
    WindowManager mWindowManager; 
    WindowManager.LayoutParams mLayoutParams; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        mContext = this; 
        this.mACache = ACache.get(mContext); 
        MyApp.addActivity(this); 
        initTipView();//初始化提示View 
        EventBus.getDefault().register(this); 
    } 
 
    @Override 
    protected void onResume() { 
        super.onResume(); 
        MobclickAgent.onResume(this); 
        //在无网络情况下打开APP时,系统不会发送网络状况变更的Intent,需要自己手动检查 
        hasNetWork(NetUtils.isConnected(mContext)); 
    } 
 
    @Override 
    protected void onPause() { 
        super.onPause(); 
        MobclickAgent.onPause(this); 
    } 
 
    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        MyApp.removeActivity(this); 
        EventBus.getDefault().unregister(this); 
    } 
 
    @Override 
    public void finish() { 
        super.finish(); 
        //当提示View被动态添加后直接关闭页面会导致该View内存溢出,所以需要在finish时移除 
        if (mTipView != null && mTipView.getParent() != null) { 
            mWindowManager.removeView(mTipView); 
        } 
    } 
 
    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onNetworkChangeEvent(NetworkChangeEvent event) { 
        hasNetWork(event.isConnected); 
    } 
 
    private void hasNetWork(boolean has) { 
        if (isCheckNetWork()) { 
            if (has) { 
                if (mTipView != null && mTipView.getParent() != null) { 
                    mWindowManager.removeView(mTipView); 
                } 
            } else { 
                if (mTipView.getParent() == null) { 
                    mWindowManager.addView(mTipView, mLayoutParams); 
                } 
            } 
        } 
    } 
 
    public void setCheckNetWork(boolean checkNetWork) { 
        mCheckNetWork = checkNetWork; 
    } 
 
    public boolean isCheckNetWork() { 
        return mCheckNetWork; 
    } 
 
    private void initTipView() { 
        LayoutInflater inflater = getLayoutInflater(); 
        mTipView = inflater.inflate(R.layout.layout_network_tip, null); //提示View布局 
        mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
        mLayoutParams = new WindowManager.LayoutParams( 
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 
                WindowManager.LayoutParams.TYPE_APPLICATION, 
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
                PixelFormat.TRANSLUCENT); 
        //使用非CENTER时,可以通过设置XY的值来改变View的位置 
        mLayoutParams.gravity = Gravity.TOP; 
        mLayoutParams.= 0; 
        mLayoutParams.= 0; 
    } 
} 

默认所有继承 BaseActivity 的页面当网络状况变化活无网络时都会显示提示,如果某个页面不需要网络状态提示,可以在该页面 onCreate 方法中调用 setCheckNetWork(false) 即可。

由于我全部页面都有一个50dp高度的 toolbar,所以我直接在 R.layout.layout_network_tip 文件中设置了上边距。你也可以在 BaseActivity 中通过方法来设置 mLayoutParams.x = 0;mLayoutParams.y = 0; 来使每个页面动态设置提示的位置。

最终效果如下图:

10分钟让你实现在APP中对网络状态变化进行全局提示

10分钟让你实现在APP中对网络状态变化进行全局提示

ToDo

所有页面在网络链接恢复后应该可以自动重新发起网络请求,实现原理其实也很简单,在BaseActivity中增加一个reConnect()的方法,在网络恢复去除提示View的时候调用。在各个页面中重写该方法即可。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Systems

Distributed Systems

Sukumar Ghosh / Chapman and Hall/CRC / 2014-7-14 / USD 119.95

Distributed Systems: An Algorithmic Approach, Second Edition provides a balanced and straightforward treatment of the underlying theory and practical applications of distributed computing. As in the p......一起来看看 《Distributed Systems》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器