Android官方开发文档Training系列课程中文版:网络操作之网络管理

原文地址:http://android.xsoftlab.net/training/basics/network-ops/managing.html

这节课将会学习如何对网络资源的使用情况拥有更细粒度的控制力。如果应用程序经常执行大量的网络操作,那么程序应当提供一项设置,以便用户可以控制应用的数据习性,比如多久同步一次数据,是否只在WIFI情况下上传下载数据,是否使用移动数据流量等等。随着这些设置能力的提供,用户可以设置应用在接近网络流量限制的情况下禁止应用再次访问网络,因为用户可以直接控制应用程序可以使用多少数据流量。

检测设备的网络连接状况

一台设备拥有多种类型的网络连接。这节课所关注的是使用WI-FI或者移动数据网络连接。有关全面的网络连接类型,请参见ConnectivityManager.

WIFI通常情况下很快,而移动数据通常按量收费,还很昂贵。APP的通常使用策略是在WIFI网络可用的情况下才去获取大量的数据。

在执行网络操作之前,最好是检查一下网络的连接状态。执行网络状态检查,通常会使用到下面的类:

  • ConnectivityManager : 可以获取当前网络的连接状况,还可以在网络连接状况发生变化时通知应用程序。
  • NetworkInfo : 描述了指定类型的网络接口状态。

下面的代码测试了WIFI及移动数据的连接状态。它会检查这些网络接口是否可用及是否已连接:

private static final String DEBUG_TAG = "NetworkStatusExample";
...      
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
boolean isWifiConn = networkInfo.isConnected();
networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileConn = networkInfo.isConnected();
Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn);
Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);

需要注意的是,不应当关注网络是否可用,而应该在每次执行网络操作之前检查isConnected(),因为isConnected()会处理这些状态:移动网络信号不好、飞行模式或者受限的后台数据。

有一种更简明的方式可以用来检查网络接口是否可用:getActiveNetworkInfo()方法会返回一个NetworkInfo的实例,这个对象代表了所能搜索到的第一个已连接的网络接口,如果没有搜索到任何网络连接则会返回null,null代表了互联网络连接不饿用。

public boolean isOnline() {ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();return (networkInfo != null && networkInfo.isConnected());
}  

你可以使用NetworkInfo.DetailedState查询更细粒度的网络状态,不过很少会被用到。

管理网络的使用

可以通过实现一个参数设置的Activity来让用户控制网络资源的使用。

  • 你可能只允许用户在WIFI网络状态下才可以上传视频资源。
  • 你可能要允许用户设置在指定的条件下才去同步数据,比如:网络可用状态下,或者隔多长时间等等。

为了使APP可以支持网络的访问及网络使用的管理,那么清单文件中必须包含以下权限以及意图过滤器:

  • 清单文件应当包含以下权限:

    • android.permission.INTERNET 允许应用程序可以访问网络插口(Socket)。
    • android.permission.ACCESS_NETWORK_STATE 允许应用程序可以访问网络信息。
  • 你可以通过声明ACTION_MANAGE_NETWORK_USAGE的意图过滤器来指明当前的Activity提供了控制数据使用策略的功能。当应用中含有允许用户管理网络数据使用策略的Activity时,应当声明该意图过滤器。在这里的示例程序中,这个行为被SettingsActivity所处理,这个Activity允许用户决定什么时候开始下载。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android.networkusage"...><uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><application
        ...>...<activity android:label="SettingsActivity" android:name=".SettingsActivity"><intent-filter><action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity></application>
</manifest>

实现一个参数配置Activity

正如你在上面所看到的,SettingsActivity的意图过滤器含有一个ACTION_MANAGE_NETWORK_USAGE的行为,SettingsActivity是PreferenceActivity的子类,它的展示效果如下:

这里写图片描述 这里写图片描述

下面是SettingsActivity的代码,注意它实现了OnSharedPreferenceChangeListener接口。每当用户更改了参数,系统会调用onSharedPreferenceChanged()方法,该方法内将refreshDisplay设置为true,这是因为当用户返回到主界面是需要刷新界面。

public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Loads the XML preferences fileaddPreferencesFromResource(R.xml.preferences);}@Overrideprotected void onResume() {super.onResume();// Registers a listener whenever a key changes            getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);}@Overrideprotected void onPause() {super.onPause();// Unregisters the listener set in onResume().// It's best practice to unregister listeners when your app isn't using them to cut down on // unnecessary system overhead. You do this in onPause().            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);    }// When the user changes the preferences selection, // onSharedPreferenceChanged() restarts the main activity as a new// task. Sets the refreshDisplay flag to "true" to indicate that// the main activity should update its display.// The main activity queries the PreferenceManager to get the latest settings.@Overridepublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {    // Sets refreshDisplay to true so that when the user returns to the main// activity, the display refreshes to reflect the new settings.NetworkActivity.refreshDisplay = true;}
}

响应参数的变更

当用户更改了参数时,这个行为会使APP的习性也跟着发生了变化。在下面的代码段中,APP会在onStart()方法中检查参数配置,如果在设备的当前连接状态与设置之间有相匹配的,那么APP将会下载信息,并刷新界面。

public class NetworkActivity extends Activity {public static final String WIFI = "Wi-Fi";public static final String ANY = "Any";private static final String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";// Whether there is a Wi-Fi connection.private static boolean wifiConnected = false; // Whether there is a mobile connection.private static boolean mobileConnected = false;// Whether the display should be refreshed.public static boolean refreshDisplay = true;// The user's current network preference setting.public static String sPref = null;// The BroadcastReceiver that tracks network connectivity changes.private NetworkReceiver receiver = new NetworkReceiver();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Registers BroadcastReceiver to track network connection changes.IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);receiver = new NetworkReceiver();this.registerReceiver(receiver, filter);}@Override public void onDestroy() {super.onDestroy();// Unregisters BroadcastReceiver when app is destroyed.if (receiver != null) {this.unregisterReceiver(receiver);}}// Refreshes the display if the network connection and the// pref settings allow it.@Overridepublic void onStart () {super.onStart();  // Gets the user's network preference settingsSharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);// Retrieves a string value for the preferences. The second parameter// is the default value to use if a preference value is not found.sPref = sharedPrefs.getString("listPref", "Wi-Fi");updateConnectedFlags(); if(refreshDisplay){loadPage();    }}// Checks the network connection and sets the wifiConnected and mobileConnected// variables accordingly. public void updateConnectedFlags() {ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();if (activeInfo != null && activeInfo.isConnected()) {wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;} else {wifiConnected = false;mobileConnected = false;}  }// Uses AsyncTask subclass to download the XML feed from stackoverflow.com.public void loadPage() {if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected))|| ((sPref.equals(WIFI)) && (wifiConnected))) {// AsyncTask subclassnew DownloadXmlTask().execute(URL);} else {showErrorPage();}}
...}

监听连接变化

最后一个问题就是BroadcastReceiver的子类NetworkReceiver。当设备的网络连接发生变化时,NetworkReceiver会拦截CONNECTIVITY_ACTION的行为,这个行为用于检查当前是哪种网络连接状态,并会相应的将wifiConnected和mobileConnected设置为true或者false。那么在NetworkActivity.refreshDisplay设置为true时,那么APP会只下载最近一次的资源。

设置的广播监听器需要在系统不需要的情况下解除注册。示例应用中在onCreate()方法中将NetworkReceiver注册到系统,在onDestroy()方法中将其注销。这比在清单文件中注册更为轻量。当在清单文件中声明了广播接收器,系统会在任何时候调用该接收器,甚至是很久都没有启动过。在Activity中注册与注销广播接收器,可以确保用户在离开APP后系统不会再调用广播接收器。如果在清单文件中注册了广播接收器,那么你必须清楚在什么地方需要它,你可以适当的使用setComponentEnabledSetting()方法来开启或者关闭它。

以下是 NetworkReceiver 的实现内容:

public class NetworkReceiver extends BroadcastReceiver {   @Override
public void onReceive(Context context, Intent intent) {ConnectivityManager conn =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = conn.getActiveNetworkInfo();// Checks the user prefs and the network connection. Based on the result, decides whether// to refresh the display or keep the current display.// If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection.if (WIFI.equals(sPref) && networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {// If device has its Wi-Fi connection, sets refreshDisplay// to true. This causes the display to be refreshed when the user// returns to the app.refreshDisplay = true;Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show();// If the setting is ANY network and there is a network connection// (which by process of elimination would be mobile), sets refreshDisplay to true.} else if (ANY.equals(sPref) && networkInfo != null) {refreshDisplay = true;// Otherwise, the app can't download content--either because there is no network// connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there // is no Wi-Fi connection.// Sets refreshDisplay to false.} else {refreshDisplay = false;Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 728. 自除数

1. 题目 自除数 是指可以被它包含的每一位数除尽的数。 例如&#xff0c;128 是一个自除数&#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 还有&#xff0c;自除数不允许包含 0 。 给定上边界和下边界数字&#xff0c;输出一个列表&#xff0…

论文浅尝 - AAAI2020 | 通过句子级语义匹配和答案位置推断改善问题生成

论文笔记整理&#xff1a;王春培&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/1912.00879.pdf动机本文主要聚焦问答系统&#xff08;Q&A&#xff09;的反问题---问题生成&#xff08;Question Generation&#xff0c;Q&G&#xff09;。问题生成的…

美团深度学习系统的工程实践

背景 深度学习作为AI时代的核心技术&#xff0c;已经被应用于多个场景。在系统设计层面&#xff0c;由于其具有计算密集型的特性&#xff0c;所以与传统的机器学习算法在工程实践过程中存在诸多的不同。本文将介绍美团平台在应用深度学习技术的过程中&#xff0c;相关系统设计的…

一个程序员的理财观

文 | 王喆你好&#xff0c;我叫王喆&#xff0c;看过我技术文章的朋友知道&#xff0c;我是一个搞推荐系统的机器学习工程师&#xff0c;不熟悉的同学也没关系&#xff0c;就当我是一名普普通通的程序员就好。但今天我们不谈技术&#xff0c;也不谈996这些烦人的话题&#xff0…

2020年最值得收藏的60个AI开源工具

原本链接:https://www.infoq.cn/article/2uabiqaxicqifhqikeqw 本文&#xff0c;InfoQ梳理了60个2019年至今GitHub上热门的开源工具&#xff0c;献给那些对新征程满怀期待的开发者们。Flair (顶级 NLP 库&#xff09;2018 年是 NLP 井喷的一年。像 ELMo 和谷歌 BERT 这样的库层…

LeetCode 942. 增减字符串匹配

1. 题目 给定只含 “I”&#xff08;增大&#xff09;或 “D”&#xff08;减小&#xff09;的字符串 S &#xff0c;令 N S.length。 返回 [0, 1, …, N] 的任意排列 A 使得对于所有 i 0, …, N-1&#xff0c;都有&#xff1a; 如果 S[i] "I"&#xff0c;那么…

Netty堆外内存泄露排查盛宴

导读 Netty 是一个异步事件驱动的网络通信层框架&#xff0c;用于快速开发高可用高性能的服务端网络框架与客户端程序&#xff0c;它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。 Netty 底层基于 JDK 的 NIO&#xff0c;我们为什么不直接基于 JDK 的 NIO 或者其他NIO框架…

论文浅尝 - ESWC2020 | YAGO 4: A Reason-able Knowledge Base

论文笔记整理&#xff1a;叶群&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。会议&#xff1a;ESWC 2020链接&#xff1a;https://suchanek.name/work/publications/eswc-2020-yago.pdfIntroductionYAGO是世界上最大的链接数据库之一&#xff0c;由德国马普研…

责任链模式在Android中的应用

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 责任链其实在Android中出现的频率还蛮高的&#xff0c;事件传递就是一种责任链机制。接下来我为大家介绍在开发应用时责任链的用处&#xff1a; 1.触摸事件的应用。2.响应事件的应用。 何为责任…

最新版《神经网络和深度学习》中文版.pdf

获取最新版《神经网络和深度学习》最新版PDF和PPT的方法&#xff1a; 1.扫码关注 “Python与机器智能” 公众号2.后台回复关键词&#xff1a;神经网络注&#xff1a;此处建议复制&#xff0c;不然容易打错▲长按扫描关注&#xff0c;回复神经网络即可获取文档目录如下获取最新版…

论文浅尝 | 知识图谱的不确定性衡量

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;Knowledge and Information Systems volume 62, pages611–637(2020)链接&#xff1a;https://link.springer.com/article/10.1007/s10115-019-01363-0概要本文的核心工作是利用知识结构来衡量知识库…

LeetCode 709. 转换成小写字母

1. 题目 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小写字母&#xff0c;之后返回新的字符串。 2. 解题 char tolower(char)小写比大写对应字符大32 class Solution { public:string toLowerCase(strin…

Logan:美团点评的开源移动端基础日志库

前言 Logan是美团点评集团移动端基础日志组件&#xff0c;这个名称是Log和An的组合&#xff0c;代表个体日志服务。同时Logan也是“金刚狼”大叔的名号&#xff0c;当然我们更希望这个产品能像金刚狼大叔一样犀利。 Logan已经稳定迭代了一年多的时间。目前美团点评绝大多数App已…

如何实现一个循环显示超长图片的控件

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 某次被问到如何实现一个滚筒状的控件&#xff0c;就是可以将一张很长的图片沿着Y轴无限旋转&#xff0c;如下图所示&#xff1a; 大概就是这个意思&#xff0c;当时还不知道图片可以裁剪&…

斯坦福大学——人工智能本科4年课程清单

文 | Mihail Eric编 | 大数据文摘相信每个入行人工智能的老手&#xff0c;对自己过往的几年学习生涯都或多或少会有一些遗憾&#xff1a;如果我当年先从基本概念入手就好了&#xff0c;如果我当年把核心算法吃的更透一点就好了……最近&#xff0c;一位在行业内工作了几年的斯坦…

bert模型简介、transformers中bert模型源码阅读、分类任务实战和难点总结

bert模型简介、transformers中bert模型源码阅读、分类任务实战和难点总结&#xff1a;https://blog.csdn.net/HUSTHY/article/details/105882989 目录 一、bert模型简介 bert与训练的流程&#xff1a; bert模型的输入 二、huggingface的bert源码浅析 bert提取文本词向量 BertMo…

LeetCode 476. 数字的补数(移位 异或^)

1. 题目 给定一个正整数&#xff0c;输出它的补数。补数是对该数的二进制表示取反。 2. 解题 先求出该数的2进制有多少位然后分别每位与1进行异或操作 class Solution { public:int findComplement(int num) {int n 1, num_copy num;while(num_copy/2){n;num_copy / 2;}wh…

论文浅尝 - ICLR 2020 | 用于文本推理的神经模块网络

论文笔记整理&#xff1a;邓淑敏&#xff0c;浙江大学在读博士&#xff0c;研究方向为低资源条件下知识图谱自动化构建关键技术研究。论文链接&#xff1a;https://openreview.net/pdf?idSygWvAVFPr Demo链接: https://demo.allennlp.org/reading-comprehension 代码链接: htt…

全栈深度学习第3期: 怎样科学管理实验数据?

一起追剧鸭简介Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目&#xff0c;通过微信群为同期追剧的小伙伴提供交流平台。关于该计划的详请见这里。1. Berkeley深度学习追剧群目前已有1000小伙伴加入&#xff0c;公众号后台回复口令 深度学习追剧 入群…

论文浅尝 - ICLR2020 | 通过神经逻辑归纳学习有效地解释

论文笔记整理&#xff1a;朱渝珊&#xff0c;浙江大学直博生。研究方向&#xff1a;知识图谱&#xff0c;快速表示学习等。论文链接&#xff1a;https://arxiv.org/pdf/1910.02481.pdf本文是ICLR 2020的一篇关于知识图谱中关于复杂&#xff08;树状、组合&#xff09;规则可微学…