Активность Android, вызывающая сбой службы из-за фрагментации кучи - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть приложение для Android (действие), которое также имеет соответствующий сервис. Служба запускается действием и должна работать непрерывно, даже когда действие остановлено. Когда действие начинается снова, оно может связываться со службой и запрашивать его.

Иногда действие разрушается и создается ОС. Это не должно влиять на вещи, активность должна быть просто воссоздана и иметь возможность снова привязываться к сервису. Это в основном работает.

Однако ...

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

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

Меня интересуют какие-либо предложения относительно того, как решить эту проблему?

Есть ли способ отделить службу от действия (чтобы при сбое действия она также не вызывала сбой службы), но при этом иметь службу и действие в одном приложении?

Я мог бы сохранить служебные данные, но для этого потребовалось бы много обращений к БД, что не способствует экономии батареи.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2014

В манифесте следует указать службу «имя процесса», имя можно начинать с символа «:» или символа нижнего регистра. процитировать: http://developer.android.com/guide/topics/manifest/service-element.html

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

пример будет в манифесте

 <service android:name=".services.OfficeService"
            android:process=":myProcess" />
0 голосов
/ 27 февраля 2012

Похоже, ваш сервис поддерживает ссылки на ваши несуществующие действия.Вы должны использовать запущенный сервис, а не связанный сервис.См. Раздел руководства по Службам для получения подробной информации о различиях и способах их использования.

Если вы хотите использовать связанную службу (то есть вам действительно нужно использовать bindService()по какой-то причине), затем обязательно позвоните unbindService() до того, как ваша активность умрет.Обратите внимание, что когда последнее действие отменяется, служба останавливается.

...