Как запустить и остановить службу Android из оболочки adb? - PullRequest
45 голосов
/ 14 сентября 2011

Мне нужно написать сценарий оболочки для запуска и остановки службы Android.

Ответы [ 10 ]

43 голосов
/ 09 сентября 2013

Я новичок в Android, но он работает так:

в AndroidManifest.xml, убедитесь, что внутри <application> есть что-то вроде этого:

<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 - это ваш класс Java, который является службой. Где com.some.package - это имя пакета, для меня как в AndroidManifest.xml, так и в Java. Использовал статью javabeat.net в качестве справки, ищите <service>

Обратите внимание, предположительно, между именем пакета и именем класса в тексте должно быть .service., я думаю, это какое-то соглашение, но для меня это вызвало ClassNotFoundException, что мне еще предстоит решить.

Затем установите ваш apk. Я сделал из затмения, но также adb install -r yourApkHere.apk должен работать. Деинсталляция adb uninstall com.some.package.name, кстати.

Вы можете запустить с хост-системы следующим образом, спасибо Просто Тим и MrRoy :

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

интересно, мне не нужно было -n.

до стоп , я использую

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

Надеюсь, это поможет.

Поскольку я новичок, пожалуйста, не стесняйтесь редактировать / комментировать, чтобы исправить любые неправильные представления (например, вероятно, относительно .service. в названии компонента (?)).

16 голосов
/ 11 марта 2015

Запуск Услуга:

adb shell am startservice ...

запустить Сервис. Варианты: - пользователь | current: укажите, какого пользователя запускать; если не затем укажите его как текущего пользователя.

Остановка услуга:

adb shell am stopservice ... 

остановить Сервис. Варианты: - пользователь | current: укажите, какого пользователя запускать; если не затем укажите его как текущего пользователя.

13 голосов
/ 14 сентября 2011

Если вы хотите запустить скрипт в оболочке adb, то я пытаюсь сделать то же самое, но с приложением.Я думаю, что вы можете использовать команду "am start"

использование: am [подкоманда] [опции]

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>]
9 голосов
/ 12 декабря 2011

Я могу начать обслуживание через

am startservice com.xxx/.service.XXXService

, но пока не знаю, как это остановить.

7 голосов
/ 13 августа 2014

Вам следует установить для атрибута android: exported службы значение «true», чтобы другие компоненты могли вызывать его. В файле AndroidManifest.xml добавьте следующий атрибут:

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

Тогда вы сможете запустить сервис через adb:

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

Для получения дополнительной информации об атрибуте android: exported см. эту страницу .

6 голосов
/ 13 сентября 2018

Вы можете получить сообщение об ошибке "* Ошибка: приложение в фоновом режиме *" при использовании

adb shell am startservice 

в Орео (26+). Это требует услуг на переднем плане. Используйте следующее.

adb shell am start-foreground-service com.some.package.name/.YourServiceSubClassName
6 голосов
/ 08 августа 2012

Ответ на отзыв pzulw к sandroid об указании намерения.

Формат имени компонента описан в документации API для ComponentName.unflattenFromString

Он разбивает строку на первый символ '/', принимая часть до в качестве имени пакета и часть после в качестве имени класса. Как особое удобство (использовать, например, при разборе имен компонентов в командной строке), если после «/» сразу же следует «.» тогда окончательным именем класса будет конкатенация имени пакета со строкой, следующей за '/'. Таким образом, com.foo/.Blah становится package = "com.foo" class = "com.foo.Blah".

5 голосов
/ 15 июня 2017

Вам нужно добавить android:exported="true", чтобы запустить службу из командной строки ADB.Тогда ваш манифест выглядит примерно так:

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

А затем из ADB

Чтобы запустить службу:

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

Чтобы остановить службу (на зефире):

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

Чтобы прекратить обслуживание (на желе):

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

2 голосов
/ 14 сентября 2011

am startservice <INTENT>

или собственно из оболочки ОС

adb shell am startservice <INTENT>

1 голос
/ 06 января 2016

Для тех, кто все еще не знает, как определить параметр имени службы, прямая косая черта идет сразу после имени пакета приложения в полном имени класса.

Итак, имя пакета приложения: app.package.name

И полный путь к сервису: app.package.name.example.package.path.MyServiceClass

Тогда команда будет выглядеть так:

adb shell am startservice app.package.name/.example.package.path.MyServiceClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...