Влияние липкого сервиса в приложении с огромной монолитной кодовой базой в Android? - PullRequest
0 голосов
/ 09 мая 2019

Как мы все знаем, Модель памяти Java состоит из данных (или кода), сегментов стека и кучи. Я предполагаю, что то же самое в случае с Android. У меня есть одно монолитное приложение (давайте посмотрим, какая база кода этого приложения слишком большая). Когда я запускаю приложение, действия и фрагменты в приложении загружаются в JVM Dalvik и выгружаются. Когда это так, как это работает со службой? Допустим, у меня есть STICKY_SERVICE как,

public class CountingNumberService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        for(int i=0; i<100; i++) {
            //Do something
        }
        return Service.START_STICKY;
    }
    @Override
    public IBinder onBind(Intent intent) {
        /**
         * This has to do with some inter process communication
         */
        return null;
    }
}

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

  1. Я бы съел батарейку пользователя.
  2. Некоторый дополнительный код (кроме службы) будет запущен вместе с приложением (?), Хотя и не уверен. Если в сегменте данных находится все приложение, оно не сможет нормально работать с другим приложением.

Я немного запутался в сервисе STICKY процесса (огромный монолитный код) и его влияния. Может кто-нибудь объяснить мне это, пожалуйста?

1 Ответ

0 голосов
/ 09 мая 2019

Поскольку служба является ЛИПКОЙ, она заставляет процесс вести себя как постоянный процесс и всегда работает.

Нет, это не так.

но так как мой сервис работает, он всегда будет работать

Нет, не будет.

Цитирование документации для START_STICKY:

если процесс этой службы завершен во время ее запуска (после возврата из onStartCommand(Intent, int, int)), то оставьте его в запущенном состоянии, но не сохраняйте это доставленное намерение. Позже система попытается заново создать сервис.

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

...