page.title=Economia de dados metaDescription=User-enabled otimização de uso de dados. page.keywords="android N", "data usage", "metered network" page.image=images/cards/card-nyc_2x.jpg @jd:body
Durante a vida útil de um smartphone, o custo do plano de dados pode facilmente exceder o custo do próprio dispositivo. No N Developer Preview, os usuários podem ativar a Economia de dados no dispositivo como um todo para usar menos dados, seja em roaming, perto do final do período de cobrança ou em pacotes de dados pré-pagos pequenos.
Quando um usuário ativa a Economia de dados em Settings e o dispositivo está em uma rede tarifada, o sistema bloqueia o uso de dados em segundo plano e avisa aos aplicativos para reduzir o uso de dados no primeiro plano sempre que possível. Os usuários podem autorizar aplicativos específicos a usar dados tarifados em segundo plano, mesmo com a Economia de dados ativada.
O N Developer Preview estende a API {@link android.net.ConnectivityManager} para oferecer aos aplicativos uma forma de recuperar as preferências do usuário para a Economia de dados e monitorar as mudanças de preferências. Como prática recomendada, os aplicativos devem verificar se o usuário ativou a Economia de dados e tentar limitar o uso de dados em primeiro e segundo plano.
No N Developer Preview, aplicativos podem usar a API {@link android.net.ConnectivityManager} para determinar quais restrições de uso de dados estão sendo aplicadas. O método {@code getRestrictBackgroundStatus()} retorna um dos seguintes valores:
É prática recomendada limitar o uso de dados sempre que o dispositivo estiver conectado a uma rede tarifada, mesmo que a Economia de dados esteja desativada e o aplicativo esteja na lista de permissões. O modelo de código a seguir usa {@link android.net.ConnectivityManager#isActiveNetworkMetered ConnectivityManager.isActiveNetworkMetered()} e {@code ConnectivityManager.getRestrictBackgroundStatus()} para determinar o volume máximo de dados que o aplicativo pode usar:
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. }
Se o seu aplicativo precisa usar dados em segundo plano, ele pode solicitar permissão para
entrar na lista de permissões enviando uma intenção
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
que contenha o URI no nome de pacote do aplicativo, por exemplo,
package:MY_APP_ID
.
O envio da intenção e do URI abre o aplicativo Settings e exibe as configurações de uso de dados de seu aplicativo. O usuário pode decidir então se ativará os dados em segundo plano para o aplicativo. Antes de enviar a intenção, é prática recomendada perguntar primeiro ao usuário se ele deseja iniciar o aplicativo Settings com o objetivo de ativar o uso de dados em segundo plano.
Os aplicativos podem monitorar alterações nas preferências da Economia de dados criando um {@link android.content.BroadcastReceiver} para escutar {@code ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED} e registrar dinamicamente o receptor em {@link android.content.Context#registerReceiver Context.registerReceiver()}. Quando recebe esta transmissão, o aplicativo deve verificar se as novas preferências da Economia de dados afetam as permissões chamando {@code ConnectivityManager.getRestrictBackgroundStatus()}.
Observação: O sistema só envia esta transmissão para aplicativos que se registram dinamicamente para recebê-la em {@link android.content.Context#registerReceiver Context.registerReceiver()}. Os aplicativos que se registrarem para receber a transmissão no manifesto não a receberão.
$ adb shell dumpsys netpolicy
$ adb shell cmd netpolicy
$ adb shell cmd netpolicy set restrict-background
<boolean>
true
ou
false
, respectivamente.
$ adb shell cmd netpolicy add restrict-background-whitelist
<UID>
$ adb shell cmd netpolicy remove restrict-background-whitelist
<UID>