Чи нахмурився додаток?


1151

Продовжуючи свою спробу вивчити Android, я просто прочитав наступне :

Питання: Чи є у користувача вибір вбити програму, якщо ми не поставимо варіант меню, щоб її вбити? Якщо такої опції немає, як користувач припиняє програму?

Відповідь: (Ромен Гай): Користувач цього не робить, система обробляє це автоматично. Ось для чого складається життєвий цикл діяльності (особливо onPause / onStop / onDestroy). Незалежно від того, що ви робите, не кладіть кнопку "вийти" або "вийти". Це марно з додатковою моделлю Android. Це також суперечить тому, як працюють основні програми.

Хе-хе, за кожен крок, який я роблю в світі Android, я стикаюся з якоюсь проблемою = (

Мабуть, ви не можете вийти з програми в Android (але система Android може дуже добре знищити ваш додаток, коли вам це здасться). Що з цим? Я починаю вважати, що неможливо написати додаток, який функціонує як "звичайний додаток" - що користувач може вийти з програми, коли він / вона вирішить це зробити. Це не те, на що слід покладатися ОС.

Додаток, який я намагаюся створити, не є додатком для Android Market. Це не додаток для "широкого використання" широкою громадськістю, це діловий додаток, який буде використовуватися у дуже вузькому бізнесі.

Я насправді дуже сподівався розробити для платформи Android, оскільки вона вирішує безліч проблем, які існують у Windows Mobile та .NET. Однак останній тиждень був для мене дещо поворотом ... Я сподіваюся, що мені не доведеться відмовлятися від Android, але зараз він виглядає не дуже добре = (

Чи є спосіб, щоб я справді закрив заявку?

Відповіді:


1285

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

Справа в тому, що я не можу дозволити Android визначити, коли моє додаток буде закрито. це повинен бути вибір користувача.

Мільйони людей цілком задоволені моделлю, де навколишнє середовище закриває додаток у міру необхідності. Ці користувачі просто не замислюються про те, щоб "закрити" додаток для Android, більше, ніж думають про "припинення" веб-сторінки або "припинення" термостата.

Користувачі iPhone майже однаково, тому що натискання кнопки iPhone не обов'язково "відчуває", як додаток було припинено, оскільки багато додатків iPhone піднімаються там, де користувач припинився, навіть якщо додаток справді було вимкнено (оскільки лише iPhone дозволяє одночасно додавати сторонні додатки).

Як я вже говорив вище, у моєму додатку відбувається багато речей (дані, які PUSHed на пристрій, списки із завданнями, які завжди повинні бути там тощо).

Я не знаю, що означає "списки із завданнями, які завжди повинні бути там", але "дані, які передаються на пристрій", є приємною вигадкою, і це не повинно робитись діяльністю ні в якому разі. Використовуйте заплановане завдання (через AlarmManager), щоб оновити свої дані для максимальної надійності.

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

Існує багато додатків для iPhone та Android, які займаються цим. Зазвичай, це тому, що вони тримають облікові дані для входу, а не змушують користувачів кожного разу входити вручну.

Наприклад, ми хочемо перевірити оновлення під час виходу з програми

Це помилка в будь-якій операційній системі. Як ви знаєте, причина, коли ваша програма "закривається", полягає в тому, що ОС вимикається, і тоді процес оновлення завершиться невдачею середнього потоку. Взагалі, це не дуже добре. Або перевіряйте оновлення при запуску, або перевіряйте оновлення повністю асинхронно (наприклад, за допомогою запланованого завдання), ніколи не виходячи.

Деякі коментарі говорять про те, що натискання кнопки "назад" зовсім не вбиває додаток (див. Посилання в моєму питанні вище).

Натискання кнопки НАЗАД не "вбиває додаток". Він закінчує активність, яка була на екрані, коли користувач натискав кнопку НАЗАД.

Він повинен припинятись лише тоді, коли користувачі хочуть його припинити - ніколи інакше. Якщо ви не можете писати програми, які так поводяться в Android, я думаю, що Android не можна використовувати для написання реальних додатків = (

Тоді і веб-додатки не можуть. Або WebOS , якщо я правильно розумію їхню модель (ще не мали можливості зіграти з нею). У всьому цьому, користувачі нічого не "припиняють" - вони просто залишають. iPhone дещо відрізняється тим, що він лише зараз дозволяє запускати одну річ (за кількома винятками), і тому акт виходу передбачає досить негайне припинення роботи програми.

Чи є спосіб, щоб я справді закрив заявку?

Як усі говорили вам, користувачі (за допомогою BACK) або ваш код (через finish()) можуть закрити вашу поточну діяльність. Користувачі, як правило, не потребують нічого іншого, для правильно написаних програм, більше, ніж їм потрібна опція "вийти" для використання веб-програм.


Немає двох середовищ додатків однакові за визначенням. Це означає, що ви можете бачити тенденції в оточенні, коли виникають нові, а інші потрапляють.

Наприклад, зростає рух, щоб спробувати усунути поняття "файл". Більшість веб-додатків не змушують користувачів думати про файли. Зазвичай програми iPhone не змушують користувачів думати про файли. Зазвичай програми Android не примушують користувачів думати про файли. І так далі.

Так само зростає рух, щоб спробувати усунути поняття "припинення" програми. Більшість веб-додатків не змушують користувача виходити з системи, а скоріше неявно виходять з нього після періоду бездіяльності. Те саме і з Android, і в меншій мірі, з iPhone (і, можливо, з WebOS).

Це вимагає більшого акценту на розробці додатків, орієнтації на бізнес-цілі та не дотримуючись моделі реалізації, прив’язаної до попереднього середовища застосування. Розробники, яким не вистачає часу або схильності на це, розчаруються в нових середовищах, які порушують існуючу ментальну модель. Це не вина жодного середовища, більше, ніж вина гори за бурі, що протікають навколо неї, а не через неї.

Наприклад, у деяких середовищах розробки, як Hypercard та Smalltalk, програма та інструменти розробки поєднуються в одній програмі. Ця концепція не зачепила багато, крім мовних розширень програм (наприклад, VBA в Excel , Lisp в AutoCAD ). Розробники, які придумали ментальні моделі, які припускали існування інструментів розробки в самому додатку, тому повинні були або змінити свою модель, або обмежитися середовищем, де їх модель справдиться.

Отже, коли ви пишете:

Поряд з іншими безладними речами, які я відкрив, я думаю, що розробити наш додаток для Android не відбудеться.

Це, здається, найкраще, для вас, зараз. Так само я б радив вас не намагатися перенести свою програму в Інтернет, оскільки деякі ті самі проблеми, про які ви повідомляли з Android, ви знайдете і в веб-додатках (наприклад, відсутність "припинення"). Або, навпаки, коли - небудь , якщо ви робите порт додаток до Інтернету, ви можете виявити , що потік веб - додаток може бути краще підходить для Android, і ви можете повернутися до Android порт в той час.


21
Одна думка, що промайнула в моїй голові: Якщо я просто перепишу весь додаток як Сервіс, і ставлюся до цієї Служби як до фактичної програми - можливо, це буде працювати краще? Тоді я міг би "придурити" діяльність (так, як хоче їх Android), щоб просто представити дані, що містяться в Сервісі. У цьому випадку я, можливо, міг би зберегти стан входу та інші речі там. Використовуючи startForeground (int, сповіщення), я майже не можу зупинити Android від вбивства служби ...?
Тед

66
"Зауважте, що мої користувачі - професіонали, які використовують цей пристрій виключно з допомогою програми, яку я намагаюся перенести на Android". Насправді ви вказали інше ("не можу робити це кожного разу, коли вони отримують телефонний дзвінок" - "телефонний дзвінок" - це не ваш додаток). Крім того, якщо ви не створюєте власний пристрій, ви не можете перешкоджати інсталювати інші програми, якщо вони захочуть.
CommonsWare

25
@SomeCallMeTim: Ні, це не поважна причина використання killProcess(). Це поважна причина написати кращий iOS-код.
CommonsWare

24
@CommonsWare: Вибачте, але це банальна відповідь, яка мені не корисна. Я переношу код, який мені платять за порт. Якщо я витратив два рази більше часу на порт, переписуючи їх код, або це зробити так, щоб зменшити витрати для мого роботодавця, дозволяючи їм швидше розміщувати більше ігор на Android? Це все одно цілком академічне запитання: вони не хочуть, щоб я вносив такі великі зміни у свій двигун, оскільки я не можу перевірити зміни на iOS. І це просто неправильно: у використанні шаблонів Singleton для відповідних об'єктів немає нічого поганого. Android - це просто зламані програми WRT NDK.
SomeCallMeTim

10
@Ted для більш надійної реініціалізації, можливо, ви могли б мінімізувати кількість стану, що зберігається в самій діяльності або службі. Натомість розміщуйте більшу частину стану та коду в окремому класі, який ви відтворюєте "з нуля" щоразу, коли починається діяльність або служба.
Qwertie

289

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

System.exit()не вбиває ваш додаток, якщо у вас є кілька дій у стеку. Що насправді відбувається, це те, що процес вбивається та негайно перезапускається з меншою кількістю активності на стеку. Це також відбувається, коли ваш додаток вбито в діалоговому вікні «Закрити» або навіть при спробі вбити процес із DDMS. Наскільки мені відомо, це абсолютно незадокументований факт.

Коротка відповідь полягає в тому, що якщо ви хочете закрити свою програму, ви повинні відслідковувати всі дії у вашому стеку та finish()ВСІ з них, коли користувач хоче вийти (і ні, немає ніякого способу ітерації через стек Activity , тому вам доведеться все цим керувати самостійно). Навіть це насправді не вбиває процес або будь-які звисаючі посилання, які ви можете мати. Він просто закінчує діяльність. Крім того, я не впевнений, чи Process.killProcess(Process.myPid())працює краще; Я цього не перевіряв.

Якщо, з іншого боку, у вас все нормально, щоб у вашому стеку залишилися дії, є ще один метод, який полегшує вам речі: Activity.moveTaskToBack(true)просто ви перетворите ваш процес і покаже головний екран.

Довга відповідь передбачає пояснення філософії, що стоїть за цією поведінкою. Філософія народжується з ряду припущень:

  1. Перш за все, це відбувається лише тоді, коли ваш додаток на першому плані. Якщо він знаходиться на задньому плані, процес закінчиться просто чудово. Однак, якщо вона стоїть на передньому плані, ОС передбачає, що користувач хоче продовжувати робити все, що він / вона робив. (Якщо ви намагаєтеся вбити процес із DDMS, спершу слід натиснути кнопку додому, а потім вбити)
  2. Він також передбачає, що кожна діяльність не залежить від усіх інших видів діяльності. Це часто справедливо, наприклад, якщо ваш додаток запускає активність веб-переглядача, яка є повністю окремою і не написана вами. Активність веб-переглядача може бути створена або не може бути створена для одного завдання, залежно від атрибутів маніфесту.
  3. Це передбачає, що кожна ваша діяльність є повністю самовідданою і може бути вбита / відновлена ​​за мить. (Мені більше не подобається це припущення, оскільки в моєму додатку є багато видів діяльності, які покладаються на велику кількість кешованих даних, занадто великі, щоб бути ефективно серіалізованими під час onSaveInstanceState, але що робитиму?) Для більшості добре написаних програм для Android це має бути правдою, оскільки ви ніколи не знаєте, коли ваш додаток буде вибитий у фоновому режимі.
  4. Остаточним фактором є не стільки припущення, скільки скоріше обмеження операційної системи: вбивство програми явно те саме, що і збій програми, а також те саме, що Android, що вбиває додаток, щоб повернути пам'ять. Це завершилося нашим граціозним переворотом: оскільки Android не може визначити, чи додаток вийшов з ладу або загинув у фоновому режимі, він передбачає, що користувач хоче повернутися туди, де вони припинилися, і тому ActivityManager відновлює процес.

Коли ви думаєте про це, це підходить для платформи. По-перше, саме це відбувається, коли процес вбивається у фоновому режимі, і користувач повертається до нього, тому його потрібно перезапустити там, де він припинився. По-друге, це те, що відбувається, коли програма виходить з ладу і представляє жахливий діалог Force Close.

Скажіть, я хочу, щоб мої користувачі могли сфотографувати та завантажити його. Я запускаю Camera Activity зі своєї діяльності і прошу повернути зображення. Камера висувається на вершину мого поточного завдання (а не створюється в його власному завданні). Якщо в камері є помилка, і вона виходить з ладу, чи це може призвести до збою всього додатка? З точки зору користувача, лише Камера вийшла з ладу, і їх слід повернути до їх попередньої діяльності. Тож він просто перезавантажує процес із усіма тими ж діями у стеці, за вирахуванням камери. Оскільки Ваша діяльність повинна бути розроблена таким чином, щоб вони могли бути вбиті та відновлені при падінні шапки, це не повинно бути проблемою. На жаль, не всі програми можуть бути розроблені саме так, так і єпроблема для багатьох із нас, незалежно від того, що вам каже Ромен Гай чи хтось інший. Отже, нам потрібно використовувати обхідні шляхи.

Отже, моя заключна порада:

  • Не намагайтеся вбити процес. Або зателефонуйте finish()на всі дії або зателефонуйте moveTaskToBack(true).
  • Якщо ваш процес виходить з ладу або вбивається, і якщо, як я, вам потрібні дані, які були в пам'яті, які втрачені зараз, вам потрібно буде повернутися до кореневої активності. Для цього вам слід зателефонувати startActivity()з наміром, який містить Intent.FLAG_ACTIVITY_CLEAR_TOPпрапор.
  • Якщо ви хочете вбити свій додаток з точки зору Eclipse DDMS, краще не бути на передньому плані, інакше він перезапуститься. Спершу слід натиснути кнопку Головна, а потім вбити процес.

8
Насправді, оскільки я знову почав працювати з Android, я закінчую всі види діяльності (лише одна діяльність активна в будь-який момент часу), і тоді я викликаю System.exit (0); в моїй службі - і це працює так, як я і цього хочу. Я знаю, що більшість ppl кажуть "не роби цього", але я розумію саме таку поведінку, яку хочу з цим ходом ...
Тед

13
Убивання процесу буває дуже корисним іноді - наприклад, при написанні ігор, в яких використовується нативний код. Вбивство процесу означає негайно випустити всю виділену пам’ять в систему.
Султан

10
Для всіх, кого це хвилює, Process.killProcess демонструє абсолютно таку саму поведінку, що і System.exit ()
PacificSky

6
Отримуйте всі дії від загальної ActivityBase. Потім утримуйте прапор, щоб змусити закрити додаток, onResume перевірити, чи встановлено прапор примусового закриття. Якщо так, зателефонуйте System.exit (0); Це зробить каскад через увесь стек діяльності і, нарешті, повністю закриє додаток.
Нар Гар

12
Дякуємо за надання фактичних відповідей ( moveTaskToBack()було те, що я шукав). Тому багато людей просто кажуть "Ні, ти не ідіот, коли хочеш вийти з програми". навіть не враховуючи, що можуть бути випадки, коли ви цього хочете (наприклад, невдалі входи в систему).
Timmmm

179

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


15
+1, тому що, на жаль, на даний момент це не робить такої доброї роботи (але я все ж хочу спробувати робити те, як було задумано, тому це ставить мене в загрозу)
Річард Ле Месюр'є

25
Який механізм ви використовуєте для виходу?
Гарі Рудольф

4
@Igor закінчити () - діяльність не знищує додаток (розширює програму). Тож навіть коли жодна з активних заходів не була активною, налаштування залишаються активними та актуальними, так що, коли дії намагаються отримати доступ до них, вони будуть тими, які використовувались раніше. System.exit (0); з іншого боку, вбиває програму, так що після запуску додаток доведеться ініціалізувати налаштування заново. Це те, що мені потрібно під час оновлення програми вручну, оскільки я часто змінюю формат даних і мені потрібно, щоб вони були негайно відновлені.
Нар Гар

1
Ну, це єдиний спосіб виконати те, що мені потрібно на даний момент. Я використовую system.exit, коли додаток оновлюється (інакше я отримаю винятки щодо серіалізації чи класів на основі змін мого коду). Хоча сказати, що я не даю користувачеві користувальницького інтерфейсу ручку вбивати додаток через system.exit - він зарезервований для мене як інженера додатка, який потрібно використовувати лише тоді, коли програму абсолютно потрібно повністю вивантажити. Решту часу використовується просте закінчення () (або функція повернення за замовчуванням).
Нар Гар

13
Так ... до чорта з "не андроїдним стандартом" .. Android є потужним, тому він дозволяє людям експериментувати. Якщо він надає API, щоб зробити щось, як можна сказати, що це не стандарт Android? Я не можу перетравити всі ці "філософські" відповіді. Ви робите додаток, враховуючи своїх користувачів. якщо вони щасливі чи хочуть бачити цю особливість, то цілком чудово реалізувати це, навіть якщо ті, так звані філософи, проти цього ..
Рахул,

144

Перестаньте думати про свою заяву як про монолітну програму. Це набір екранів інтерфейсу користувача, за допомогою яких користувач може взаємодіяти з вашими "додатками" та "функціями", що надаються через сервіси Android.

Не знаючи, що "робить" ваш таємничий додаток, насправді не важливо. Припустимо, що він тунель у якусь супер безпечну корпоративну інтранет, виконуючи певний моніторинг або взаємодію, і залишається ввійти доти, поки користувач не закриє програму. Оскільки ваш ІТ-відділ командує ним, користувачі повинні бути дуже усвідомлені, коли вони ВХОДУТЬ або ВІД ІНТЕРНЕТ. Отже, ваша думка про важливість для користувачів "виходу".

Це просто. Створіть службу, яка розміщує поточне повідомлення на панелі сповіщень із запитом "Я в інтрамережі, або я бігаю". Дозвольте цій службі виконувати всі функції, необхідні для вашої програми. Проводьте діяльність, яка пов'язується з цією послугою, щоб ваші користувачі мали доступ до бітів інтерфейсу, необхідного для взаємодії з вашою "програмою". А також у меню Android -> Вийти (або вийти з системи, чи будь-що інше), яка сповіщає службу вийти, а потім закриє саму діяльність.

Це для всіх намірів і цілей саме те, що ви кажете, що хочете. Виконав Android-спосіб. Подивіться на Google Talk або Навігацію на Картах Google, щоб приклади цього "виходу" є можливим менталітетом. Єдина відмінність полягає в тому, що натискання кнопки "назад" у вашій діяльності може залишити ваш процес UNIX у режимі очікування на випадок, якщо користувач захоче відновити вашу програму. Це насправді нічим не відрізняється від сучасної операційної системи, яка кешує нещодавно доступні файли в пам'яті. Після того, як ви закриєте програму Windows, найімовірніше, що потрібні їй ресурси все ще залишаються в пам'яті, чекаючи, що їх замінять інші ресурси, оскільки вони завантажуються зараз, коли вони більше не потрібні. Android - це те саме.

Я справді не бачу вашої проблеми.


3
@Eric, ти не бачиш проблеми, бо ти від неї тікаєш . Ви просто використали іншу програму, яка працює на старій "моделі програми", щоб зробити те, що не може зробити "модель Android". Щоб побачити проблему з "моделлю Android", ви повинні уявити, що у вас немає розкоші делегування завдань у вікна Linux / Windows. Ви повинні уявити, що ви змушені робити все, починаючи від фронтового моменту до задніх, лише з ящиками, на яких працює "модель Android". Потім ви побачите, що обмеження "моделі Android" такі ж чіткі, як і небо.
Pacerier

подумайте про свою заяву як про монолітну програму. Він написаний на Java, який виконується одним процесом JVM (Java Virtual Machine). System.exit () виходить із JVM і повністю та повністю припиняє всі екрани інтерфейсу та все. Винятком є ​​те, що якщо програміст не вдається встановити декілька потоків, які працюють у декількох процесах - але за замовчуванням це НЕ так, і за словами Google, це не повинно робитись нормально.
Джессі Гордон

@JesseGordon Це просто неправда. System.exit()видаляє лише активність зі стека. СВМ негайно реабілітується. Дивіться цю відповідь .
forresthopkinsa

1
@forresthopkinsa OK Я перевірив його на android 7.0. Простий додаток з однопотоковим зв’язком все ще працює у власному виділеному екземплярі JVM, працює як ідентифікатор користувача, унікальний для цього додатка. Я ще не пробував багатопотокове додаток для цього тесту. І System.exit () ВСІХ вбиває весь JVM для цього додатка. Якщо System.exit () викликається з первинної діяльності, він просто закривається. Якщо виклик System.exit () викликається субактивністю, JVM все ще вбивається, але android перезапускає його під новим ідентифікатором процесу назад при головному / першому дії. android.os.Process.killProcess (android.os.Process.myPid ()); і вбивати <pid> працювати так само.
Джессі Гордон

1
Цікаво .. Переглядаючи відповідь, яку ви зв'язали, @forresthopkinsa, схоже, що Android робить подібні веб-браузери, відновлюючи діяльність після system.exit, щоб користувач не помітив, що вона вийшла, але виключаючи активність, яка спричинила вихід. .? Дивно. Але в будь-якому випадку, System.exit () робить близько всі заходи і вільний () 'S пам'яті і завершує JVM для цього додатка. Але я поняття не маю, які витівки Android робить для її перезавантаження / відновлення. Це для того, щоб зірвати додатки вбивць програм? Тому я здогадуюсь, якщо хтось хоче кнопку виходу, він повинен поставити її в основній діяльності.
Джессі Гордон

71

Це цікава та глибока дискусія з такою великою кількістю експертів. Я вважаю, що цю публікацію слід перенести на головний веб-сайт для розробки Android, оскільки він обертається навколо однієї з основних конструкцій ОС Android.

Я також хотів би додати тут свої два центи.

Поки що я був вражений способом управління Android подіями життєвого циклу, наближаючи концепцію веб-подібного досвіду до рідних програм.

Сказавши, що я все ще вважаю, що має бути Quitкнопка. Чому? ... не для мене або Теда чи когось із технічних гуру тут, а з єдиною метою задоволення потреб кінцевого споживача.

Хоча я не є великим шанувальником Windows, але давно вони запровадили концепцію, до якої звикли більшість кінцевих користувачів (кнопка X) ... "Я хочу кинути роботу із віджетом, коли" хочу ".

Це не означає, що хтось (ОС, розробник?) Подбає про це на власний розсуд ... це просто означає "де моя червона кнопка X, до якої я звик". Моя дія повинна бути аналогічною "припинення дзвінка при натисканні кнопки", "вимкнення пристрою натисканням кнопки" і так далі і так далі ... це сприйняття. Вона сама по собі дає задоволення, що моя дія дійсно досягає своєї мети.

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


2
Правильно. Добрий ol 'Windows Mobile запропонував ту саму кнопку X, що й ПК з Windows, за винятком того, що він насправді не вийшов із програми, він просто «розумний мінімізував» його. Багато користувачів, напевно, ніколи не дізналися, що програма насправді не вийшла. (Підхід спрацював чудово, хоча якщо ви використовували .NET Compact Framework, додаток не отримував повідомлення про те, що це сталося, і тому у нього не було можливості звільнити ресурси або фактично вийти з ладу.)
Qwertie

3
Дійсно, це означає брехня ваших користувачів, щоб дати їм тепле, нечітке відчуття. Зрештою, краще дозволити мощам минулого впасти на узбіччя, щоб вони не залишалися постійними кріпленнями технології. Мобільні пристрої та Інтернет - це нові платформи, і не очікується, що вони поводяться так, як настільні. І анекдотично, принаймні, рішення щодо життєвого циклу Android, здається, привертають увагу користувачів: коли мій найбільший додаток проходить 2-річний ювілей, я помітив, що потоки запитів кінцевих користувачів про кнопки «виходу» висихають, коли вони звикають до нова платформа.
Джон O

2
@Jon Що ти рекомендуєш? Не пропонуєте опцію "вихід" ніде в додатку?
ІгорГанапольський

Ну а коли користувач попросив кнопку виходу, я б пояснив їм, як все працювало інакше, ніж на робочому столі (це те саме пояснення, яке я їм даю, коли вони згадують вбивць завдань). Зараз, схоже, інформація зачепилася, і я більше не отримую цих запитів. Тому я рекомендую вам пояснити це кілька разів (можливо, придумати консервовану відповідь) і залишити кнопку. Або вставте підроблену кнопку виходу, яка відкриє діалогове вікно, що пояснює, чому більше немає кнопок виходу. : D (Також в Android 4+ користувач може провести додаток "вимкнено" багатозадачного дисплея, щоб "вбити" його.)
Jon O

3
Я також не знайшов міркувань, що стоять за всіма порадами, які говорять "не вбивай процес". На мою думку, замовник завжди правий, тож що не так у наданні кнопки виходу після того, як його просять, і «брехати своїм користувачам, щоб дати їм тепле, нечітке відчуття», якщо це те, чого вони хочуть? Це частково те, про що добре писати хороші програми. Більшість користувачів не знають і не цікавлять, що насправді відбувається під кришкою, але якщо їм подобається ваш додаток, і він робить те, що вони хочуть і очікують, вони повернуться і придбають більше ваших додатків. Це ми всі хочемо, чи не так? Або я щось пропускаю?
DDSports

37

Ви можете вийти, натиснувши Backкнопку або зателефонувавши finish()у свою Activity. Просто зателефонуйте finish()з, MenuItemякщо ви хочете, щоб явно знищити його.

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


5
Це не безглуздо, якщо він виконує мету, а в нашому застосуванні він робить саме це. Наприклад, ми хочемо перевірити оновлення під час виходу з програми. Ми не можемо вийти з програми, тоді оновлення не можна робити. Деякі коментарі говорять про те, що натискання кнопки "назад" зовсім не вбиває додаток (див. Посилання в моєму питанні вище).
Тед

2
Як каже Ромен, це не так, як працюють основні програми. Тож якщо користувачі звикли натискати кнопку "Назад", щоб вийти з програми, то, мабуть, ймовірно, що вони продовжуватимуть це робити з вашим додатком, а не чітко вибирати Вийти? Ви можете зробити перевірку оновлення під час запуску, або onDestroy (), або за допомогою повторюваної тривоги .. це не схоже на те, що потрібно викликати користувачем.
Крістофер Орр

1
Том: Я кодую Windows Mobile майже 5 років. Це телефон з "обмеженими ресурсами". Немає такої поведінки там, і немає проблем, що вона теж не діє в тому "старшому браті". "Справжні програми" = там, де програміст має набагато більший контроль над ним, тобто кидає, коли GUI-матеріали видаляються тощо ...
Тед

1
Джей: адже якщо його все ще зберігається в пам'яті, я не можу оновити додаток, що я думаю. Неможливо використати файли delelte, які використовуються, правда? Я хочу оновити при виході, оскільки ми не можемо змусити наших користувачів оновлюватись при запуску. Це пов'язане з тим, як вони працюють і що їм потрібно. Їм не нормально, щоб їх з різних причин змушували оновити на початку зміни. Це трохи складніше.
Тед

1
Джей: Ні, як я заявив, що це відмовляється, це НЕ Market Market, і його теж не буде. Це дуже спеціалізоване додаток, не для загального використання.
Тед

31

Ця дискусія зводиться до вікового питання, чи розробники знають найкраще, чи користувач знає найкраще. Професійні дизайнери у всіх сферах людських факторів щодня борються з цим.

Тед зазначив, що однією з найбільш завантажених програм на ринку є "App Killer". Люди отримують трохи зайвого серотоніну, коли вони закривають заявки. Вони звикли до цього з робочим столом / ноутбуком. Це змушує речі швидко рухатися. Це тримає процесор прохолодно і вентилятор не включається. Він використовує менше енергії.

Якщо ви вважаєте, що мобільний пристрій є набагато меншим судном, то ви можете особливо оцінити їх стимул "кидати за борт те, що вам більше не потрібно". Зараз розробники Android обґрунтували, що ОС найкраще знає, і що вийти з програми є антикваріатом. Я щиро підтримую це.

Однак я також вважаю, що ви не повинні засмучувати користувача, навіть якщо це невдоволення випливає з їх власного незнання. Через це я роблю висновок, що варіант «Вийти» - це гарний дизайн, навіть якщо це здебільшого кнопка плацебо, яка не робить нічого іншого, як закрити вигляд.


8
Так, кнопка "Вийти" - це справді зручно для користувачів. Як інакше користувач вийде з програми, якщо він 5 захоплюється ним? Звичайно, вони можуть натиснути назад кілька разів, але я не думаю, що їм це сподобається.
ІгорГанапольський

4
Тільки 5? Веб-браузер Android 2.2 змушує мене витратити кілька хвилин, натискаючи кнопку "назад", поки я врешті-решт не вийду
Joe Plante

3
Я б почав слухати розробників Android, коли вони розробляють диспетчер пам'яті, який ПРАЦЮЄ. За станом на Froyo, вона працювала вкрай погано, вибиваючи випадкові додатки, перезапускаючи додатки, які не потребують (і не мають намірів запускати їх законно), і OTOH, сповільнюючись до ПОПАЛЬНОГО повзання, коли пам'ять потрапляє на 50 Мб безкоштовно.
DVK

10
Коли ваша релігія каже, що Android Task Killer є "не потрібним", але використання ATK для вбивства німих завдань, у яких не працює бізнес, змінює ОС від повзання на ~ 1-5% від нормальної швидкості назад до 100% від звичайної швидкості ( відміряно) 100% часу на 1000 тисяч випадків використання ATK протягом 2 років щоразу, коли система потрапляє на 50 Мб безкоштовного нижнього кінця, ваша релігія помилкова
DVK

@JoePlante Ви можете спочатку закрити всі відкриті вкладки та вікна, а потім просто натиснути кнопку назад, щоб вийти :) Принаймні на моєму GS2, що є.
ldam

29

Теде, те, що ти намагаєшся зробити, може бути зроблено, можливо, просто не так, як ти зараз це думаєш.

Я пропоную вам прочитати на тему "Діяльність та послуги". Перестаньте використовувати термін "додаток" і почніть посилатися на компоненти, тобто активність, сервіс. Я думаю, вам просто потрібно дізнатися більше про платформу Android; це зміна мислення зі звичайного додатка для ПК. Той факт, що в жодному з ваших дописів не було слова "Активність" (окрім цитати, тобто не ваших слів), вказує на те, що вам потрібно прочитати ще кілька.


Я читаю більшість матеріалів на android.com =), і я можу посилатися на кілька моїх питань, де я розповідаю про Діяльність, так що це неправда (наприклад: stackoverflow.com/questions/2032335/… або stackoverflow.com/questions/ 2032335 /… і т. Д. ...) Однак я можу остаточно зайти і спробувати створити того, хто «додаток» як Сервце ...
Тед

4
Додаток може містити Сервіси та Діяльності, і здається, що вашому додатку можуть знадобитися і те, і інше. Діяльність є лише частиною інтерфейсу користувача.
Аарон

23

Повідомлення в блозі Коли потрібно включити кнопку виходу в додатки для Android (Підказка: Ніколи), це пояснює це набагато краще, ніж я можу. Я хочу, щоб кожен розробник Android вже прочитав його.

Витяги:

На мій досвід, що насправді хочуть [користувачі]: це однозначний спосіб гарантувати, що додаток перестане витрачати ресурси (акумулятор, цикли процесора, передача даних тощо).

Багато користувачів розуміють, що кнопка виходу реалізує цю вимогу і просять її додати. Розробники, прагнучи догодити своїм користувачам, обов’язково додають його. Незабаром після цього вони обоє зазнають невдачі.

  • У більшості випадків кнопка виходу просто дзвонить Activity.finish(). Це точно еквівалентно натиснувши кнопку назад. Саме так. Служби продовжують працювати, а опитування триває. Користувачі можуть подумати, що вони вбили додаток, але цього не зробили, і незабаром вони ще більше роздратуються.
  • Зараз поведінка виходу неоднозначна. Якщо ваша кнопка виходу просто закриє активність, або вона також зупинить усі пов'язані служби, приймачі та сигнали тривоги? Що Backробити? Що станеться, якщо вони вдарять Homeзамість цього? Що станеться, якщо у вашої програми є віджет? Чи повинна кнопка виходу зупинити це також від оновлення?

Рішення полягає в тому, щоб змусити кнопку "Назад" вести себе так, як ви очікували на кнопку виходу. Що ще краще, просто припиніть витрачати ресурси, коли додаток не відображається.

Вперед і прочитайте всю статтю.


3
Вихід і Назад не завжди використовуються з однаковою метою. Візьмемо, наприклад, Пандору. Коли ви повернетесь, щоб вийти з цього додатка, він не закриває додаток (він продовжує грати у фоновому режимі як послугу).
ІгорГанапольський

@IgorG. Додаток для музичного плеєра потребує кнопки "Стоп" для припинення відтворення музики, а не кнопки "Вийти" для виходу з програми.
Dheeraj Vepakomma

Чи використовували ви коли-небудь Pandora, iHeartRadio, Spotify, Jango та інші додатки для потокового перегляду музики? Усі вони мають кнопку виходу. Припинення відтворення музики НЕ ТЕБЕ, що виходить із програми. Особливо, якщо у вас працює служба на панелі сповіщень.
ІгорГанапольський

2
Міфічні чи ні, примітивні користувачі чи ні, але майже кожен програмний інтерфейс користувача, коли-небудь написаний - на будь-якій платформі та ОС - реалізує кнопку виходу / закриття / виходу. Як інакше ви це реалізуєте?
ІгорГанапольський

3
@ DheerajV.S., Просто припиніть витрачати ресурси, коли додаток не видно? Погана порада. Дуже. Дуже x99. Кожен раз, коли я намагаюся надсилати електронною поштою фотографію, я повинен зберігати додаток протягом 5 хвилин, оскільки, якщо я його мінімізую, він перестає надсилати фотографії електронною поштою. Правильно, я не можу користуватися своїм телефоном впродовж 5 хвилин лише через розробника, який вважає, що програми повинні працювати лише тоді, коли вони видимі. Тепер уявіть собі, як надіслати більший файл, як відео .....
Pacerier

21

Відповідь: (Ромен Гай): Користувач цього не робить, система обробляє це автоматично. Ось для чого складається життєвий цикл діяльності (особливо onPause / onStop / onDestroy). Незалежно від того, що ви робите, не кладіть кнопку "вийти" або "вийти". Це марно з додатковою моделлю Android. Це також суперечить тому, як працюють основні програми.

1: Повністю закриття програми може бути, як правило, необов’язковим, але це не марно. Що робити, якщо Windows не мала можливості виходу? Система буде собачою повільно, оскільки пам'ять заповнена, і ОС повинна була здогадуватися, з якими програмами ви працювали. Мені все одно, що кажуть Ромен Гай чи навіть Ларрі Пейдж та Сергій Брін - це безперечні факти: системи працюють повільніше, коли їм потрібно вбити завдання, щоб отримати пам'ять, перш ніж запустити новий додаток. Ви просто не можете сказати мені, що не потрібно часу, щоб убити додаток! Навіть світло від далеких зірок зайняти деякий час ... Там є деяка користь в дозволяючи користувачеві повністю закривати додатки.

2: На відміну від того, як працюють основні програми? Що це має означати? Коли я закінчую запускати додаток, він більше не робить ніякої роботи ... Він просто чекає, коли ОС буде вбита, коли потрібна його пам'ять.

Підводячи підсумок, існує чітка різниця між мінімізацією та виходом, і жоден прищик не підходить для іншого. Чи залишаємо викрутку в кожному гвинті? Або ключ у кожних дверях? Чи залишаємо ми весь прилад високим, доки не вийде вимикач і нам потрібно включити інший прилад? Ми залишаємо посудомийну машину наповненою посудом, і лише щоразу виймаємо достатньо, щоб звільнити місце для нових брудних? Ми залишаємо всі машини, що бігають на проїжджій частині, поки - о, неважливо.

Якщо користувач хоче мінімізувати додаток, то найкраще - мінімізувати його. Якщо користувач хоче вийти з програми, тоді найкраще вийти.

Це нахмурилося? Такий погляд на Android - вони на це хмуряться. І безліч незалежних розробників-початківців Android нахмурилися на нього.

Але коли справа доходить до цього, є хороше кодування та погане кодування. Є хороші моделі програмних потоків і є погані моделі програмних потоків.

Залишати програми в пам’яті, коли користувач знає, що з ними робиться, просто не надто добре програмує. Він абсолютно не виконує жодної мети, і сповільнює роботу при запуску нових програм або при запуску додатків виділяє більше пам’яті.

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

Так само, якщо ви граєте в гру і телефон дзвонить, так. Призупиніть гру та продовжуйте її працювати. Але якщо користувач деякий час займається грою, то всіма силами нехай вони виходять.

Кнопка виходу в деяких додатках повинна бути більше, ніж на інших. Наприклад, ігри, або програми, з яких користувач, можливо, захоче повністю вийти, повинні мати очевидний вихід. Інші програми, як-от, можливо, програми електронної пошти, де вихід - це малоймовірне бажання (щоб він міг постійно перевіряти електронну пошту) - ці програми не повинні витрачати простір вхідного простору керування за допомогою параметра виходу, але для хорошого потоку програми це повинен мати варіант виходу. Що робити, якщо хтось вирішить, що вони не хочуть, щоб їх поштова програма намагалася перевірити електронну пошту, коли вони знаходяться в зоні поганого покриття, або, можливо, під час виклику по Skype чи іншому? Нехай вони вийдуть з програми електронної пошти, якщо хочуть!

Призупинення та вихід з роботи - це два життєво важливих завдання, і жодне не виконує ролі іншого.


2
"Якщо користувач хоче мінімізувати додаток, тоді найкраще - мінімізувати його. Якщо користувач хоче вийти з програми, то найкраще вийти з нього." - Є річ (заснована на більш ніж десятирічному досвіді): користувачі рідко знають, чого хочуть. Якщо ви їм не допоможете, вам доведеться це змінити. Про зразки, наведені вище: дозвольте навести інший зразок: ви працюєте на машині і маєте під рукою стіл для речей. Чи завжди ви розміщуєте, щоб правильно розмістити всі необхідні інструменти для шафи або тримати під рукою найбільш використовувані? І просто відкладіть великий пізній використаний, щоб мати місце для нових?
HoGo

4
HoGo, дякую за ваш коментар. Звичайно, я не згоден. Зокрема, як я краще можу сказати, ви вважаєте, що оскільки деякі користувачі не знають, що їм робити, тому не дозволяйте жодним користувачам робити те, що вони повинні робити, навіть тим, хто знає, що їм робити. Якщо андроїд мав спосіб точно знати, чи слід він припиняти додаток, а не мінімізувати його, то добре. Але це не відбувається, і змушення всіх користувачів завжди жити з мінімізацією, коли вони хочуть вийти, призводить до низької продуктивності пристрою.
Джессі Гордон

Вся справа в тому, що система знає, що коли ви запускаєте одну програму, і немає пам'яті, вона повинна вбити останню. Користувач не повинен цього знати. Ви цього хочете лише тому, що ви людина, якій подобається рубка контролю, його просто дурна м'язова пам'ять, її навіть безглуздий контроль за закриттям програм. Комп'ютери були винайдені для автоматизації, я хотів би, щоб Windows працював як Android і просто закривався автоматично для мене, але я повинен пам’ятати, щоб зберегти і вийти, це нерозумно, чому я повинен, користувач робити це? комп’ютери повинні керувати їх пам'яттю, у мене є інші речі.
Луїз Феліпе

Насправді я не закриваю програми на своїй машині Windows, у мене є 32 Гб оперативної пам’яті, я просто залишаю все працює, я закриваю їх, коли закінчу роботу. Навіщо закривати програму, щоб відкрити її знову через 5 хвилин, це не має сенсу. Подумайте про великий проект C ++, який потребує 2 хвилини, щоб стати чуйним, я просто залишаю Visual Studio відкритим назавжди. І я очікую, що він також не вийде з ладу через 15 днів відкритості (і так, я використовую для цього пам'ять ECC).
Луїз Феліпе

Аналогія з машинним магазином є хорошою, я також залишаю найчастіше використовувані інструменти у себе на столі, я не вибираю інструмент, не користуюся ним і щоразу повертаю його назад. Крім того, я не запускаю день, включаю комп'ютер, чекаю його запуску, відкриваю IDE, що завгодно. Я просто залишаю його працювати, сучасний комп’ютер може працювати в режимі холостого ходу на 40 Вт, навіщо закривати? він також менше вживає компоненти (струм без струму, EEs це знає :))
Луїз Феліпе

19

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

Наприклад, Google Listen продовжує відтворювати подкасти, коли додаток не видно. Але завжди є кнопка паузи, щоб вимкнути подкаст, коли користувач виконає його. Якщо я добре пам’ятаю, Слухай, навіть кладе ярлик на панель сповіщень, щоб завжди можна було швидко дійти до кнопки паузи. Інший приклад - наприклад, додаток на Twitter, наприклад, який постійно оглядає послугу в Інтернеті. Ці типи програм дійсно повинні дозволяти користувачеві вибирати частоту опитування сервера або навіть опитувати у фоновому потоці.

Якщо вам потрібен код, який працює під час виходу, ви можете змінити команду onPause (), onStop () або onDestroy () у відповідних випадках. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


5
Поряд з іншими безладними речами, які я відкрив, я думаю, що розробити наш додаток для Android не відбудеться. Його занадто багато "старшого брата" - все відбувається, де Android повідомляє мені, яку програму потрібно працювати чи ні. Я як програміст повинен мати такий вибір, а не google чи android = (
Тед

3
Ваша діяльність - активний користувальницький інтерфейс - припиняється, коли інша програма з’являється зверху, або ви натискаєте назад або будь-що інше. Користувач не взаємодіє з ними, тому найбезпечніше зберегти стан у випадку, якщо користувач довго не повернеться тощо, як відомо. Ніщо не заважає вам писати, Serviceхоча продовжувати роботу у фоновому режимі, як, наприклад, отримання даних про що-небудь та інше. Google Talk не припиняє працювати, коли ви використовуєте інший додаток. Те саме з музичним плеєром. Подивіться на інші додатки та як вони працюють.
Крістофер Орр

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

1
Я можу собі уявити, що користувач може захотіти вийти з деяких дійсно інтенсивних програм. Можливо, він повинен просто зменшити використання ресурсів, коли він призупинено, але це може бути не завжди можливо
Casebash

1
Ці питання живі й досі, я бачу, через 4 роки після того, як я його підняв =) я дійсно запускав його як послугу у фоновому режимі, але я додав кнопку виходу, оскільки я все ще відчуваю - через 4 роки - ось це потрібно і важливо. І я бачу все більше додатків, у яких це теж є (наприклад, Skype).
Тед

19

Якщо ви не можете зрозуміти, як зробити свої дані / з'єднання (і тим самим "додаток") стійкими, то ви не зможете робити те, що вам потрібно "робити" з Android.

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

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


Поки ми говоримо про вбивць завдань, на Android reddit кілька днів тому з’явився дуже просвічуючий пост. Суть полягає в тому, що використовуйте вбивць завдань обережно, інакше у
Neil Traft

@Neil Traft, я вважав, що коментарі до публікації є дуже освічуючими.
Представники

3
@Dan, Як навіть віддалено можливо, що я повністю закриваю додаток, яким я займаюся протягом тижня, перешкоджаю ОС Android від її роботи? Отже, більше вільної пам’яті. Це не може перешкодити андроїд! Це, звичайно, може пришвидшити справи пізніше! Якщо я знаю, що я закінчую роботу з додатком на деякий час, він абсолютно не має жодної мети. Це забирає лише пам’ять, і рано чи пізно я запускаю нову програму, і в ОС буде додаткова затримка, оскільки вона повинна вбити деякі додатки, про які я знав ТИЖИНИ тому, з якими я закінчував.
Джессі Гордон

@Jesse Gordon, Ви спостерігали за фактичними процесами після того, як ви вбили додаток? Вони перезапускаються, ОС припускає, що виникла проблема ... ОС буде вбивати програми, коли їй потрібна пам'ять. Ви навіть читали що-небудь розміщене у згаданих тут статтях?
День

@Dan, щоб подумати, що Android зробить щось подібне .... йому справді потрібна серйозна переосвіта.
Pacerier

18

Я б подумав прочитати "Розробка бездротових додатків для Android", опубліковану Addison-Wesley. Я тільки закінчую це, і це ДУЖЕ ретельно.

Схоже, у вас є деякі принципові непорозуміння платформи Android. Спочатку я також був трохи розчарований життєвим циклом додатків для Android, але, досягнувши більшого розуміння, мені дуже сподобався цей підхід. Ця книга відповість на всі ваші запитання та багато іншого. Це дійсно найкращий ресурс, який я знайшов для нових розробників Android.

Крім того, я думаю, що вам потрібно відпустити порт для рядка наявного додатка. Для того, щоб перенести вашу програму на платформу Android, частина дизайну програми буде змінена. Використовуваний життєвий цикл додатків необхідний, оскільки мобільні пристрої мають дуже обмежені ресурси щодо настільних систем і дозволяють пристроям Android запускати декілька додатків впорядковано та з урахуванням ресурсів. Ще трохи поглиблено вивчіть платформу, і я думаю, ви зрозумієте, що те, що ви хочете зробити, цілком можливо. Удачі.

До речі, я жодним чином не пов’язаний з Аддісон-Веслі чи будь-якою людиною чи організацією, пов’язаною з цією книгою. Після перечитування свого допису я відчуваю, що трохи відкинувся. Мені просто дуже, дуже сподобалось і я вважаю це надзвичайно корисним. :)


2
Дякуємо за підказку про книгу. Я погляну на це, якщо зможу і якщо вирішу перейти на порт Android. Просто знову, щоб сказати це: наші користувачі не дуже сучасні, коли мова йде про комп'ютери. Мені буде дуже важко використовувати, наприклад, NotificationBar в Android. Занадто маленькі (у них ВЕЛИКІ пальці хе-хе). Це для них інший світ, тому нам потрібно тримати його просто і без варіантів для користувача. Ми створили наше .NET-рішення з цим на увазі - не давайте їм вибір =)
Тед

Я це чую. Ви повинні припустити, що більшість користувачів не дуже технічно спритні.
Енді

8
Мені так набридає мантра, як мало "ресурсів" мобільного пристрою. Прокидайтеся, вони працюють на понад 500 МГц і мають багато пам'яті. У мого старого Dell Axim було 128 Мб оперативної пам’яті. Поточні пристрої там зазвичай понад 512 ОЗУ та працюють на 1 ГГц! Це в 10 разів більше, ніж мій старий Pentium 90Mhz, і я не чула ppl, що говорить "дуже обмежені ресурси" це і те. Настав час прокинутися і понюхати каву - ми зараз у 2010 році, а не у 80-х.
Тед

16

Майже у 99% часу немає необхідності в застосуванні Android для перейому власного життєвого циклу. Більшість часу це зводиться до кращого планування або розумнішого дизайну програми. Наприклад, скоріше створити внутрішню службу (не експортується) для обробки завантажень тощо, або проектування дій та завдань навколо робочого процесу користувача.

Але, як кажуть, там, де є воля, є спосіб. Android забезпечує - через клас android.os.Process набагато кращий API, ніж Java для управління базовим процесом. І на відміну від Java, він не ставиться до розробника як до дебіла, ховаючи все це за простим викликом java.lang.System.exit ().

Тож як ви просите свою заяву про самогубство в Android? Ну, хитрість проста:

Створіть власний клас додатків Android, успадкувавши від стандартного класу android.app.Application (не забудьте оголосити його у файлі AndroidManifest.xml).

Замініть метод onCreate () та збережіть ідентифікатор процесу, який розпочав вашу програму:

this.pid = android.os.Process.myPid(); // Save for later use.

Тепер, щоб вбити вашу програму, надайте метод kill ():

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

Тепер, коли вам потрібно, щоб ваш додаток покінчив життя самогубством, просто введіть кинути контекст програми та зателефонуйте своєму методу вбити!

((MySuicidalApp) context.getApplicationContext()).kill()

Пам’ятайте лише, що завдяки політиці управління процесами в Android, спеціально пов’язаній із службами, Android може просто вибрати перезапуск служби (див. Не слід використовувати вбивць завдань на Android ).


так, я прийшов сюди лише тому, що хотів закрити додаток за однієї ситуації, це має сенс, мій кеш даних OBB пошкоджений, і мені потрібно перезапустити весь додаток
Луїз Феліпе

14

Коли я створюю додаток в Android, я бачу це так:

  • Ви працюєте зі своєю заявою
  • Телефон задзвонив
  • Ви приймаєте дзвінок
  • Після закінчення дзвінка ви повертаєтесь до своєї заявки там, де ви були

Для цього вам потрібна лише Backкнопка або Homeкнопка вашого телефону (коротким або довгим натисканням) та панель сповіщень.

Коли я Backвиходжу зі своєї програми, користуюся кнопкою лише до тих пір, поки не вийду з неї або Homeкнопки.

Ось так я вважаю більшість програм. Але якщо мені потрібен якийсь сеанс чи з'єднання, я зрозумів користувачеві кнопку за допомогою входу / виходу та повідомлення (рядок заголовка чи що-небудь ще). Це досить інший стиль, ніж чистий додаток у стилі "вихід".

На комп'ютерах у вас стільниця з графічним графічним інтерфейсом, а на Android у вас, очевидно, є багатозадачі, але ви показуєте лише один додаток за один раз (я не вважаю тут віджети ^^). А на мобільному телефоні в будь-який час ви можете отримувати сповіщення про щось важливіше, ніж те, що ви робите.

Таким чином, вся концепція програми покладається на щось інше, що "введіть заявку - робота - вихід у додаток".


12

Гмммм ...

Я думаю, що ви просто не бачите додаток Android належним чином. Ви можете легко зробити щось схоже на те, що хочете:

  • Чи зберігають / відновлюють програми програми так, як це рекомендується в документації живого циклу розробника.

  • Якщо на етапі відновлення потрібен певний вхід (інформація про вхід / сеанс відсутня), зробіть це.

  • Врешті-решт додайте кнопку / меню / час очікування, і в цьому випадку ви зробите finish()без збереження логіна та іншої інформації про сеанс, неминуче закінчуючи сеанс роботи програми: тому, якщо додаток запустити / привести до початку, він розпочне новий сеанс.

Таким чином, вам зовсім не байдуже, чи дійсно додаток видалено з пам'яті чи ні.

Якщо ви дійсно хочете , щоб видалити його з пам'яті (це не рекомендується, і BTW для якої мети?) , Ви можете вбити його умовно в кінці onDestroy()з java.lang.System.exit(0)(або , можливо restartPackage(..)?). Звичайно, зробіть це лише в тому випадку, коли ви хочете "по-справжньому закінчити додаток", тому що onDestroy()це частина нормального життєвого циклу діяльності, а не кінець програми взагалі.


11

Оскільки додаток в контексті Android - це лише купа неясно пов’язаних заходів, вихід із програми насправді не має великого сенсу. Ви можете закінчити () активність, і буде показано подання попередньої активності в стеку "Активність".


2
Вихід із програми обов'язково може мати сенс у деяких ситуаціях. Якщо це програма, якою ви користуєтесь кілька разів на місяць протягом декількох хвилин, є безперечна користь повністю закрити додаток. Ця перевага полягає в тому, що ОС не доведеться витрачати час, щоб вийти з цього додатка через тиждень, коли його пам'ять і телефон задзвонить, і ви натиснули кнопку відповіді, і ви чекаєте, щоб Android звільнив деяку пам’ять щоб ви могли відповісти на дзвінок, наприклад. Або, можливо, ви отримали електронний лист і хочете прочитати його - будь-яка програма, яка потребує більше пам’яті, запуститься швидше, якщо ОС спочатку не звільнить її.
Джессі Гордон

3
Що сказав @JesseGordon, і ще один аспект цієї причини, чому відмова має сенс: якщо я не закриваю це ресурсомістке додаток, я знаю, що не збираюся використовувати знову місяць, ОС іноді помилково знищить якусь іншу програму коли ресурсів стає дефіцитним, залишаючи цей марний додаток для свиней за допомогою ресурсів ... що дозволяє іншому додаткові тривати більше часу, ніж слід.
Дон Хетч

10

Я згоден з Тедом. Я розумію, що вихід із програми - це не «спосіб Android», але, схоже, це не слід виключати. Ось три причини, чому ви хочете справжнього виходу з програми (не лише активності):

  1. Користувач може захотіти деякого контролю над тим, який додаток загине у випадку низької пам’яті. Якщо важлива програма A працює у фоновому режимі, ви, можливо, захочете вийти з програми B, коли закінчите з цим, щоб додаток A не загинув операційною системою.

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

  3. Якщо ваша програма використовує ресурси (наприклад, мережа, процесор, датчики тощо), які можуть негативно вплинути на телефон, то одним із способів забезпечення звільнення цих ресурсів є вихід із програми. Я розумію, що добре сприйняті програми повинні звільняти ресурси, коли вони не потрібні. Але знову ж таки, вихід із програми видається розумним способом забезпечення цього.


6
Як ви думаєте, що являє собою "додаток"? Якщо я відкрию додаток Facebook і встановлю новий малюнок профілю - мої програми Camera або Gallery запускаються. Як користувач, я все ще виконую те саме завдання (використовуючи Facebook). Якщо я тоді вирішу закрити Facebook, мої програми Camera and Gallery також мають закритися (оскільки це діяльність, запущена з Facebook) ... Що робити, якщо я опинився в редагуванні деяких інших своїх фотографій і мав намір закрити Facebook ? Ви б перенесли проблему на потенційну втрату даних.
seanhodges

Що ж, я не думаю, що це може призвести до втрати даних. Якщо у вас є стороння діяльність, яка працює в тому ж самому завданні, що і ваша власна діяльність, і ваша власна активність - це кнопка виходу, то користувач повинен finish()виконувати діяльність третьої сторони, перш ніж він зможе натиснути кнопку виходу. А діяльність третьої сторони повинна зберігати будь-яку збережену інформацію на той час. Я не думаю, що ви можете використовувати перемикач програм для повернення до активності кнопки виходу, якщо це не працює в окремому завданні. І якщо це окреме завдання, це окремий процес, і тому кнопка виходу не буде вбита.
Ніл Трафт

2
1. Я думаю, що 99,99% користувачів Android не повинні турбуватися про те, як ОС керує програмами за шторами. Решта - вундеркінд, і вони знайдуть передові інструменти, які змусять систему вести себе так, як вони хочуть. 2. Ви завжди можете вивантажити будь-які конфіденційні дані, коли діяльність призупиняється або припиняється. 3. Як і вище, ресурси можуть бути звільнені методами зворотного виклику життєвого циклу. Коли діяльність відновиться, ресурси можна виділити знову.
Zsolt Török

4
Я думаю, що досить цікаво те, що так багато Android користувачів встановлюють "Advanced Task Killer", додаток, який закриває інші додатки, оскільки ви зазвичай не можете робити це самостійно. Я цим весь час користуюся сам. Я думаю, що вийти з програми - це не те, що можна зробити.
Тед

2
@ ZsoltTörök, 99,99% людей мають справу з повільними комп’ютерами / телефонами і змушені не турбуватися про те, як ОС керує програмами за шторами.
Pacerier

10

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

І він активно використовує Android:

Деякі програми користувальницького простору доступні, щоб допомогти з цими програмами вбивства, наприклад:


9

Ви, мабуть, знайшли потрібну відповідь у команді Finish (). Це не вилучить ваш додаток із пам’яті, але Android буде робити це завжди, коли йому знадобляться ресурси, тому це не має ніякої різниці, що ви цього не будете робити явно.

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

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

Такий підхід дозволяє досягти своєї мети мати команду "вихід", не порушуючи філософію Android, залишаючи управління операційними ресурсами ОС, включаючи закриття додатків, в руках операційної системи.

Особисто я б не використовував цей підхід, оскільки користувачі Android очікують, що додаток збереже його наступність під час перегляду його, і тому вони не звикли до модальності "виходу" з програми. Я б замість цього підтримав "чітку" функцію, яку користувач може викликати для відновлення програми до деякого початкового стану за замовчуванням, без необхідності "залишати" це в процесі.

Єдиним винятком буде те, коли користувач натискав кнопку "назад" достатню кількість разів, щоб програма закривалась. У цій ситуації від користувача не очікується, що стан буде збережено (і якщо в додатку немає збереженого стану, ви, як розробник, повинні мати код обробки кнопки "назад", що виявляє ці збережені дані, і спонукає користувача зберегти його до SharedPreferences або до файлу, або до іншого енергонезалежного носія).

Щодо system.exit (0):

Якщо ви все-таки вирішите використовувати system.exit (0), щоб закрити додаток із грубою остаточністю (наприклад, в результаті остаточного натискання кнопки "назад", я б попередив вас, що, хоча для мене це "працює", і в деяких випадки - це єдиний спосіб, коли мені вдалося закрити додаток, не залишивши жодного сліду, є один незначний збій, який виникає в Jelly Bean, коли ви використовуєте цей підхід.

Зокрема, якщо ви використовуєте список останніх програм, щоб відкрити додаток, а потім скористатися кнопкою "Назад", щоб закрити додаток (при закритті, що реалізується через system.exit (0)), список останніх програм знову стане видимим, як і буде ніколи не були закриті. Якщо потім натиснути запис додатка у цьому списку, щоб запустити його вдруге із того ж уже відкритого списку останніх програм, відповіді не буде.

Я підозрюю, що причиною цього є те, що список останніх програм переглядає посилання на ваше додаток, яке стало нефункціональним через те, що ви закрили додаток за допомогою system.exit (0). Більш цивілізоване закриття вашої програми за допомогою закінчення (), можливо, повідомило б ОС таким чином, що дозволило б оновити список останніх програм, але system.exit (0), мабуть, цього не робить.

Це сама по собі не є величезною проблемою, оскільки дуже мало людей відкриє додаток із "Недавніх додатків", потім вийде з нього, а потім негайно знову відкриє його з того самого відкритого списку "Недавні програми". І якщо вони натискають кнопку додому та повторно відкривають список останніх програм, запис у вашій програмі буде там, і він буде повністю функціональним. Але я думаю, що це показує, що використання system.exit (0) може перешкоджати належному зв’язку між вашим додатком та ОС, і це говорить про те, що можуть бути й інші, більш серйозні, можливо, тонкі наслідки використання цього підходу.


Ви можете, можливо, видалити останні записи програми перед тим, як зателефонувати закінчити ()? Це те, що я спробую, коли дозволяє час. У мене на передньому плані Служба з невеликою пусковою діяльністю. Оскільки Діяльність дуже мала, то нічого страшного, якщо його не вбивають і не поховають, але має сенс сказати Android, що він може зайняти це перед іншими, якщо це можливо.
nsandersen

9

Я сподіваюся, що з часом все зміниться. Користувач повинен мати змогу знищити додаток або процес, якщо ОС додаток належним чином пісочниці. Існує думка, що програми повинні бути написані ідеально або користувач буде використовувати лише ті програми, які відповідають усім рекомендаціям SDK. Я думаю, що це високе замовлення.


Я знаю. Продукти Apple корисні для деяких споживачів. Вони не гарні для розробників. ОС Android має повний потенціал стати подібною до "ОС Windows світу ПК" для мобільних телефонів. можливо, ще краще. Він уже відкритіший, ніж вікна світу ПК, за винятком того, що він не дозволяє нам написати менеджер завдань.
діпу

7

Існує (відносно) проста конструкція, яка дозволить обійти «вихідну» загадку. Зробіть так, щоб у вашому додатку було "базове" стан (діяльність), який є лише порожнім екраном. У першому onCreate діяльності ви можете запустити іншу діяльність, в якій є основна функціональність вашої програми. Потім "вихід" можна виконати, якщо закінчити () цю другу діяльність і повернутися до основи просто порожнього екрана. ОС може зберегти цей порожній екран в пам'яті стільки, скільки хоче ...

По суті, оскільки ви не можете вийти з ОС, ви просто перетворюєтесь на самостворене небуття.


2
Гарна ідея. Однак навіть завершення діяльності (або сервісу) не зупиняє ОС. О ні, навіть після того, як onDestroy був виконаний, всі змінні та інше все ще є. Я щойно бачив, що в сервісі все є те саме, хоча дзвінок onDestroy називався ...
Тед

2
... і таким чином System.exit (0) допоміг =)
Тед

7

Без функції виходу для розробника програми вбивати власну програму дуже поганий дизайн.

У моїй програмі потрібно дозволити користувачеві динамічно змінювати дані під час виконання, а користувачеві потрібно перезапустити мою програму, щоб зробити ефект зміни, але Android не дозволив самому перезапустити додаток. У ОС Android дуже поганий життєвий цикл дизайнерських програм.


9
public void appRestart () {Intent i = new Intent (getBaseContext (), MyActivity.class); i.addFlags (Намір.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); }
androidworkz

2
Цей вище код коменту дійсно працює добре. Принаймні, ви можете перейти до першого заняття замість повного виходу з програми. :)
Harpreet

7

Щоб закрити додаток у будь-який момент, використовуйте FLAG_ACTIVITY_CLEAR_TOPпрапор у Намір, а потімsystem.exit();

Або є подібний спосіб, але без того, system.exit()коли ви хочете вийти, викликайте цей метод:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

У вашому HomeActivity.onCreate()додати наступні

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

Це буде працювати без порушення життєвого циклу Android.


7

Перш за все, ніколи ніколи не використовуйте System.exit (0). Це як змусити людину спати, ударяючи його по голові!

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

Я думаю, що "кнопка виходу" дурна. Дійсно дійсно дуже дурно. І я думаю, що користувачі (споживачі), які запитують кнопку виходу для вашої програми, теж дурні. Вони не розуміють, як працює ОС і як керує ресурсами (і це робить чудову роботу).

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

Але для цього вам доведеться вивчити і дізнатися, як все працює на Android. У всякому разі, це моє рішення надати користувачам "Кнопку виходу".

Я створив Меню параметрів, яке завжди видно в кожній діяльності (у мене супердія, яка це робить).

Коли користувач натискає цю кнопку, це відбувається:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

Тому я зберігаю в SharedPreferences, що я хочу вбити свою програму, і я запускаю Інтенцію. Будь ласка, подивіться на ці прапори; вони очистять усі мої ранки, називаючи мою діяльність DashBoard, що є моєю "домашньою" діяльністю.

Отже, у своїй діяльності на інструментальній панелі я запускаю цей метод у onResume:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

І це буде працювати досить добре.

Єдине, що я не розумію, чому це відбувається, це те, що коли я виконую останнє завершення (і я перевірив: він слідкує за всім правильним потоком onPause → onStop → onDestroy), програма все ще перебуває в останній активності (але це порожнє).

Схоже, останній намір (який запустив DashboardActivity) все ще є в системі.

Я мушу більше копати, щоб також його вийняти.


8
Не багато споживачів знають, що таке ОС, а не про те, як працює одна людина, це не робить їх дурними. Якщо кнопка «Вихід / Вихід / Вимкнення» робить їх нормальними. Коли ви виходите з кімнати, ви вимикаєте світло, що ще важливіше, коли виходите з дому, ви зачиняєте двері, і саме тут я бачу проблему з неможливістю правильно вийти з програми. Залишити програму живою на задньому плані - це великий ризик безпеки.
Крякає

4
"Я думаю, що" кнопка виходу "дурна". У більшості програмних програм передбачена кнопка виходу.
ІгорГанапольський

Ви сказали "// ТУТ ЗАПРОШУЙТЕ ВСІ СВОЇ ПОСЛУГИ", а потім застосували закінчення (). Служби Android не мають методу закінчення (). Вони мають unbindService (mConnection);
ІгорГанапольський

@Squiggles Якщо у вас є кімната, яка автоматично вимикає всі її світильники і замикає двері, коли виходите, про це вам не потрібно дбати.
Сешу Вінай

7

Життєвий цикл додатків Android призначений для користувачів мобільних телефонів, а не користувачів комп'ютерів.

Життєвий цикл програми - жорстоко спрощена парадигма, необхідна для перетворення сервера Linux на споживчий пристрій.

Android - це Java через Linux, справжня багатопрофільна серверна ОС. Ось так воно швидко поширилося. Життєвий цикл додатка інкапсулює основну реальність ОС.

Для мобільних користувачів додатки просто встановлені або не встановлені. Немає концепції бігу чи виходу. Насправді, програми додатків призначені для запуску до тих пір, поки ОС не звільнить їх за збережені ресурси.

Оскільки це Stack Overflow, кожен, хто читає це, є користувачем комп’ютера і повинен вимкнути 90% своїх знань, щоб зрозуміти життєвий цикл мобільних додатків.


Я не стежу за вашим стрибком до того, що "користувачі комп'ютерів повинні вимкнути 90% своїх знань". Так, це говорить Ромен Гай, але це не робить правдою. Мені здається, що розділ "Розширені варіанти для користувачів комп'ютерів", з кнопкою "Вийти", задовольнив би потреби кожного.
Дон Хетч

Я не маю уявлення, хто цей «хлопець Ромен», або чому він цитує мене. Закриття останніх завдань закриє додаток, як і припинення інформації про додаток. ADB дозволяє отримати доступ до оболонки для досвідчених користувачів.
Домінік Серісано

6

Щоб прочитати це запитання, мені знадобилося більше часу, ніж реально реалізувати напівправильний життєвий цикл додатків Android.

Це програма GPS, яка опитує очки та надсилає поточне місце розташування у веб-сервіс кожні кілька секунд за допомогою потоку ... Це може опитувати кожні 5 хвилин у випадку Теда для оновлення, тоді onStop може просто запустити активність оновлення. Тед був су стурбовані тим, чи знайдено його (асинхронний Тед, не кодуйте, як програміст Windows, або ваші програми працюватимуть як програми Windows ... еww, це не так складно).

Я зробив початковий код у onCreate, щоб налаштувати речі протягом життя, включаючи checkUpdate.start();:

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

Цей код може бути абсолютно неправильним, але він працює. Це одне з моїх перших додатків для Android.

Voilà, додаток, який не споживає процесор, коли він знаходиться у фоновому режимі, але миттєво готовий до відкриття, оскільки він знаходиться в оперативній пам’яті (хоча не має оперативної пам’яті, як життєвий цикл Android)… додаток завжди готовий, це телефон , хлопці / гелі. Якщо додаток повинен використовувати всю оперативну пам’ять, і ОС не може бути вимкнена, тоді річ може перестати дзвонити = P Ось чому ОС повинна мати змогу закрити додаток, коли він знаходиться у фоновому режимі (якщо ваша програма не є 't' hog ресурсу, це не буде закрито BTW), тому давайте просто напишемо кращі програми.


Вам не слід дзвонити super.onStop з методу onPause. Це здається, що це в основному накрутить справи.
Метт Вулф

1
Після прочитання приблизно 20 філософських відповідей, що просто ухиляється від питання .... +1 за те, щоб мати якийсь код.
Pacerier

6

Кожного разу під час переходу на наступну сторінку за допомогою намірів використовуйте:

`YourActivityname.this.finish()`;

Приклад:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

Щоб жодна активність не працювала у фоновому режимі, і коли ви хочете вийти зі свого додатка, використовуйте:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

Цей вихід працював як шарм для мене :)


1
Він не виходить із програми, замість цього мова йде про Mainactivity.
Шарат

1
Але будьте обережні - onPause () НЕ викликається у випадку killProcess та System.exit. У нас були деякі проблеми з цим.
Павло Бірюков

4

У будь-якому випадку, якщо ви хочете припинити свою заявку, ви завжди можете зателефонувати System.exit(0);.


5
System.exit()НЕ вбиває ваш додаток, якщо у вас є кілька дій у стеку. Розробник Android, який ним користується, не зрозумів основного життєвого циклу додатків Android. Прочитайте цю відповідь .
Dheeraj Vepakomma

Повне рішення з System.exit(0); stackoverflow.com/questions/2033914/…
Sohail Zahid

2
На насправді, System.exit () робить вбити додаток. Однак якщо System.exit () викликався з іншого місця, крім основного виду діяльності, android перезапустить додаток з однією меншою активністю на стеку. Мені це здається смішною реакцією на чистий навмисний System.exit. Я маю на увазі, якби це був div0 або якийсь ненавмисний збій, можливо, було б ввічливо перезапустити. Але вони навіть не викликають автозапуск, як я пам'ятаю. Але в будь-якому випадку, додаток буде убитий. Він може бути перезапущений, але це не означає, що його не вбили.
Джессі Гордон

3

Якщо у вас працює 10,20 .. декілька видів діяльності, і ви хочете закінчити їх і вийти з системи.

Створіть статичний масив у application classабоconstants class.

Константи

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity Додайте поточну посилання на активність у цей масив

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}

1
Це може призвести до збою вашої програми, коли користувачі натискають кнопку двічі, особливо коли система з будь-якої причини перебуває під великим навантаженням. Цього можна запобігти, видаливши дії з масиву.
Сподіваюсь,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.