ACTION_IMAGE_CAPTURE намерение: избегать уничтожения активности / процесса прекращения - PullRequest
0 голосов
/ 07 октября 2018

Этот вопрос предназначен для разработчиков Android, знакомых с Activity Lifecycle .

. Я занимаюсь разработкой приложения, которое выполняет распознавание лиц и распознавание ориентиров лица.

Соответствующие модели машинного обучения занимают много времени для анализа из хранилища SD и загрузки в память.На современных средних устройствах Android это легко занимает до 20 секунд.Кстати, весь этот процесс анализа лица и загрузки модели происходит в собственном коде C ++, который интегрирован с использованием Android NDK + JNI.

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

До того, как фактический анализ лица будет выполнен, пользователь может сделать селфи через MediaStore.ACTION_IMAGE_CAPTURE.Это вызовет отдельное приложение камеры, установленное на устройстве, и получит изображение через onActivityResult.

Теперь проблема начинается: почти всегда весь процесс приложения будет убит, пока пользователь находится в отдельной камере./App. В основном это происходит прямо перед возвратом из приложения «Камера» (время кажется странным).Я сделал еще один тест, чтобы убедиться, что это происходит при нажатии кнопки захвата внутри приложения камеры.В этот момент мое приложение убито.При нажатии кнопки «Принять изображение» приложение воссоздается.Причина, приведенная в logcat ActivityManager для уничтожения процесса, - «prev LAST» (я не нашел в Google значения по этому поводу, но я увидел, что многие другие приложения также уничтожаются по этой причине, так что, похоже, это происходитдовольно часто).

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

Мой вопрос: Есть ли возможность сообщить Android, что у Activity / App есть законная причина дляне быть убитым, находясь временно в фоновом режиме, чтобы получить изображение с камеры? В конце концов, ActivityManager принимает неправильное решение, чтобы убить приложение.Необходимость такой частой перезагрузки моделей отнимает много ресурсов процессора и памяти.

Это похоже на упущение в архитектуре жизненного цикла Android.Я знаю, что немногие приложения предъявляют особые требования к моему приложению, но все же это кажется глупым.Единственный способ, которым я могу придумать, чтобы «исправить» эту проблему, это реализовать в приложении свою собственную активность «Камера», но это идет вразрез с лучшими практиками Android.

Существует также некоторый флаг «android: persistent», которыйВы можете придерживаться своей Активности через AndroidManifest.xml, но документы совершенно неясно о последствиях этого. См. Документацию по этому вопросу.

Кстати: onDestroy не вызывается, когда завершается процесс приложения.Я где-то читал, что нет гарантии, что onDestroy будет вызываться, и это на самом деле не проблема для меня.Хотя мне интересно, почему в документации по Android это не указано четко.

1 Ответ

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

Почти всегда весь процесс приложения будет убит, пока пользователь находится в отдельной камере. Действие / Приложение

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

В конце концов, ActivityManager принимает неверное решение убить приложение

Учитывая, что вероятной альтернативой является сбой ОС, я подозреваю, что пользователь согласится с решением ОС прекратить ваш процесс.

Необходимость перезагрузки моделей так часто занимаетмного ресурсов процессора и памяти.

Тогда, возможно, вам не следует запускать другое приложение из своего.Сделай фото сам.Используйте API-интерфейсы камеры напрямую или используйте библиотеки, такие как Fotoapparat и CameraKit-Android, в качестве более простых оболочек для этих API-интерфейсов.

Единственный способ «исправить» эту проблему - реализовать собственную камеруАктивность внутри приложения, но это идет вразрез с лучшими практиками Android.

По этому аргументу ни у одного устройства не будет приложения для камеры, так как написание любого приложения для камеры "идет вразрез с собственными лучшими практиками Android".

Любое приложение, для которого требуется камера должно использовать API-интерфейсы камеры (прямо или косвенно) для получения надежных снимков.Вы предполагаете, что все тысячи приложений для камер написаны правильно и будут корректно выполнять ваши ACTION_IMAGE_CAPTURE Intent (например, помещать результаты в место, которое вы указали с помощью EXTRA_OUTPUT). Во многих приложениях камеры есть ошибки ACTION_IMAGE_CAPTURE реализации .ACTION_IMAGE_CAPTURE не является необоснованным для случаев, когда вы и пользователь можете жить без снятого изображения (например, приложение для создания заметок, которое имеет функцию «прикрепить фото»), но это не похоже на случай с вашим приложением.

...