Razões para otimização de energia
A otimização da bateria é muito importante no desenvolvimento do Android pelos seguintes motivos:
experiência de usuário:
A duração da bateria é um dos fatores aos quais os usuários prestam muita atenção ao usar dispositivos móveis. Ao realizar a otimização de energia, a vida útil da bateria do dispositivo pode ser estendida, permitindo que os usuários usem o dispositivo por um longo período de tempo sem precisar recarregar com frequência. Isso melhorará muito a satisfação do usuário e a experiência geral.
Desempenho do equipamento:
A duração da bateria de um dispositivo móvel está diretamente relacionada ao desempenho do dispositivo. Ele fornece melhor desempenho e capacidade de resposta quando a bateria do dispositivo está totalmente carregada. No entanto, quando a carga da bateria está baixa, para prolongar a vida útil da bateria, o sistema pode reduzir o desempenho do dispositivo, o que afetará a eficiência operacional do aplicativo e a experiência do usuário. Ao realizar a otimização de energia, os ajustes do sistema para o desempenho do dispositivo podem ser minimizados para garantir que os aplicativos possam fornecer um bom desempenho em vários estados de energia.
utilização de recursos:
A bateria é um dos recursos importantes de um dispositivo móvel e é limitada. Ao executar a otimização de energia, os recursos da bateria podem ser razoavelmente gerenciados e utilizados para evitar que os aplicativos consumam muita energia em segundo plano, reduzindo assim o desperdício desnecessário de energia. Isso é de grande importância para o uso a longo prazo de equipamentos e proteção ambiental.
requisitos:
A atualização da versão do sistema Android geralmente introduz novas regras e restrições de otimização de bateria, exigindo que os desenvolvedores de aplicativos as cumpram. Por exemplo, o Android 6.0 (Marshmallow) introduziu o Modo Soneca e o App Standby, recursos que reduzem o consumo de energia limitando a atividade do app em segundo plano. Para garantir que o aplicativo funcione normalmente e atenda às especificações da nova versão do sistema, a otimização de energia é necessária.
Doze modo de baixo consumo de energia e modo de espera StandBy
Quando o usuário não usa o dispositivo há muito tempo, 低电耗模式会延迟应用的后台 CPU 和网络活动,从 而降低耗电量。应用待机模式会延迟用户近期未与之交互的应用的后台网络活动
.
Doze modo de baixo consumo
Se o dispositivo 未充电、屏幕熄灭、让设备在一段时间内保持不活动状态
, então o dispositivo entrará no modo Doze. No modo Doze, o sistema tentará 限制应用访问占用大量网络和 CPU 资源的服务
economizar energia. Será 阻止应用访问网络
, e será 延迟其作业、同步和标准闹钟
.
Cochilar é um cochilo em chinês, portanto 系统会定期退出
cochile por um curto período de tempo para permitir que o aplicativo conclua suas atividades atrasadas. Durante esse período de manutenção, todas as sincronizações, trabalhos e alarmes pendentes serão executados e os aplicativos terão acesso à rede permitido.
Assim que o usuário ativar o dispositivo movendo-o, ligando a tela ou conectando-o a um carregador, o sistema irá reiniciar 立即退出低电耗模式
e todos os aplicativos retomarão a atividade normal.
Durante o modo Soneca, os aplicativos estão sujeitos às seguintes restrições:
1. 暂停访问网络
。
2. O sistema ignora PowerManager.WakeLock
wake locks.
3. Padrão AlarmManager 闹钟
(incluindo setExact() e setWindow()) 推迟到下一个维护期
.
Se você precisar definir um despertador que seja acionado quando o dispositivo estiver no modo de baixo consumo de energia, use API 23 (6.0) setAndAllowWhileIdle()
(despertador único, igual ao método set) ou setExactAndAllowWhileIdle() (precisão maior
que , o mesmo que setExact ).
Os alarmes definidos com o uso setAlarmClock()
continuarão a disparar normalmente e o sistema sairá do Modo Soneca pouco antes de esses alarmes dispararem
.
4. Sistema 不执行 WLAN 扫描
.
5. Sistema 不允许运行同步适配器AbstractThreadedSyncAdapter
(pull de sincronização de conta ao vivo).
6. Sistema 不允许运行 JobScheduler
.
Modo de espera
Modo de espera do aplicativo 允许系统判定应用在用户未主动使用它时是否处于待机状态
. Quando o usuário não toca no aplicativo por um período de tempo e o aplicativo não apresenta o seguinte desempenho, o sistema Android fará com que o aplicativo entre no estado ocioso
1. 应用当前有一个进程在前台运行
(como uma atividade ou serviço de primeiro plano, ou está sendo usado por outra atividade ou serviço de primeiro plano).
2. 应用生成用户可在锁定屏幕或通知栏中看到的通知
。
Quando o usuário conecta o dispositivo a uma fonte de energia, o sistema libera os aplicativos do modo de espera, permitindo que eles acessem livremente a rede e executem trabalhos e sincronizações pendentes.
Se o dispositivo ficar ocioso por um longo período de tempo, o sistema permitirá que aplicativos ociosos acessem a rede aproximadamente uma vez por dia.
lista de permissões
O sistema fornece uma lista de permissões configurável de aplicativos parcialmente isentos das otimizações Doze e App Standby. Os aplicativos da lista de permissões podem usar a rede e reter bloqueios de ativação parciais durante Doze e App Standby. No entanto, os aplicativos da lista de permissões ainda estarão sujeitos a outras restrições, assim como outros aplicativos. Por exemplo, trabalhos e sincronizações para aplicativos da lista de permissões são atrasados (em dispositivos 6.0 e anteriores) e seus alarmes regulares do AlarmManager não disparam. Um aplicativo pode chamar PowerManager.isIgnoringBatteryOptimizations()
para verificar se o aplicativo está atualmente na lista de permissões de isenção.
A lista de permissões pode ser configurada manualmente em Otimização da bateria em Configurações. Além disso, o sistema fornece métodos para aplicativos solicitarem que o usuário coloque na lista de permissões
Os aplicativos podem disparar ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
Intenções que levam os usuários diretamente à Otimização da bateria, onde eles adicionam o aplicativo.
startActivity(new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS));
Aplicativos com a permissão REQUEST_IGNORE_BATTERY_OPTIMIZATIONS podem acionar uma caixa de diálogo do sistema para permitir que o usuário adicione o aplicativo à lista de permissões diretamente sem acessar as Configurações. Esses aplicativos ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
acionarão a caixa de diálogo disparando um Intent.
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:"+getPackageName()));
startActivity(intent);
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Teste em Soneca
#启用Doze
adb shell dumpsys deviceidle enable
#强制进入doze模式 (同时还需要关闭屏幕)
adb shell dumpsys deviceidle force-idle
#退出doze模式
adb shell dumpsys deviceidle unforce
#关闭doze
adb shell dumpsys deviceidle disable
#重置设备
adb shell dumpsys battery reset
#查看doze白名单
adb shell dumpsys deviceidle wh
Teste em App Standby
#设置断开充电
adb shell dumpsys battery unplug
#进入standby
adb shell am set-inactive <packageName> true
#退出standby
adb shell am set-inactive <packageName> false
#查看是否处于standby
adb shell am get-inactive <packageName>
#重置
adb shell dumpsys battery reset
Monitore o nível da bateria e o status de carregamento
Obter status de carregamento
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);
// 是否正在充电
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// 什么方式充电?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
//usb
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
//充电器
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
Log.e(TAG, "isCharging: " + isCharging + " usbCharge: " + usbCharge + " acCharge:" + acCharge);
Monitorar alterações no estado de carga
//注册广播
IntentFilter ifilter = new IntentFilter();
//充电状态
ifilter.addAction(Intent.ACTION_POWER_CONNECTED);
ifilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
//电量显著变化
ifilter.addAction(Intent.ACTION_BATTERY_LOW); //电量不足
ifilter.addAction(Intent.ACTION_BATTERY_OKAY); //电量从低变回高
powerConnectionReceiver = new PowerConnectionReceiver();
registerReceiver(powerConnectionReceiver, ifilter);
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
Toast.makeText(context, "充电状态:CONNECTED", Toast.LENGTH_SHORT).show();
} else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
Toast.makeText(context, "充电状态:DISCONNECTED", Toast.LENGTH_SHORT).show();
} else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
Toast.makeText(context, "电量过低", Toast.LENGTH_SHORT).show();
} else if (intent.getAction().equals(Intent.ACTION_BATTERY_OKAY)) {
Toast.makeText(context, "电量从低变回高", Toast.LENGTH_SHORT).show();
}
}
}
Perfil de Energia
Em dispositivos Android 8.0+, use o Energy Profiler para ver onde os aplicativos estão usando energia desnecessária. O EnergyProfiler monitora o uso de CPU, rádio de rede e sensor de GPS e fornece uma exibição visual de quanta energia cada um desses componentes está consumindo. Também mostra o número de ocorrências de eventos do sistema (wake locks, alarmes, trabalhos e solicitações de localização) que podem afetar o consumo de energia.