web-dev-qa-db-fra.com

Comment démarrer et arrêter Android service à partir d'un shell adb?

Je dois écrire un script Shell pour démarrer et arrêter un service Android.

45
ranjitrock

Je suis un débutant sous Android, mais ça marche comme ça:

dans AndroidManifest.xml, assurez-vous que, dans <application>, vous obtenez quelque chose comme ceci:

<service Android:name="com.some.package.name.YourServiceSubClassName" Android:permission="com.some.package.name.YourServiceSubClassName">
    <intent-filter>
        <action Android:name="com.some.package.name.YourServiceSubClassName"/>
    </intent-filter>
</service>

YourServiceSubClassName extend Android.app.Service est votre Java qui est le service. Où com.some.package est le nom du package, pour moi dans AndroidManifest. XML et Java.Utilisé n article de javabeat.net comme aide, cherchez <service>

Notez aussi, supposément entre le nom du paquet et le nom de la classe, il devrait y avoir .service. Dans le texte, je suppose que c'est une convention, mais pour moi cela a causé ClassNotFoundException que je n'ai pas encore résolu .

Ensuite, installez votre apk. Je l'ai fait depuis Eclipse mais aussi adb install -r yourApkHere.apk Devrait fonctionner. La désinstallation est adb uninstall com.some.package.name, Btw.

Vous pouvez le démarrer depuis le système hôte comme ceci, merci Juste un Tim et MrRoy :

adb Shell am startservice com.some.package.name/.YourServiceSubClassName

curieusement, je n’avais pas besoin de -n.

Pour arrêter , j'utilise

adb Shell am force-stop com.some.package.name

J'espère que ça aide.

En tant que débutant, sentez-vous libre d'éditer/commenter pour réparer les idées fausses (par exemple, probablement concernant .service. Dans le nom du composant (?)).

43
n611x007

Démarrage un service:

adb Shell am startservice ...

commencer un service. Les options sont les suivantes: --user | current: Spécifie l'utilisateur sous lequel exécuter; s'il n'est pas spécifié, lancez l'utilisateur actuel.

arrêt un service:

adb Shell am stopservice ... 

arrêter un service. Les options sont les suivantes: --user | current: Spécifie l'utilisateur sous lequel exécuter; s'il n'est pas spécifié, lancez l'utilisateur actuel.

17
bonnyz

Si vous souhaitez exécuter le script dans adb Shell, j'essaie de faire de même, mais avec une application. Je pense que vous pouvez utiliser la commande "am start"

usage: am [sous-commande] [options]

start an Activity: am start [-D] [-W] <INTENT>
    -D: enable debugging
    -W: wait for launch to complete

**start a Service: am startservice <INTENT>**

send a broadcast Intent: am broadcast <INTENT>

start an Instrumentation: am instrument [flags] <COMPONENT>
    -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
    -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
    -p <FILE>: write profiling data to <FILE>
    -w: wait for instrumentation to finish before returning

start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop

start monitoring: am monitor [--gdb <port>]
    --gdb: start gdbserv on the given port at crash/ANR

<INTENT> specifications include these flags:
    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
    [-c <CATEGORY> [-c <CATEGORY>] ...]
    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--esn <EXTRA_KEY> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [-n <COMPONENT>] [-f <FLAGS>]
    [--grant-read-uri-permission] [--grant-write-uri-permission]
    [--debug-log-resolution]
    [--activity-brought-to-front] [--activity-clear-top]
    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]
    [--activity-launched-from-history] [--activity-multiple-task]
    [--activity-no-animation] [--activity-no-history]
    [--activity-no-user-action] [--activity-previous-is-top]
    [--activity-reorder-to-front] [--activity-reset-task-if-needed]
    [--activity-single-top]
    [--receiver-registered-only] [--receiver-replace-pending]
    [<URI>]
13
sandroid

Je peux commencer le service par

am startservice com.xxx/.service.XXXService

mais je ne sais pas encore comment l'arrêter.

9
MrROY

Vous devez définir l'attribut Android: exporté du service sur "true", afin de permettre à d'autres composants de l'appeler. Dans le fichier AndroidManifest.xml, ajoutez l'attribut suivant:

<service Android:exported="true" ></service>

Ensuite, vous devriez pouvoir démarrer le service via adb:

adb Shell am startservice com.package.name/.YourServiceName

Pour plus d'informations sur l'attribut Android: exporté, voir cette page .

7
AmitB

Vous pouvez obtenir une erreur "* Erreur: l'application est en arrière-plan *" lors de l'utilisation

adb Shell am startservice 

à Oreo (26+). Cela nécessite des services au premier plan. Utilisez le suivant.

adb Shell am start-foreground-service com.some.package.name/.YourServiceSubClassName
6
Kiran k g

Répondre aux commentaires de pzulw à Sandroid sur la spécification de l'intention.

Le format du nom du composant est décrit dans les documents de l'api pour ComponentName.unflattenFromString

Il divise la chaîne au premier '/' en prenant la partie avant comme nom de package et la partie après comme nom de classe. Par commodité (à utiliser, par exemple, lors de l'analyse des noms de composants sur la ligne de commande), si le "/" est immédiatement suivi d'un "." alors le nom de classe final sera la concaténation du nom du paquet avec la chaîne suivant le '/'. Ainsi "com.foo/.Blah" devient package = "com.foo" class = "com.foo.Blah".

6
Just a Tim

Vous devez ajouter Android:exported="true" pour démarrer le service à partir de la ligne de commande ADB. Ensuite, votre manifeste ressemble à ceci:

<!-- Service declared in manifest -->
<service
    Android:name=".YourServiceName"
    Android:exported="true"
    Android:launchMode="singleTop">
    <intent-filter>
        <action Android:name="com.your.package.name.YourServiceName"/>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</service> <!-- Note: Service is exported to start it using ADB command -->

Et puis de la BAD

Pour démarrer le service:

adb Shell am startservice com.your.package.name/.YourServiceName

Pour arrêter le service (à la guimauve):

adb Shell am stopservice com.your.package.name/.YourServiceName

Pour arrêter le service (sur la gelée):

adb Shell am force-stop com.your.package.name

5
Atul

am startservice <INTENT>

ou effectivement du shell OS

adb Shell am startservice <INTENT>

2
DonGru

Pour tous ceux qui ne savent toujours pas comment définir le paramètre du nom de service, la barre oblique directe va immédiatement après le nom du package d'application dans le nom de classe complet.

Donc, étant donné un nom de package d'application de: app.package.name

Et un chemin complet au service de: app.package.name.example.package.path.MyServiceClass

La commande ressemblerait alors à ceci:

adb Shell am startservice app.package.name/.example.package.path.MyServiceClass
1
TheIT