it-swarm.cn

如何从adb shell启动和停止Android服务?

我需要编写一个Shell脚本来启动和停止Android服务。

45
ranjitrock

我是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扩展Android.app.Service是服务的Java类。在我的AndroidManifest.xml和Java中,其中com.some.package是程序包名称。用 javabeat.net文章 作为帮助,寻找<service>

还要注意,在文本中包名和类名之间应该有.service.,我想这是一些约定,但是对我来说,这导致了我尚未解决的ClassNotFoundException

然后,安装您的apk。我是从Eclipse取得的,但adb install -r yourApkHere.apk应该可以工作。卸载是adb uninstall com.some.package.name,顺便说一句。

您可以像这样从主机系统start,谢谢 Just a TimMrRoy

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

有趣的是,我不需要-n

为了stop,我使用

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

希望能帮助到你。

由于我是初学者,请随时进行编辑/注释以纠正任何误解(例如,可能与组件(?)名称中的.service.有关)。

43
n611x007

开始服务:

adb Shell am startservice ...

启动服务。选项包括:--user |当前:指定以哪个用户身份运行;如果未指定,则以当前用户身份运行。

停止服务:

adb Shell am stopservice ... 

停止服务。选项包括:--user |当前:指定以哪个用户身份运行;如果未指定,则以当前用户身份运行。

17
bonnyz

如果要在adb Shell中运行脚本,那么我将尝试使用应用程序执行相同的操作。我认为您可以使用“ 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>]
13
sandroid

我可以通过开始服务

am startservice com.xxx/.service.XXXService

但是我还不知道如何阻止它。

9
MrROY

您应将服务的Android:exported属性设置为“ true”,以便允许其他组件调用它。在AndroidManifest.xml文件中,添加以下属性:

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

然后,您应该能够通过adb启动该服务:

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

有关Android:exported属性的更多信息,请参见 此页面

7
AmitB

使用时,您可能会收到错误“ *错误:应用程序在后台*”

adb Shell am startservice 

在奥利奥(26岁以上)。这需要前台的服务。使用以下内容。

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

响应pzulw对sandroid的有关指定意图的反馈。

组件名称的格式在 ComponentName.unflattenFromString 的api文档中进行了描述

它在第一个“ /”处分割字符串,将之前的部分作为程序包名称,并将之后的部分作为类名称。作为一种特殊的便利(例如,在命令行上解析组件名称时使用),如果在'/'之后紧跟一个'。'。那么最终的类名称将是包名称与“ /”后面的字符串的串联。因此,“ com.foo/.Blah”成为package =“ com.foo” class =“ com.foo.Blah”。

6
Just a Tim

您需要添加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 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

5
Atul

am startservice <INTENT>

或实际上是从OS Shell

adb Shell am startservice <INTENT>

2
DonGru

对于仍对如何定义服务名参数感到困惑的任何人,正斜杠会在完全限定的类名中紧随应用程序包名称之后。

因此,给定一个应用程序包名称:app.package.name

并提供以下服务的完整路径:app.package.name.example.package.path.MyServiceClass

然后,该命令将如下所示:

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