Запуск службы в отдельном процессе 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. Это сообщит ОС, если по какой-либо причине вам нужно закрыть службу, запустите ее снова, когда у вас будет достаточно ресурсов. В вашем случае, когда пользователь закрывает действие/убивает приложение, процесс обслуживания будет убит в любом случае, однако он, как правило, будет снова открыт.