Мой личный сервис на переднем плане уничтожается через несколько часов без перезапуска. Я знаю, что это было задано пару раз, и я прочитал и проверил все проверки на моем устройстве. Важно отметить, что это, по-видимому, происходит только на устройствах Huawei.Служба на переднем плане, убитая на Huawei (GRA-UL00) - Защищенные приложения включены
Так что позвольте мне предоставить следующие данные.
Периодическая служба
public class PeriodicService extends Service {
@Override
public void onCreate() {
super.onCreate();
acquireWakeLock();
foregroundify();
}
private void foregroundify() {
// Omitted for brevity. Yes it does starts a foreground service with a notification
// verified with adb shell dumpsys activity processes > tmp.txt
// entry in tmp.txt => "ProC# 1: prcp T/S/SF trm: 0 14790:my.app.package.indentifier/u0a172 (fg-service)"
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
acquireWakeLock();
if (!isServiceRunningInForeground(this, this.getClass())){
foregroundify();
}
PeriodicAlarmManager alarmManager = PeriodicAlarmManager.get(this);
alarmManager.setAlarm();
return START_STICKY; // after a few hours, service terminates after this returns. verified in my local logs
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
releaseWakeLock();
stopForeground(true);
super.onDestroy();
}
}
PeriodicAlarmManager
public void setAlarm() {
Intent intent = new Intent(mContext, PeriodicAlarmReceiver.class);
intent.setAction("repeat");
mAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
mAlarmManager.cancel(mAlarmIntent);
long triggerAtMillis = System.currentTimeMillis() + ALARM_INTERVAL_MINUTES;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
} else {
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
}
ComponentName receiver = new ComponentName(mContext, PeriodicBootReceiver.class);
PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
PeriodicAlarmReceiver
public class PeriodicAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PeriodicService.class);
service.putExtra("source", "PeriodicAlarmReceiver");
intent.getAction()));
startWakefulService(context, service);
}
}
Применение
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onLowMemory(){
super.onLowMemory(); // never gets called
}
@Override
public void onTrimMemory(int level){
super.onTrimMemory(level); // only gets called on app launch
}
@Override
public void onTerminate() {
super.onTerminate();
}
}
процессы ADB оболочки dumpsys активность> tmp.txt
запись в tmp.txt => «ProC# 1: СВКЦ T/S/SF TRM: 0 14790: мой .app.package.indentifier/u0a172 (фг-сервис)»
Выше запись основана на принятой ответ здесь: Foreground service being killed by Android
Добавлена MyApp в список защищенных приложений в Setti ngs-> Расширенные настройки -> Менеджер батареи -> Защищенные приложения (Разрешить приложению продолжать работать после того, как экран выключен)
Используется Performance (наименьшее значение) в Настройки-> Дополнительные параметры -> План питания (Performance)
информация об устройстве
Номер модели: HUAWEI GRA-UL00
EMUI Версия: 4.0.1 EMUI
Android Версия: 6.0
Другие Примечания:
Low Memory, onTrimMemory не вызывается до завершения. В любом случае, я отключил приложение до минимума, чтобы поддерживать приложение в фоновом режиме, поэтому память не должна быть проблемой.
Sticky Service никогда не перезапускается, если только пользователь явно не запускает приложение.
Alarm Manager не вызывается для перезапуска/восстановления службы. setExactAndAllowWhileIdle() тоже не работает, и это должно быть неуместным, поскольку служба является приоритетным сервисом переднего плана и, следовательно, не должна зависеть от режима доз.
Служба может работать только в течение максимум 12 часов до ее прекращения. Когда это произошло, батарея была выше 65%.
Это требование, чтобы обслуживание работало бесконечно, поскольку это приложение предназначено для исследовательского проекта.
Есть ли что-нибудь еще, что я могу сделать или это конкретная модификация Android от Huawei, о которой разработчик ничего не может поделать. Повторяю, эта проблема возникает только на устройствах Huawei.
Цените любые дополнительные сведения об этом!
hey Qin Zhengquan, Вы решили проблему с фоновой услугой телефона huawei 6.0? Я также получаю такую же проблему в службе определения местоположения GCM и Google API. Также, когда приложение прекращено из задачи, оно фактически убивает процесс, поэтому я не получал обновления местоположения. –
Мне это пока не удалось решить, но мне удалось продлить срок службы устройства, выполнив следующие действия: 1. Уменьшение объема памяти 2. Снижение потребления энергии 3. Использование услуги переднего плана 4 Настройки -> Расширенные настройки -> Диспетчер батарей -> Защищенные приложения (разрешить приложению продолжать работу после выключения экрана) - Невозможно обойти этот шаг. Вам абсолютно необходимо включить это, иначе ваше приложение не будет работать в фоновом режиме вообще. Самая длинная запись, которую я мог сохранить в приложении, работающем в фоновом режиме на Huawei, составлял 12 часов, прежде чем он был разорван. –
Спасибо, брат. Huawei - просто дерьмо. –