扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.使用Settings.system.get/set
10年积累的成都网站建设、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有黄梅免费网站建设让你可以放心的选择与我们合作。
1.监听Context.getContentResolver().registerContentObserver(Settings.System.getUriFor(DEF_SENSOR_STATE), false, ContentObserver);
2.获取Settings.System.getInt(getApplicationContext().getContentResolver(), DEF_SENSOR_STATE, -1); // 获取
3.设置 Settings.System.putInt(getApplicationContext().getContentResolver(), "sensor_state", 2);
4.也可以notify :Context().getContentResolver().notifyChange(SLEEP_DURATION_URI, null);
根据contentprovider 生成对应的uri 就能监听 uri 对应的值 的改变
ContentObserver callback中查询 Cursor cursor = context . getContentResolver (). query ( STEP_HOURS_URI , 507 null , null , null , null ); 508 int hours = cursor . getExtras (). getInt ( STEP_HOURS_PATH ,0);
就这么简单,让我们开始吧。
看下最终实现的使用:
日志:
好了,新建一个AndroidLibray开始实现。
权限走一波:
首先,咱们需要一个监听网络状态的工具类
在lib中创建一个广播,然后再配置文件里注册一下。
完善下咱们的receiver:
监听接口:
manager:
再加上一个枚举类:
OK,一套正常操作,一个最普通网络监听类写完了。接着咱们尝试用注解,让这个小框架看的有档次些。
完善一下自定义注解:
然后来捋一下思路:
照样是固定三部曲,按照步骤来:
1.先完善我们的注册方法
在这里,我创建了一个方法封装类。比较简单: MethodManager
这里的 mMethodList 是方法封装类(MethodManager)的List,用来存储筛选后的MainActivity中方法,也就是网络监听方法。以下是方法的筛选:
咱们定义一个post方法,去完成这项工作:
这里实现了通过网络监听注解上方的参数,我们可以单独监听某一种网络状态的变化。比如
上方参数表明,只有在WIFI断开和连接的时候,方法才会做出响应。想要所有提示设置为AUTO就行啦。
OK,做完逻辑以后执行一下:
大功告成!跑一下看看效果!
项目地址:
是一个练手的小项目,实际网络请求在7.0时就能通过一个CallBack轻松搞定了。
我们做项目的时候,不可避免的要做网络状态的监听,一般我们都是抽取出一个工具类来实现,比如:
细致的你当然还会再写一个判断网络类型的方法,反手再来一个例:
然后就可以在相应的操作前进行判断网络的判断:
但是这样做也有些问题:
接下来就是本文的重点,如何通过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得前所未有的简单粗暴。
到这里就已经结束了,你的所有网络操作已经都可以清晰优雅的在订阅方法中进行处理了,当然你也可以继续往下看。
订阅方法必须填写一个NetType参数,可以通过NetType的值来判断当前网络类型。
@NetSubscribe中 netType为可选值,可以设置订阅的类型,可选值类型如下:
NetType.AUTO
这是默认值,任何网络状态发生变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由 WIFI 改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由移动网络改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
NetType.NONE
只有当网络丢失时,该类型订阅者才会被回调。
有人会觉得,我用个库爽就行了管它的原理干什么?
你放心,我只是小小的描述一下实现方式。
原理简单来说,就是在全局初始化的时候就绑定对网络的变化监听。然后将进行注册的父类所有的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 Java 反射机制遍历执行所有订阅方法。熟悉 EventBus 的小伙伴已经看出来了这里借鉴了一小部分 EventBus 的思想。
回到第一步,那么具体是如何绑定对网络状态变化的监听呢?
以前我们是通过注册广播来实现绑定网络变更的监听,在Android 7.0 以后,Google 基于性能和安全原因对广播进行了很多限制,比如监听网络变更的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则无法生效,而动态注册的方式虽然可以生效但毕竟不是最优解。
同样出于性能和安全,以及拥抱变化的角度,最终我们还是使用官方推荐的方式,利用 ConnectivityManager.NetworkCallback 来进行网络变化的监听,这是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市场占有率在 85%以上,随着国内各大厂商正在积极的推进适配普及Android Q,这个比例还会进一步增大,所以个人人认为无需过于担心低版本适配。
使用的时候出现这个问题是由于少添加了权限。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上这几个权限就好了:
附上原文地址:
目前android提供的工具没事,我们写工程都是自己写http请求,每次请求的时候打Log,记录请求的url和参数。请求回来了,打log,记录回来的数据,记录数据的状态,数据的内容。 目前只能这样。如果用模拟器的话,可以用vnStat或者CommView之类的监控电脑网卡的请求,间接的监控手机。一般开发用手机测试,这样就不行了。只能打log了
在一次项目,有个需求涉及到切后台回到app时,需要调起一个弹窗,以这个需求为例子,跟大家分享下我如何实现的(大牛轻拍 = = )
首先,我们在app初始化时,要注册activity生命周期的回调,我这边项目里在BaseApplication初始化时调用registerActivityLifecycleCallbacks()
它需要一个ActivityLifecycleCallbacks类型的参数
这个接口涉及到所有activity生命周期的回调
回归正题,先初始化ActivityLifecycleCallbacks,
我们现在要做的是后台回前台,所以我们只选择onActivityStarted和onActivityPaused
我是这么做判断的,给个foregroundActivityCount去表示当前app有多少个activity处于启动的状态,给个Boolean值appInBackground判断app是否处于后台,每次打开app,当启动一个activity时,就统计开启activity的次数,并且调用你所需要的监听方法;只要在start 和 stop时判断有所activity都stop了,当当前activity启动次数为0时,说明app处于后台;
初始化已经完成,接下来就是怎么调用了。我们去到后台回来时需要操作的activity或者fragment,在初始化时调取BaseApplication里面刚才设定的方法
在里面写下你后台回来时你需要的操作
还有一个缺陷,假如是在指定fragment做监听怎么办?其实都差不多的,fragment在activity里,绑定 了activity的生命周期,假设我们要在指定的fragment才调取这个方法,我们需要在加一层判断,判断当前fragment是否可见
这样,只要你每次从后台回来,都可以监听到,但如果不在当前fragment的话,就不会调用你设定的方法。
以上,是我刚接触不久的问题,分享给大家,写的不好的大家见谅,有问题可以评论或私信我,本人还是实习生,请轻拍= =
Android中网络情况时有变化,比如从有网到没网,从wifi到gprs,gprs又从cmwap到cmnet...等等!
如果你的程序有些功能是需要网络支持的,有时候就需要监听到网络的变化情况进行相应的处理。
比如说下载一个文件,如果突然断网了,怎么处理?网络又恢复了,如何监听到并重连?
当网络变化的时候系统会发出义个广播broadcast,只要在程序中注册一个广播接收器BroadcastReceiver,并在IntentFilter中添加相应的过滤,这样一旦网络有变化,程序就能监听到
public static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private void registerDateTransReceiver() {
Log.i(TAG, "register receiver " + CONNECTIVITY_CHANGE_ACTION);
IntentFilter filter = new IntentFilter();
filter.addAction(CONNECTIVITY_CHANGE_ACTION);
filter.setPriority(1000);
registerReceiver(new MyReceiver(), filter);
}
在MyReceiver中:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "PfDataTransReceiver receive action " + action);
if(TextUtils.equals(action, CONNECTIVITY_CHANGE_ACTION)){//网络变化的时候会发送通知
Log.i(TAG, "网络变化了");
return;
}
}
当网络变化时,从有网到没网也会发广播,就举的例子来说,如果下载时断网了,接收到广播的时候要判断当前网络是可用还是不可用状态,如果可用进行什么操作;不可用进行什么操作:
public static NetworkInfo getActiveNetwork(Context context){
if (context == null)
return null;
ConnectivityManager mConnMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnMgr == null)
return null;
NetworkInfo aActiveInfo = mConnMgr.getActiveNetworkInfo(); // 获取活动网络连接信息
return aActiveInfo;
}
这个方法返回的aActiveInfo可以判断网络的有无,如果返回的是null,这时候是断网了,如果返回对象不为空,则是连上了网。在返回的NetworkInfo对象里,可以有对象的方法获取更多的当前网络信息,比如是wifi还是cmwap等,就不多说了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流