Чи є спосіб змусити додаток продовжувати працювати у фоновому режимі незалежно від того?


12

У сендвіч-морозиві (ICS) ОС класифікує ваш додаток, і для кожної категорії є свій поріг, в якому ОС використовує для визначення, який додаток потрібно закрити першим, коли у нього не вистачає пам'яті.

Хтось із вас дратувався, скажімо, ви відкрили таймер для запуску у фоновому режимі, щоб виміряти час, який минув що-небудь, потім ви відкрили ще кілька додатків і повернулися до свого таймера, щоб побачити, чи він був скинутий чи закритий? Я маю на увазі, серйозно, це насправді дратує роздратування.

Чи є спосіб змусити додаток продовжувати працювати у фоновому режимі, незважаючи ні на що, навіть коли в ОС не вистачає пам'яті?


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 надасть додаткам, які роблять це, більш високим пріоритетом, ніж інші. Другий - це збереження часу запуску, тому коли таймер врешті перезапуститься, він не буде скинутий.


1
Запуск програм без причин з пріоритетом переднього плану (тому повідомлення потрібне) вважається поганою практикою. Як було сказано раніше: Android забезпечує хороший Api, який навіть дозволяє таймери / лічильники, на які не впливає вбивця OOM. Є хороший пост від Діанні Хакборн на цю тему
Потік

Я не сумніваюся, що існує такий API, але де в цьому питанні це вже згадувалося раніше?
Ерік

1
Також, очевидно, є причина, щоб програма не працювала, якщо це взагалі можливо, на відміну від розміщеного вами прикладу гри.
Ерік

4
Ні, немає жодних причин тримати додаток лише через таймер. Просто використовуйте onSaveInstanceStateта onRestoreInstanceStateзахищайте стан додатка, включаючи інформацію про таймер. Не потрібно бігати на передній план. Навіть якщо це сигналізація, яку ви можете використати, AlarmManagerщоб переконатися, що вона буде виконана пізніше. Єдиною причиною, коли слід використовувати Foreground, є: 1. У вас триває деяке дійство переднього плану, наприклад, відтворення музики чи показ відео. 2. Ви хочете, щоб з'єднання для передачі даних було відкритим (наприклад, IMAP IDLE (натискання)).
Потік

0

1-й спосіб: - Якщо ви зробите Sticky Thread в програмі, так, ви можете насильно тримати свою програму на ходу. Однак пам’ятайте, що користувач у режимі розширеного налаштування може зупинити фонові програми. Однак якщо ви пишете липку нитку таким чином, що вона починається в будь-якому випадку, що сталося, цього можна досягти.

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

Напр .: У більшості ігрових двигунів це вбудовано. Вони підключаються до сервера, навіть якщо користувач вимкнув додаток. Причина, по якій двигун створює в телефоні кілька сценаріїв, які ретельно перевіряються в будь-яких конкретних подіях, і те, що TRIGGER використовується для постійного запуску вашого додатка на тлі переднього плану.

*** Вибачте за перевірку правопису TYPO .. не доступний. Сподіваюсь, що ти досягнеш того, що ти мав намір отримати.


Ласкаво просимо на Android Enthusiast, веб-сайт Q&A для кінцевих користувачів Android. Наскільки я можу зрозуміти, два надані вами способи можна виконати лише з боку розробника, тобто з тих, хто має вихідний код програми. На жаль, це може бути не корисним для більшості читачів тут, оскільки вони не розробляють додаток. Якщо це може бути застосовно до не розробника, подумайте про редагування відповіді, щоб зрозуміти, як це зробити, не торкаючись вихідного коду програми . Дякую.
Андрій Т.

-1

Іноді є можливість заблокувати додаток. Це запобігає вбивству або зупинці програми в телефоні.

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


2
Убивство OOM виконується ядром, і жодна програма не зможе запобігти йому чи «заблокувати» процес. Додаток, з яким ви пов’язали, є вбивцею завдань, яке вбиває самі програми. Функція блокування, на яку ви посилаєтесь, запобігає вбивству лише вбивцею завдання.
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.