Есть ли способ заставить приложение работать в фоновом режиме, несмотря ни на что?

12

В Ice Cream Sandwich (ICS) ОС классифицирует ваше приложение, и у каждой категории есть свой собственный порог, в котором ОС определяет, какое приложение закрывать первым, когда ему не хватает памяти.

Кто-нибудь из вас был раздражен, скажем, вы открыли таймер для запуска в фоновом режиме, чтобы измерить время, прошедшее с чего-то, затем вы открыли еще несколько приложений и вернулись к своему таймеру, чтобы посмотреть, был ли он сброшен или закрыт? Я имею в виду, серьезно, это действительно мучительно раздражает.

Есть ли способ заставить приложение оставаться запущенным в фоновом режиме, несмотря ни на что, даже если ОС не хватает памяти?

supertonsky
источник
7
Это признак плохого кода в приложении. Пользователь никогда не должен беспокоиться об этом, и Android предоставляет средства, позволяющие приложению сохранять свое состояние и восстанавливать его позже (начиная с ранних версий Android). Вы должны отправить отчет об ошибке разработчику приложения.
Поток

Ответы:

8

Принятый ответ оказался неверным или устаревшим. Модуль «Настройки приложения» для приложения Xposed позволяет вам указать для каждого приложения, чтобы приложения не были убиты или освобождены:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

Конечно, следует проявлять осторожность при игре с приложениями, изменяющими такое низкоуровневое поведение.

крутящий момент
источник
Следует отметить, что для этого требуется рут и установка тяжелой модификации ОС Android.
sweisgerber.dev
5

Простой ответ: Нет. Android всегда использует OOM (Out-Of-Memory), расставляя приоритеты для освобождения неиспользуемой памяти. Вы можете изменить приоритеты приложений (по крайней мере, до перезагрузки) с помощью некоторых диспетчеров задач, но даже в этом случае, если память заканчивается, приложения в фоновом режиме начинают убиваться.

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

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

Оник
источник
1
Так не должно быть, ИМО. По умолчанию пусть система работает по-старому, и в случае, если пользователь намеревается запустить одно конкретное приложение в фоновом режиме именно в тот конкретный момент, когда возникает необходимость, просто предоставьте эту опцию. У него не должно быть другой категории разрешений, поскольку пользователи могут «закреплять» приложение. Я не хочу, чтобы приложение постоянно отключалось после запуска. Я просто хочу вариант сделать это, когда есть необходимость, как то, что я описал в своем вопросе.
супертонский
1
@onik переполнение буфера не имеет ничего общего с перегрузкой памяти. Вы знаете, что такое переполнение буфера?
3
@onik, так что ответ нет, вы не знаете, что такое переполнение буфера. Понял.
1
@onik также бесконечный цикл в связанном списке, безусловно, может запустить вас в OOM задолго до того, как вы зациклились Integer.MAX_VALUE. Почему вы думаете, что вещи ограничены в Integer.MAX_VALUEлюбом случае?
1
@onik правильно: по определению, переполнение буфера не может увеличить выделенный объем памяти. Если он расширяет выделенный объем памяти, это не является переполнением буфера. Вы думаете о бесконечной петле, я думаю.
Mooing Duck
1

Нет. Однако на ум приходят два способа решения проблемы, но оба они могут быть реализованы только разработчиком: первый - отображать уведомление, Android будет предоставлять приложениям, которые делают это, более высокий приоритет, чем другие. Второй способ - сохранить время запуска, чтобы при перезапуске таймера он не сбрасывался.

Erik
источник
1
Запуск приложений без причины с приоритетом Foreground (поэтому необходимо уведомление) считается плохой практикой. Как уже говорилось ранее: Android предоставляет хороший Api, который даже позволяет таймеры / счетчики, которые не затрагиваются убийцей OOM. На эту тему есть хорошая публикация от Dianne Hackborn
Flow
Я не сомневаюсь, что есть такой API, но где в этом вопросе было упомянуто ранее?
Эрик
1
Кроме того, очевидно, что в этом случае есть причина для того, чтобы приложение продолжало работать, если это вообще возможно, в отличие от приведенного вами примера игры.
Эрик
4
Нет, нет никаких причин, чтобы приложение работало только из-за таймера. Просто используйте onSaveInstanceStateи onRestoreInstanceStateдля сохранения состояния приложения, включая информацию о таймере. Нет необходимости бегать на переднем плане. Даже если это сигнал тревоги, вы можете использовать его AlarmManagerдля проверки позже. Единственная причина, по которой следует использовать Foreground: 1. У вас есть какая-то актуальная активность на переднем плане, например, воспроизведение музыки или показ видео. 2. Вы хотите, чтобы соединение для передачи данных было открыто (например, IMAP IDLE (push)).
Поток
0

1-й способ: - Если вы делаете Sticky Thread в программе, да, вы можете принудительно держать вашу программу в рабочем состоянии. Однако помните, что пользователь в расширенном режиме настройки может остановить фоновые приложения. Однако, если вы записываете липкий поток так, чтобы он начинался при любом событии, которое произошло, то этого можно достичь.

2-й способ: если пользователь не является root-пользователем, и вы хотите запустить приложение на заднем плане. использовать скрипт SL4 в фоновом режиме из приложения. используйте скрипт, который будет выполнять фоновые проверки и программы, и напишите интерфейс, чтобы показать что-то еще.

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

*** Извините за TYPO's .. проверка орфографии недоступна. Надеюсь, ты достигнешь того, что намеревался получить.

Бекки Мэнни
источник
Добро пожаловать на Android Enthusiast, сайт вопросов и ответов для конечных пользователей Android. Насколько я понимаю, 2 метода, которые вы предоставили, могут быть сделаны только со стороны разработчика, то есть с теми, у кого есть исходный код приложения. К сожалению, это не может быть полезным для большинства читателей, потому что они не разрабатывают приложение. Если это может быть применимо для не-разработчиков, попробуйте отредактировать ответ, чтобы было понятно, как это сделать, не касаясь исходного кода приложения . Благодарю.
Эндрю Т.
-1

Иногда есть возможность заблокировать приложение. Это предотвращает уничтожение или остановку этого приложения в телефоне.

Опция блокировки недоступна в самой ОС , могут помочь некоторые сторонние приложения, такие как GO Task Manager и т. Д.

Джайеш Тивари
источник
2
Убийство OOM выполняется ядром, и никакое приложение не может предотвратить его или «заблокировать» процесс. Приложение, с которым вы связались, является убийцей задач, который убивает сами приложения. Функция блокировки, на которую вы ссылаетесь, предотвратит только убийство задачи.
Эрик