2015-11-23 2 views
1

Я создал пристальный сервис, который загружает некоторые файлы, пишет некоторые из них на внешнее устройство хранения, а некоторые данные в локальной базе данных моего приложенияAndroid Intent Service работать в отдельном процессе не останавливает себя

Это не работает нормально, пока Я понял, что служба намерения работает в том же процессе моего приложения.

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

Так что я прочитал, что я могу запустить мой пристальный службу в отдельном процессе, который я сделал здесь

<service 
      android:name=".services.DownloadContentIntentService" 
      android:process=":whatever" 
      android:exported="false" /> 

Теперь задача выполняется в отдельном процессе. Он по-прежнему работает, если я завершаю приложение, которое работает.

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

Даже когда я вызываю stopSelf(). Согласно Android Studio, он все еще жив.

Что происходит?

Благодарим вас за чтение.

+0

Разместите код пожалуйста – user3793589

+0

я не уверен вообще, как хорошо, но это должно сработать. . Вы можете использовать system.exit() после выполнения вашего намерения. Попробуй. – cgr

ответ

3

Android по существу основан на Linux, поэтому процессы должны всегда просматриваться в этом контексте. Теперь, Service предоставляется Android, но песочница предоставляется Linux. Более того, все усложняется, потому что в картине есть JAVA, а виртуальная машина еще больше подчеркивает. stopSelf() службой ни в коем случае не означает, что процесс, содержащий службу, будет убит. Чтобы убить процесс, вам нужно выполнить SIGKILL ака kill -9

Таким образом, даже когда Android было сигналом для stopSelf() службой, Linux все еще может принять решение сохранить процесс в живых, особенно потому, что перед завершением процесса, нужны ресурсы быть GCed. Таким образом, stopSelf() это никоим образом не эквивалентном SIGKILL, что по сути означает, что вы не в состоянии увидеть службу в PS списке (или список процессов Андроида) немедленно