Transferring Data Without Draining the Battery【数据传输中有效降低电池消耗】

阅读:http://blog.csdn.net/kesenhoo/article/details/7390519

http://developer.android.com/training/efficient-downloads/efficient-network-access.html

Optimizing Downloads for Efficient Network Access 基于有效的网络访问优化下载

Minimizing the Effect of Regular Updates 最小化定期轮训更新的影响

Redundant Downloads are Redundant 冗余的下载都是多余的

Modifying your Download Patterns Based on the Connectivity Type 基于连接类型修改下载模式

一。基于有效的网络访问优化下载  

原理:

一次网络访问差不多消耗20s的高电量

操作:

1.批量传输与连接,如预取数据

2.减少连接次数

二。最小化定期轮训更新的影响

1.Google Cloud Messaging for Android (GCM)

  谷歌推送服务 事件驱动 减少了网络连接次数,也优化了带宽,还减少了对电量的消耗。

2.Optimize Polling with Inexact Repeating Alarms and Exponential Backoffs

  通过不定时的重复提醒与指数退避来优化轮询操作

  不定时提醒闹钟

  如果需要使用轮询机制,在不影响用户体验的前提下,当然设置默认更新频率是越低越好[减少电量的浪费]。一个简单的方法是给用户提供更新频率的选择,允许用户自己来处理如何平衡数据及时性与电量的消耗。当设置安排好更新操作后,可以使用不确定重复提醒的方式来允许系统把当前这个操作进行定向移动(比如推迟一会)

int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;

alarmManager.setInexactRepeating(alarmType, start, interval, pi);

  指数退避算法: 间隔时间未发生 则间隔时间加倍

SharedPreferences sp = context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE);

boolean appUsed = sp.getBoolean(PREFS_APPUSED, false);
long updateInterval = sp.getLong(PREFS_INTERVAL, DEFAULT_REFRESH_INTERVAL);

if (!appUsed)
  if ((updateInterval *= 2) > MAX_REFRESH_INTERVAL)
    updateInterval = MAX_REFRESH_INTERVAL;

Editor spEdit = sp.edit();
spEdit.putBoolean(PREFS_APPUSED, false);
spEdit.putLong(PREFS_INTERVAL, updateInterval);
spEdit.apply();

rescheduleUpdates(updateInterval);
executeUpdateOrPrefetch();
private void retryIn(long interval) {
  boolean success = attemptTransfer();

  if (!success) {
    retryIn(interval*2 < MAX_RETRY_INTERVAL ?
            interval*2 : MAX_RETRY_INTERVAL);
  }
}

三。冗余的下载都是多余的 使用缓存避免重复下载

 1.本地缓存文件

long currentTime = System.currentTimeMillis());

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

long expires = conn.getHeaderFieldDate("Expires", currentTime);
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

setDataExpirationDate(expires);

if (lastModified < lastUpdateTime) {
  // Skip update
} else {
  // Parse update
}

2.Use the HttpURLConnection Response Cache 使用HttpUrlConnection catch

private void enableHttpResponseCache() {
  try {
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    File httpCacheDir = new File(getCacheDir(), "http");
    Class.forName("android.net.http.HttpResponseCache")
         .getMethod("install", File.class, long.class)
         .invoke(null, httpCacheDir, httpCacheSize);
  } catch (Exception httpResponseCacheNotAvailable) {
    Log.d(TAG, "HTTP response cache is unavailable.");
  }
}

四。基于连接类型修改下载模式

1.Use Wi-Fi [使用Wi-Fi]

在大多数情况下,Wi-Fi电波会在使用相对较低的电量的情况下提供一个相对较宽的带宽。因此,我们需要努力争取尽量使用Wi-Fi来传递数据。

我们可以使用Broadcast Receiver来监听当网络连接切换为Wi-Fi,这个时候我们可以进行大量的数据传递操作,例如下载,执行定时的更新操作,甚至是在这个时候加大更新的频率。这些内容都可以在前面的课程中找到。

2.使用更大的带宽来下载更多的数据,而不是经常去下载

ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

int PrefetchCacheSize = DEFAULT_PREFETCH_CACHE;

switch (activeNetwork.getType()) {
  case (ConnectivityManager.TYPE_WIFI):
    PrefetchCacheSize = MAX_PREFETCH_CACHE; break;
  case (ConnectivityManager.TYPE_MOBILE): {
    switch (tm.getNetworkType()) {
      case (TelephonyManager.NETWORK_TYPE_LTE |
            TelephonyManager.NETWORK_TYPE_HSPAP):
        PrefetchCacheSize *= 4;
        break;
      case (TelephonyManager.NETWORK_TYPE_EDGE |
            TelephonyManager.NETWORK_TYPE_GPRS):
        PrefetchCacheSize /= 2;
        break;
      default: break;
    }
    break;
  }
  default: break;
}
时间: 2024-10-06 19:26:13

Transferring Data Without Draining the Battery【数据传输中有效降低电池消耗】的相关文章

Android开发训练之第五章第三节——Transferring Data Without Draining the Battery

Transferring Data Without Draining the Battery GET STARTED DEPENDENCIES AND PREREQUISITES Android 2.0 (API Level 5) or higher YOU SHOULD ALSO READ Optimizing Battery Life In this class you will learn to minimize the battery life impact of downloads a

关于数据传输中加密解密那点事儿(一)

随着互联网的兴起,越来越多的信息和资源要通过网络传输完成:然而在这些数据传输中总有一些"无关人员"做一些窃听.盗取.篡改等危害数据安全的行为,所以我们要对数据进行加密处理,以保证数据的安全传输: 所以有了一下几种加密方式: 一.对称加密: 这种算法简单来说就是 数据的发送方和接收方都必须要有同一种密钥(加密数据所用到的密钥),在数据的传输中 数据与密钥都通过加密的方式传送: 特性:在数据加密中,数据被分成固定大的块,逐个加密:加密和解密速度也快: 缺陷:因为加密和解密使用同一种密钥,所

SSIS CDC(Change Data Capture)组件在数据库中启用报错。 The error returned was 14234: &#39;The specified &#39;@server&#39; is invalid

昨天实验CDC,在数据库中执行以下语句的时候出错. EXEC sys.sp_cdc_enable_table @source_schema = N'stg', @source_name = N'CDCSalesOrderHeader', @role_name = N'cdc_role', @supports_net_changes = 1; Msg 22832, Level 16, State 1, Procedure sp_cdc_enable_table_internal, Line 623

使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程

使用ps.top.ps_mem命令找出Linux中的最大内存消耗过程 2020-02-08 16:06:59作者:自力稿源:云网牛站 您可能已经看到Linux系统多次消耗过多的内存,如果是这种情况,那么最好的办法是识别在Linux计算机上消耗过多内存的进程.使用top命令和ps命令可以很容易地识别出它,我曾经同时检查这两个命令,并且都得到了相同的结果. 使用ps命令在Linux中查找最大内存消耗过程 ps命令用于报告当前进程的快照,ps命令代表进程状态,这是一个标准的Linux应用程序,用于查找

二维码Data Matrix简介及在VS2010中的编译

Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码是一种矩阵式二维条码. Data Matrix符号由规则排列的深浅色正方形模块构成,每个正方形模块就是一个基本单元,每个基本单元又被编码为一比特的数据.数据区的四周是探测图形,用于条码符号定位和确定条码结构信息.探测图形的四周是空白区,用以将条码符号与背景分离. 探测图形是一个模块的宽度,是数据区的

mysql的load data,高速将文本文件,插入数据库中

1语法 LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE 'file_name.txt' [ REPLACE | IGNORE ] INTO TABLE tbl_name [ FIELDS [ TERMINATED BY 'string' ] [ [OPTIONALLY] ENCLOSED BY 'char' ] [ ESCAPED BY 'char'  ] ] [ LINES [ STARTING BY 'string' ] [

转:Hide data inside pointers(在指针中隐藏数据)

该文介绍了如何使用指针中一些未使用的位来隐藏一些数据. When we write C code, pointers are everywhere. We can make a little extra use of pointers and sneak in some extra information in them. To pull this trick off, we exploit the natural alignment of data in memory. Data in mem

html5中data属性,dataset与jquery中的date()

首先是“你必须知道的28个HTML5特征.窍门和技术”里对date属性的分析: 我们现在可以很正式地让所有的HTML元素支持自定义属性.然而,以前,我们可能会这样: <h1 id=someId customAttribute=value>你好,我是以前的自定义属性<h1> …校验器会小题大做!但是现在,只要我们以”data”为前缀定义我们的自定义属性,盗版属性立马变成正牌的了.如果你发现你曾经把一个重要的数据附加在诸如class的属性上,可能为了JavaScript之用,那么,本属

安全相关的问题、CSRF攻击、怎么确保数据传输中的安全性?

CSRF攻击 又叫“跨站请求伪造”.可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 下图简单阐述了CSRF攻击的思想: 1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登陆网站A: 2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登陆网站A成功,可以正常发送请求到网站A: 3.用户未