在Android 4.0里面为HttpURLConnection添加了一个响应缓存(response cache ),你可以通过反射机制使用HTTP response caching ,当然前提是你的设备支持android4.0,请看下面的例子:
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."); } }
上面的示例代码将在android4.0+的设备上打开响应缓存,同时不影响较早的版本(这段代码对android4.0以前的版本没有影响)。
当缓存开启,所有缓存的HTTP请求都可以直接从本地存储中响应,而无需打开一个网络连接。在下载的时候,Conditionally cached responses 会从服务器端验证其是否有效,从而减少带宽消耗。
Uncached responses会在下次请求的时候存储在响应缓存中(the response cache )从而变为Conditionally cached responses 。
可以使用 PackageManager 切换清单中定义的任意组件的启用状态(包括您要启用或停用的任意广播接收器),具体如以下片段所示:
ComponentName receiver = new ComponentName(context, myReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
在使用此技巧时,如果您确定连接已断开,就可以停用除连接变化接收器外的所有接收器。相反,成功连接后,您就可以停止侦听连接变化,同时只需在执行更新和重新安排重复更新提醒前查看是否在线即可。
您可以使用同样的方法来延迟需要较高带宽的下载任务。只有在连接 Wi-Fi 后,您才能直接启用用于侦听连接变化和启动下载任务的广播接收器。
想要在一个Activity中监听电池电量或者充电状态的变化,可以使用Intent Filter注册一个Receiver来实现,该Intent Filter通过Battery Manager来监听Intent.ACTION_BATTERY_CHANGED广播。
包含有当前电池电量信息和充电状态的Broadcast Intent是一个sticky Intent,因此不需要实现一个Broadcast Receiver就可以在任何时间获取到当前的电池状态
由于这是个持续 intent,因此您无需通过将传入 null 的 registerReceiver 作为接收器直接调用(如下一代码段所示)来注册 BroadcastReceiver,系统会返回当前电池状态 intent。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = mContext.registerReceiver(null, ifilter); // Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
注意,不能在manifest文件的Receiver中注册电量变化的动作;然而,可以使用下面的动作字符串监控和电源的连接情况以及低电量情况,每个字符串以android.intent.action作为前缀:
ACTION_BATTERY_LOW
ACTION_BATTERY_OKAY
ACTION_POWER_CONNECTED
ACTION_POWER_DISCONNECTED