Приложение Foreground убито ОС через ~ 1 час в режиме ожидания - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение, в котором пользователю предлагается войти в систему, а затем представить действие.Служба также запускается на входе, который использует менеджер местоположения для отслеживания его текущего местоположения.все работает отлично, пока приложение не остается в режиме ожидания (отключите приложение в фоновом режиме более чем на ~ 1 час)

как я могу предотвратить это?

, как я понимаю, если у меня естьслужба переднего плана работает, ОС не должна убивать приложение .. так что я делаю не так?ОС, на которой я тестирую это Oreo

, запускающая службу при входе в систему:

startService(intent);

служба:

public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

@Override
    public void onCreate() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification notification = updateNotificationContent(); // the service notification
            if (notification == null)
                stopSelf();
            startForeground(id, notification);
        }

Я добавил вход в систему для уничтожения функцииактивность и служба, чтобы определить, когда это происходит, но журнал никогда не записывается, когда происходит такое поведение (конечно, оно входит в обычный случай, когда я уничтожаю приложение)

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Согласно документации по процессам Android и жизненному циклу приложений

[...] Необычной и фундаментальной особенностью Android является то, что время жизни процесса приложения напрямую не контролируетсясамо приложениеВместо этого он определяется системой посредством комбинации частей приложения, которые, как известно системе, работают, насколько эти вещи важны для пользователя и сколько общего объема памяти доступно в системе.

Foreground Service должна находиться на вершине иерархии важности , определяющей, какие процессы должны быть остановлены при нехватке памяти.

Однако

[...] Службы, которые работали в течение длительного времени (например, 30 минут или более), могут быть понижены в значении, чтобы позволить их процессу перейти к списку кэшированных LRU, описанному ниже.Это помогает избежать ситуаций, когда очень долго работающие службы с утечками памяти или другими проблемами потребляют так много оперативной памяти, что мешают системе эффективно использовать кэшированные процессы.

, поэтому вы не можете быть уверены в этомчто процесс не прерывается операционной системой.

Некоторые меры предосторожности, которые мне подходят:

  • добавление приложения в список «защищенных приложений» (доступно внекоторые телефоны, такие как Huaweii).
  • ограничивают использование ресурсов в службе переднего плана.Например, процесс, который выполняет периодическое сканирование по Bluetooth, гораздо менее вероятен, чем процесс, который интенсивно использует gps.
  • избегайте отправки слишком большого количества уведомлений пользователю и, прежде всего, не используйте PowerManager.Wake Lock
0 голосов
/ 04 октября 2018

Если у вас есть активная служба, у вас не должно быть этой проблемы.

См. здесь .

Процесс переднего плана - это тот, который требуется дляпользователь в настоящее время делает.Различные компоненты приложения могут по-разному рассматривать содержащий его процесс на переднем плане.Процесс считается находящимся на переднем плане, если выполняется любое из следующих условий:

Он запускает действие в верхней части экрана, с которым взаимодействует пользователь (вызывался его метод onResume ()),У него есть BroadcastReceiver, который в настоящее время работает (его метод BroadcastReceiver.onReceive () выполняется).У него есть служба, которая в настоящее время выполняет код в одном из своих обратных вызовов (Service.onCreate (), Service.onStart () или Service.onDestroy ()).

Таких процессов будет всего несколько.в системе, и они будут уничтожены только в крайнем случае, если память настолько мала, что даже эти процессы не могут продолжать работать.Как правило, в этот момент устройство перешло в состояние подкачки памяти, поэтому это действие необходимо для обеспечения отзывчивости интерфейса пользователя.

Посмотрите на этот ответ ,Чтобы обнаружить во время убийства, если вы находитесь на переднем плане.

...