page.title=Data Saver metaDescription=用户启用的流量消耗优化。 page.keywords="android N", "data usage", "metered network" page.image=images/cards/card-nyc_2x.jpg @jd:body
在智能手机的整个生命周期,蜂窝数据计划的成本通常会超出设备本身的成本。 在 N Developer Preview 中,用户可以在整个设备上启用 Data Saver,以减少流量消耗,无论是在漫游,账单周期即将结束,还是使用少量的预付费数据包。
当用户在 Settings 中启用 Data Saver 且设备位于按流量计费的网络上时,系统屏蔽后台流量消耗,同时指示应用在前台尽可能使用较少的数据。 用户可以将特定应用加入白名单以允许后台按流量计费的流量消耗,即使在打开 Data Saver 时也是如此。
N Developer Preview 扩展{@link android.net.ConnectivityManager} API,为应用提供检索用户的 Data Saver 首选项和监控首选项变更的方式。 这被认为是应用检查用户是否启用了 Data Saver 并努力限制前台和后台流量消耗的有效方法。
在 N Developer Preview 中,应用可以使用 {@link android.net.ConnectivityManager} API 来确定正在应用的是哪些流量消耗限制。 {@code getRestrictBackgroundStatus()}方法返回下列值之一:
这被认为是在设备连接到按流量计费的网络时限制流量消耗的有效方法,即使 Data Saver 被禁用或应用在白名单中。 以下示例代码使用 {@link android.net.ConnectivityManager#isActiveNetworkMetered ConnectivityManager.isActiveNetworkMetered()} 和 {@code ConnectivityManager.getRestrictBackgroundStatus()} 来确定应用应使用多少数据:
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // Checks if the device is on a metered network if (connMgr.isActiveNetworkMetered()) { // Checks user’s Data Saver settings. switch (connMgr.getRestrictBackgroundStatus()) { case RESTRICT_BACKGROUND_STATUS_ENABLED: // Background data usage is blocked for this app. Wherever possible, // the app should also use less data in the foreground. case RESTRICT_BACKGROUND_STATUS_WHITELISTED: // The app is whitelisted. Wherever possible, // the app should use less data in the foreground and background. case RESTRICT_BACKGROUND_STATUS_DISABLED: // Data Saver is disabled. Since the device is connected to a // metered network, the app should use less data wherever possible. } } else { // The device is not on a metered network. // Use data as required to perform syncs, downloads, and updates. }
如果您的应用需要使用后台数据,它可以通过发送一项包含您的应用软件包名称的 URI 的 Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
Intent 来请求白名单权限:例如 package:MY_APP_ID
。
发送 Intent 和 URI 将启动 Settings 应用,还会显示您的应用的流量消耗设置。 用户随后可以决定是否启用应用的后台数据。 在您发送此 Intent 之前,先询问用户是否希望启用 Settings 应用,以启用后台流量消耗,这是一种有效的做法。
应用可以通过创建一条 {@link android.content.BroadcastReceiver} 以侦听 {@code ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED} 以及使用 {@link android.content.Context#registerReceiver Context.registerReceiver()}动态注册接收器来监控 Data Saver 首选项变更。 当应用接收到这条广播时,应通过调用 {@code ConnectivityManager.getRestrictBackgroundStatus()} 来检查新的 Data Saver 首选项是否会影响其权限。
注:系统只会向使用 {@link android.content.Context#registerReceiver Context.registerReceiver()} 进行动态注册的应用发送此广播。 在其清单中注册接收此广播的应用将不会收到它们。
$ adb shell dumpsys netpolicy
$ adb shell cmd netpolicy
$ adb shell cmd netpolicy set restrict-background
<boolean>
true
或 false
时,启用或禁用 Data Saver 模式。
$ adb shell cmd netpolicy add restrict-background-whitelist
<UID>
$ adb shell cmd netpolicy remove restrict-background-whitelist
<UID>