Запуск службы в отдельном процессе android
Я хочу запустить службу в отдельном процессе (например, когда я перейду в диспетчер приложений в настройках, а затем перейду к работающим службам, он должен показать мою службу в отдельном процессе).
Мой Android манифест выглядит следующим образом:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.timerapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.timerapp.WorkerThread"
android:process="com.moizali"></service>
</application>
Я запускаю сервис в своей MainActivity, поэтому, очевидно, когда я убиваю приложение, служба также отключается. Может ли кто-нибудь сказать мне, как запустить службу как другой процесс.
Ответы
Ответ 1
Обратите внимание на атрибут process
для service
в AndroidManifest.xml
. Вам нужно изменить значение android:process
, чтобы начать с :
.
http://developer.android.com/guide/topics/manifest/service-element.html
Соответствующий раздел:
Если имя, присвоенное этому атрибуту, начинается с двоеточия (':'), новый процесс, частный для приложения, создается, когда это необходимо, и служба запускается в этом процессе. Если имя процесса начинается с символа в нижнем регистре, служба будет выполняться в глобальном процессе этого имени при условии, что у него есть разрешение на это. Это позволяет компонентам в разных приложениях совместно использовать процесс, уменьшая использование ресурсов.
Другой предоставленный ответ не отвечает на вопрос о том, как запустить службу в отдельном процессе.
Определение процесса службы
В поле android:process
указано имя процесса, в котором должна выполняться служба. Обычно все компоненты приложения запускаются в процессе по умолчанию, созданном для приложения. Однако компонент может переопределять значение по умолчанию с собственным атрибутом процесса, что позволяет распространять ваше приложение на нескольких процессах.
Если имя, присвоенное этому атрибуту, начинается с двоеточия (':'), служба будет запускаться в отдельном отдельном процессе.
<service
android:name="com.example.appName"
android:process=":externalProcess" />
Если имя процесса начинается с символа в нижнем регистре, служба будет выполняться в глобальном процессе с этим именем при условии, что у него есть разрешение на это. Это позволяет компонентам в разных приложениях совместно использовать процесс, уменьшая использование ресурсов.
Ответ 2
Работа над отдельным процессом не решит вашу проблему. У меня была такая же проблема, и это нормальное поведение Android. Когда вы запускаете службу (а не службу переднего плана), даже если она находится в отдельном процессе, ОС может ее убить в любое время. В вашем случае, если вы закрываете действия/убиваете приложение, ОС обычно закрывает службу, даже если они находятся в отдельном процессе. У вас есть два варианта:
1- Начните свой сервис как переднего плана. В этом случае служба не будет закрыта практически при любых условиях. Имейте в виду, что служба переднего плана предназначена для конкретного приложения, и у вас будет липкое уведомление в центре уведомлений и в строке состояния.
2- Сделайте свою услугу службой запуска (а не службой Intent Service). Затем в onStartCommand службы верните START_STICKY. Это сообщит ОС, если по какой-либо причине вам нужно закрыть службу, запустите ее снова, когда у вас будет достаточно ресурсов. В вашем случае, когда пользователь закрывает действие/убивает приложение, процесс обслуживания будет убит в любом случае, однако он, как правило, будет снова открыт.