我需要编写一个shell脚本来启动和停止Android服务。
答案 0 :(得分:43)
我是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中都适用于我。
使用a javabeat.net article作为帮助,查找<service>
另请注意,假设在包名和类名之间,文本中应该有.service.
,我想这是一些惯例,但对我来说这导致ClassNotFoundException
我还没到解决。
然后,安装你的apk。我是从eclipse做的,但adb install -r yourApkHere.apk
也应该有用。卸载是adb uninstall com.some.package.name
,顺便说一句。
您可以像这样从主机系统开始,感谢Just a Tim和MrRoy:
adb shell am startservice com.some.package.name/.YourServiceSubClassName
有趣的是,我不需要-n
。
要停止,我使用
adb shell am force-stop com.some.package.name
希望它有所帮助。
由于我是初学者,请感到自由编辑/评论以解决任何误解(例如,可能与组件(?)名称中的.service.
相关)。
答案 1 :(得分:16)
开始服务:
adb shell am startservice ...
启动服务。选项包括: --user | current:指定要运行的用户;如果不 指定然后以当前用户身份运行。
停止服务:
adb shell am stopservice ...
停止服务。选项包括: --user | current:指定要运行的用户;如果不 指定然后以当前用户身份运行。
答案 2 :(得分:13)
如果你想在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>]
答案 3 :(得分:9)
我可以通过
开始服务am startservice com.xxx/.service.XXXService
但我不知道如何阻止它。
答案 4 :(得分:7)
您应该将服务的android:exported属性设置为&#34; true&#34;,以便允许其他组件调用它。在AndroidManifest.xml文件中,添加以下属性:
<service android:exported="true" ></service>
然后,您应该可以通过adb启动服务:
adb shell am startservice com.package.name/.YourServiceName
有关android:exported属性的详细信息,请参阅this page。
答案 5 :(得分:6)
回应pzulw对sandroid关于指定意图的反馈。
组件名称的格式在ComponentName.unflattenFromString
的api文档中描述它将字符串拆分为第一个'/',将前面的部分作为包名称,将后面的部分作为类名称。作为一种特殊的便利(例如,在命令行上解析组件名称时使用),如果'/'后面紧跟''。那么最后的类名将是包名与“/”后面的字符串的串联。因此“com.foo/.Blah”变成package =“com.foo”class =“com.foo.Blah”。
答案 6 :(得分:6)
在使用
时,您可能会收到错误消息“ *错误:应用程序在后台*”adb shell am startservice
在奥利奥(26岁以上)。这需要前台的服务。 使用以下内容。
adb shell am start-foreground-service com.some.package.name/.YourServiceSubClassName
答案 7 :(得分:5)
您需要添加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
停止服务(在Marshmallow上):
adb shell am stopservice com.your.package.name/.YourServiceName
停止服务(在Jelly Bean上):
adb shell am force-stop com.your.package.name
答案 8 :(得分:2)
am startservice <INTENT>
或实际来自OS shell
adb shell am startservice <INTENT>
答案 9 :(得分:1)
对于仍然对如何定义服务名称参数感到困惑的人,正斜杠会立即转到完全限定类名中的应用程序包名称之后。
因此,应用程序包名称为:app.package.name
以及app.package.name.example.package.path.MyServiceClass
然后命令看起来像这样:
adb shell am startservice app.package.name/.example.package.path.MyServiceClass
答案 10 :(得分:1)
要停止服务,您必须使用以下命令找到服务名称:
adb shell dumpsys activity services <your package>
例如: adb shell dumpsys活动服务com.xyz.something
这将列出为您的软件包运行的服务。
输出应类似于:
ServiceRecord{xxxxx u0 com.xyz.something.beta/xyz.something.abc.XYZService}
现在选择您的服务并运行:
adb shell am stopservice <service_name>
例如:
adb shell am stopservice com.xyz.something.beta/xyz.something.abc.XYZService
类似地,要开始服务:
adb shell am startservice <service_name>
要访问服务,您的服务(在AndroidManifest.xml中)应设置export =“ true”
<!-- 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>