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

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

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

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

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

Ответы (5)

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

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

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

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

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

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

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

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

Похоже, это все. Интересно, есть ли какие-либо исключения из этого правила, вы знаете, системные приложения, такие как телефон, контакты, будильники и т. д. Я надеюсь, что в будущем Google предоставит пользователям возможность «закрепить» любые приложения, которые пользователь запустил вручную. Это не обязательно делать при запуске, чтобы предотвратить блокировку телефона. Или, возможно, они могли бы, по крайней мере, позволить системе попытаться закрепить его на некоторое время, и если система перестанет отвечать, позволить пользователю закрыть ее.
Если это когда-нибудь произойдет, меньше всего я ожидаю новой категории разрешений для таких приложений. Это поможет людям, которые ценят время автономной работы и стабильность системы, избегать этих приложений. Я мог бы.
Так не должно быть, имхо. Пусть система работает по-старому по умолчанию, и в случае, если пользователь намеревается запускать одно конкретное приложение в фоновом режиме только в тот конкретный момент, когда возникает необходимость, просто предоставьте эту опцию. Ему не нужно иметь другую категорию разрешений, поскольку пользователи могут «закрепить» приложение по своему усмотрению. Я не хочу, чтобы приложение было невозможно остановить после запуска. Мне просто нужна возможность сделать это, когда есть необходимость, как я описал в своем вопросе.
@onik переполнение буфера не имеет ничего общего с переполнением памяти. Вы знаете, что такое переполнение буфера?
@dcow Да, я знаком с переполнением буфера. Поскольку Android имеет динамическое выделение памяти для своих песочниц, переполнение буфера может выйти за пределы текущих границ памяти и привести к увеличению размера песочницы. Конечно, из-за обработки памяти в Java это, возможно, был нишевый пример, лучшим был бы бесконечный цикл в LinkedList, который не ограничен Integer.MAX_VALUEсвоей структурой и может динамически увеличиваться.
@onik, так что ответ - нет, ты не знаешь, что такое переполнение буфера. Понятно.
@onik вот ссылка кстати: en.wikipedia.org/wiki/Buffer_overflow
@onik также бесконечный цикл в связанном списке, безусловно, может привести вас к OOM задолго до того, как вы зациклились Integer.MAX_VALUE. Почему вы думаете, что все ограничено в Integer.MAX_VALUEлюбом случае?
@dcow, так вы говорите, что переполнение буфера не может увеличить размер динамически выделяемой памяти или что это не обычное представление? И ограничение исходило от внутренней структуры массивов и векторов, о которых я подумал в первую очередь в этом случае. О, и спасибо за ссылку, я никогда не слышал о Википедии! ;)
@onik правильно: по определению переполнение буфера не может увеличить размер выделенной памяти. Если это увеличивает выделенный размер памяти, это не переполнение буфера. Я думаю, вы думаете о бесконечном цикле.

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

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

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

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

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

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

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

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

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

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