如何从一个adb shell启动和停止android服务?

我需要编写一个shell脚本来启动和停止一个android服务

  • 通过adb获取蓝牙MAC地址
  • 需要经常重启Eclipse才能使logcat正常工作
  • 如何阅读与Java的Android属性
  • Adb android与Genymotion的冲突
  • 如何为远程机器开发和本地设备部署设置ADB
  • 通过logcat在Android上debuggingWebView(Ionic)应用程序
  • Android 4.2.2 - adb离线,即使在SDK升级之后
  • 使用ADB模拟触摸
  • 我是一个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类是服务。 其中, com.some.package是AndroidManifest.xml和Java中的包名称。 使用javabeat.net文章作为帮助,查找<service>

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

    然后,安装你的apk。 我从eclipse做,但也adb install -r yourApkHere.apk应该工作。 卸载是adb uninstall com.some.package.name ,顺便说一句。

    你可以像这样从主机系统启动 ,谢谢Tim和MrRoy :

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

    有趣的是,我不需要-n

    停下来 ,我用

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

    希望能帮助到你。

    因为我是初学者,所以请编辑/评论以解决任何误解(例如,可能与组件(?)名称中的.service. )有关)。

    如果你想在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>] 

    开始服务:

     adb shell am startservice ... 

    开始一个服务。 选项是:–user | current:指定运行哪个用户; 如果未指定,则以当前用户身份运行。

    停止服务:

     adb shell am stopservice ... 

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

    我可以通过开始服务

     am startservice com.xxx/.service.XXXService 

    但我不知道如何阻止它。

    回应pzulw对sandroid的反馈意见。

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

    它在第一个'/'处拆分string,将之前的部分作为包名称,之后的部分作为类名称。 作为一个特别的方便(例如,当在命令行上parsing组件名称时使用),如果紧跟“/”后面紧跟一个“。”。 那么最终的类名将是包名与string“/”后面的串联。 因此“com.foo/.Blah”变成了package =“com.foo”class =“com.foo.Blah”。

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

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

    那么,你应该能够通过adb启动服务:

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

    有关android:exported属性的更多信息,请参阅此页面 。

    am startservice <INTENT>

    或者实际上来自OS shell

    adb shell am startservice <INTENT>

    对于仍然困惑于如何定义服务名称参数的人来说,正斜杠会在完全限定类名称中的应用程序包名称后面。

    所以给定一个应用程序包名称: app.package.name

    以及服务的完整path: app.package.name.example.package.path.MyServiceClass

    那么这个命令看起来像这样:

     adb shell am startservice app.package.name/.example.package.path.MyServiceClass 

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

    亚行shell我startservice …启动一个服务。 选项是:–user | current:指定运行哪个用户; 如果未指定,则以当前用户身份运行。 停止服务:

    亚行壳是停止服务…