web-dev-qa-db-fra.com

Démarrer un service dans un processus distinct android

Je veux démarrer un service dans un processus séparé (c'est-à-dire lorsque je vais dans mon gestionnaire d'applications dans les paramètres et que je passe ensuite aux services en cours d'exécution, il devrait afficher mon service dans un processus séparé).

Mon Android Manifest est le suivant:

<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>

Je démarre le service dans mon MainActivity donc évidemment quand je tue l'application, le service s'arrête également. Quelqu'un peut-il me dire comment démarrer le service en tant que processus différent.

28
SoH

Consultez l'attribut process pour service dans AndroidManifest.xml. Vous devez changer votre Android:process valeur pour commencer par un :.

http://developer.Android.com/guide/topics/manifest/service-element.html

La section pertinente:

Si le nom attribué à cet attribut commence par deux points (':'), un nouveau processus, privé de l'application, est créé lorsque cela est nécessaire et le service s'exécute dans ce processus. Si le nom du processus commence par un caractère minuscule, le service s'exécutera dans un processus global de ce nom, à condition qu'il soit autorisé à le faire. Cela permet aux composants de différentes applications de partager un processus, ce qui réduit l'utilisation des ressources.

L'autre réponse fournie ne répond pas vraiment à la question de savoir comment démarrer un service dans un processus distinct.


Définition d'un processus d'un service

Le Android:process champ définit le nom du processus où le service doit s'exécuter. Normalement, tous les composants d'une application s'exécutent dans le processus par défaut créé pour l'application. Cependant, un composant peut remplacer la valeur par défaut avec son propre attribut de processus, vous permettant de répartir votre application sur plusieurs processus.

Si le nom attribué à cet attribut commence par deux points (':'), le service s'exécutera dans son propre processus distinct.

<service
  Android:name="com.example.appName"
  Android:process=":externalProcess" />

Si le nom du processus commence par un caractère minuscule, le service s'exécutera dans un processus global de ce nom, à condition qu'il soit autorisé à le faire. Cela permet aux composants de différentes applications de partager un processus, ce qui réduit l'utilisation des ressources.

33
adao7000

L'exécution d'un processus distinct ne résoudra pas votre problème. J'ai eu le même problème et c'est un comportement normal d'Android. Lorsque vous démarrez un Service (pas un Foreground Service), même s'il est dans un processus distinct, le système d'exploitation peut le tuer à tout moment. Dans votre cas, si vous fermez le Activity (s)/tuez le Application, le système d'exploitation fermera normalement le service même s'ils sont dans des processus distincts. Vous avez deux options:

1- Démarrez votre service en Foreground Service . Dans ce cas, le Service ne sera pas fermé en raison de presque toutes les conditions. Sachez que le service de premier plan est conçu pour des applications spécifiques et vous aurez une notification collante dans le centre de notification et la barre d'état.

2- Faites de votre service un service Start (pas un IntentService). Puis sur le onStartCommand du service, retournez START_STICKY. Cela indiquera au système d'exploitation si, pour une raison quelconque, vous devez fermer le Service le réexécuter lorsque vous avez suffisamment de ressources. Dans votre cas, lorsque l'utilisateur ferme le Activity/tue le Application le Service processus sera de toute façon tué, mais il rouvrira normalement.

23
Amir