7

Мой личный сервис на переднем плане уничтожается через несколько часов без перезапуска. Я знаю, что это было задано пару раз, и я прочитал и проверил все проверки на моем устройстве. Важно отметить, что это, по-видимому, происходит только на устройствах 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.

Цените любые дополнительные сведения об этом!

+0

hey Qin Zhengquan, Вы решили проблему с фоновой услугой телефона huawei 6.0? Я также получаю такую ​​же проблему в службе определения местоположения GCM и Google API. Также, когда приложение прекращено из задачи, оно фактически убивает процесс, поэтому я не получал обновления местоположения. –

+2

Мне это пока не удалось решить, но мне удалось продлить срок службы устройства, выполнив следующие действия: 1. Уменьшение объема памяти 2. Снижение потребления энергии 3. Использование услуги переднего плана 4 Настройки -> Расширенные настройки -> Диспетчер батарей -> Защищенные приложения (разрешить приложению продолжать работу после выключения экрана) - Невозможно обойти этот шаг. Вам абсолютно необходимо включить это, иначе ваше приложение не будет работать в фоновом режиме вообще. Самая длинная запись, которую я мог сохранить в приложении, работающем в фоновом режиме на Huawei, составлял 12 часов, прежде чем он был разорван. –

+0

Спасибо, брат. Huawei - просто дерьмо. –

ответ

0

Вы абсолютно уверены, что вам нужен wakelock? У меня есть аналогичная услуга, и я заметил, что она работает даже без wakelock. Это post утверждает, что убийца - это вакелон. Я пробовал с моим процессом, который был убит за несколько минут, и он работает в течение нескольких часов.

0

Huawei -> у вас есть настройки батареи, но это не режим энергосбережения. на этом экране настроек аккумулятора появляется подменю «Защищенное приложение» (не уверенное имя). вам необходимо разрешить ваше приложение защищаться, чтобы предотвратить удаление приложения Huawei после блокировки экрана.

+1

Привет, Джонс, я уже добавил в Защищенное приложение (см. Вопрос). Он работает в фоновом режиме после блокировки экрана не более 12 часов. Проблема в том, что я не могу идти больше, чем в отличие от других устройств Android. –

+0

Вы еще не открыли свой сервис в качестве прогонного фонда в этом коде. –

0

Звучит так, как будто ваше приложение убито Huawei PowerGenie, потому что оно удерживает блокировку следа на неопределенное время. Если вы не можете избежать блокировки слежения, см. my answer to a similar question для обходного пути.