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