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 .
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>
où 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.)
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.
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>]
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.
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.
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".
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
am startservice <INTENT>
ou en fait, à partir de l'OS shell
adb shell am startservice <INTENT>
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
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