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

j'ai besoin d'écrire un script shell pour démarrer et arrêter un android .

38
demandé sur ranjitrock 2011-09-14 16:02:59

10 réponses

je suis un débutant dans Android, mais je l'ai fait fonctionner comme ceci:

dans AndroidManifest.xml, assurez-vous, à l'intérieur <application>, avoir 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 étendre android.app.Service est votre classe java qui est le service. Où com.some.package est le nom du paquet, pour moi les deux dans AndroidManifest.xml et en Java. Utilisé un javabeat.net l'article comme aide, cherchez <service>

Notez aussi, soi-disant entre le nom du paquet et le nom de la classe doit être .service. dans le texte, je suppose que c'est une convention, mais pour moi, cela a provoqué ClassNotFoundException que je suis encore à résoudre.

alors, installez votre apk. Je l'ai fait à partir d'eclipse, mais aussi adb install -r yourApkHere.apk devrait fonctionner. La désinstallation est adb uninstall com.some.package.name, btw.

Vous pouvez démarrer c'est à partir de l'hôte système comme ça, merci Juste un Tim et MrRoy:

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

fait intéressant, je n'ai pas eu besoin -n.

arrêt, j'utilise

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

j'Espère que ça aide.

comme je suis un débutant, s'il vous plaît sentez freet pour éditer/commenter pour corriger toutes les idées fausses (par exemple. probablement concernant .service. dans la composante (?) nom.)

35
répondu n611x007 2017-05-23 12:02:53

démarrage un service:

adb shell am startservice ...

lancer un Service. Les Options sont: -- user | current: spécifiez sous quel utilisateur lancer le programme; si ce n'est pas le cas spécifié puis exécuté comme utilisateur courant.

Arrêt un service:

adb shell am stopservice ... 

arrêt d'un Service. Les Options sont: -- user | current: spécifiez sous quel utilisateur lancer le programme; si ce n'est pas le cas spécifié puis exécuté comme utilisateur courant.

14
répondu bonnyz 2015-03-11 09:43:55

si vous voulez lancer le script dans le shell adb, alors j'essaye de faire la même chose, mais avec une application. Je pense que vous pouvez utiliser "suis-début de la commande"

utilisation: 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>]
12
répondu sandroid 2011-09-14 12:06:47

je peux démarrer le service par le biais de

am startservice com.xxx/.service.XXXService

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

8
répondu MrROY 2011-12-12 02:32:07

vous devez définir l'attribut android:exported du service à "true", afin de permettre à d'autres composants de l'invoquer. Dans L'AndroidManifest.fichier xml, ajouter l'attribut suivant:

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

alors, vous devriez être en mesure de démarrer le service via adb:

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

Pour plus d'informations sur l'android:exportées attribut voir cette page.

6
répondu AmitB 2014-08-13 14:48:00

réponse aux commentaires de pzulw à sandroid au sujet de la spécification de l'intention.

le format du nom du composant est décrit dans les docs api pour Nomcomposant.unflattenFromString

il divise la chaîne au premier '/', en prenant la partie avant comme nom du paquet et la partie après comme nom de classe. Comme une commodité particulière (utiliser, par exemple, lors de l'analyse des noms des composants sur la ligne de commande), si le " / " est immédiatement suivie par un.' "puis le dernier nom de la classe sera la concaténation du nom du paquet avec la chaîne qui suit le '/'. Ainsi " com.foo/.Bla "devient paquet=" com.foo "class=" com.foo.Bla".

5
répondu Just a Tim 2012-08-08 15:08:57

Vous devez ajouter android:exported="true" pour démarrer le service de la BAD ligne de commande. Ensuite, votre manifeste ressemble à quelque chose comme 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, à partir de la BAD

Pour démarrer le service:

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

Pour arrêter le service (Guimauve):

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

Pour arrêter le service (Jelly Bean):

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

3
répondu Atul 2017-06-15 04:43:45

am startservice <INTENT>

ou en fait, à partir de l'OS shell

adb shell am startservice <INTENT>

2
répondu DonGru 2011-09-14 12:23:57

Vous pouvez obtenir un message d'erreur "*Erreur: l'application est en arrière-plan *" tout en utilisant

adb shell am startservice 

dans le Oreo (26+). Cela nécessite des services au premier plan. Utilisation suivantes.

adb shell am start-foreground-service com.some.package.name/.YourServiceSubClassName
2
répondu Kiran k g 2018-09-13 11:28:19

pour ceux qui ne savent pas encore comment définir le paramètre de nom de service, la barre oblique avant suit immédiatement le nom du paquet d'application dans le nom de classe pleinement qualifié.

Donc, un nom de paquet: app.package.name

Et un chemin d'accès complet au service de: app.package.name.example.package.path.MyServiceClass

Ensuite, la commande devrait ressembler à ceci:

adb shell am startservice app.package.name/.example.package.path.MyServiceClass
1
répondu TheIT 2016-01-06 02:53:21