#android #battery #background-service #battery-saver
#Android #батарея #фоновая служба #экономия заряда батареи
Вопрос:
Я написал приложение для Android, которое проверяет уровень заряда батареи путем изменения уровня и выдает сигнал тревоги, когда уровень достигает определенного значения. Я использовал широковещательный приемник и фоновую службу в своем приложении. Она работает должным образом во всех версиях Android, но в Android R служба останавливается при включении режима экономии заряда батареи. Я протестировал свое приложение на нескольких эмуляторах и реальных устройствах с разными версиями Android и работает должным образом, но имеет проблему в Android R. Есть ли способ предотвратить остановку службы?
мой класс обслуживания :
public class BatService extends Service {
private BatReceiver receiver = new BatReceiver();
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
BatteryLevelAsync async = new BatteryLevelAsync();
async.execute();
return START_STICKY;
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
private class BatteryLevelAsync extends AsyncTask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... voids) {
registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return null;
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Ответ №1:
Google ввел ограничения на Android 8 для оптимизации заряда батареи. Это ограничивает фоновую работу даже при использовании служб. Я нашел решение для решения этой проблемы: используйте PowerManager.
Добавить разрешение на манифест :
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
И добавьте приведенный ниже код к своему действию :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("package:" packageName));
context.startActivity(intent);
}
}
Ответ №2:
в Kotlin используется следующим образом:
@SuppressLint("BatteryLife")
fun permissionBattery() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val packageName: String = baseContext.packageName
val pm: PowerManager =
baseContext.getSystemService(Context.POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
val intent = Intent()
intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
intent.data = Uri.parse("package:$packageName")
baseContext.startActivity(intent)
}
}
}
Кроме того, вам необходимо
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
затем пользователь может изменить настройки по умолчанию для отключения батареи