Je dois écrire un script Shell pour démarrer et arrêter un service Android.
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>
où 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 (?)).
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.
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>]
Je peux commencer le service par
am startservice com.xxx/.service.XXXService
mais je ne sais pas encore comment l'arrêter.
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 .
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
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".
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
am startservice <INTENT>
ou effectivement du shell OS
adb Shell am startservice <INTENT>
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