android开机启动Service(小发现)

来源:互联网 发布:耐克淘宝旗舰店正吗 编辑:程序博客网 时间:2024/04/30 12:51

最近在做一个关于Android系统上的监控程序,开机启动,开机启动代码是网上找的,也就是注册一个广播和Activity,然后用Activity启动Service就可以了,但是我想让这个程序没有界面,而且在桌面没有图标显示,然后我想当然的用Service来代替开机启动Activity,然后就出现了很诡异的事情:因为我第一次是用Activity唤醒的Service,发现启动的相当顺利,然后我把Activity直接注释掉,用eclipse的run as重新运安装,改用广播唤醒Sevice,开机之后Service程序也能顺利的执行,但是如果先卸载Android程序再安装注释了Activity的程序的话,Service是不会被广播启动的,在网上找了答案,原因是android系统版本的原因,说android4.0之后广播机制改了,从来没有运行过的Android程序是不能接收任何广播的。这句话我没法在4.0之前的手机上验证,但是我已经确定我的Androd4.0.3版本如果没有运行过的话,是不会收到开机广播的。

问题:

Android4.0.3版本上运行开机启动Sevice程序,不能启动。

解决思路:

让程序启动一次,然后就可以接受开机广播了。

解决办法:

因为这个是一个无桌面图标的程序。所以让它启动的时候会无法发现他已经安装到设备上了。可以在“设置”->"应用"看到应用已经安装上了。也可以在日志里查看,因为它和有Activity的程序启动是不一样的。我采用的是无线adb调试。

有Activity时Console安装打印信息如下

[2015-10-12 17:05:03 - monitor] Android Launch!
[2015-10-12 17:05:03 - monitor] adb is running normally.
[2015-10-12 17:05:03 - monitor] Performing net.langwei.monitor.Monitor activity launch
[2015-10-12 17:05:03 - monitor] Automatic Target Mode: using device '192.168.18.132:5555'
[2015-10-12 17:05:03 - monitor] Uploading monitor.apk onto device '192.168.18.132:5555'
[2015-10-12 17:05:03 - monitor] Installing monitor.apk...
[2015-10-12 17:05:05 - monitor] Success!
[2015-10-12 17:05:05 - monitor] Starting activity xxx.xxxxxxx.monitor.Monitor on device 192.168.18.132:5555
[2015-10-12 17:05:06 - monitor] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=xxx.xxxxxxx.monitor/.Monitor }

无Activity时Console安装打印信息如下

[2015-10-12 16:56:44 - monitor] Android Launch!
[2015-10-12 16:56:44 - monitor] adb is running normally.
[2015-10-12 16:56:44 - monitor] No Launcher activity found!
[2015-10-12 16:56:44 - monitor] The launch will only sync the application package on the device!
[2015-10-12 16:56:44 - monitor] Performing sync
[2015-10-12 16:56:44 - monitor] Automatic Target Mode: using device '192.168.18.132:5555'
[2015-10-12 16:56:46 - monitor] Uploading monitor.apk onto device '192.168.18.132:5555'
[2015-10-12 16:56:46 - monitor] Installing monitor.apk...
[2015-10-12 16:56:48 - monitor] Success!
[2015-10-12 16:56:48 - monitor] \monitor\bin\monitor.apk installed on device
[2015-10-12 16:56:48 - monitor] Done!
[2015-10-12 17:05:02 - monitor] Dx 

1、这个方法是偶然发现的,也就是让Activity先启动一次Service,然后在AndroidManifest.xml文件中注释掉Activity,然后在run as重新安装一遍。这样就可以接收开机广播了。可能eclipse的run as功能是将原来的版本替换,并不是卸载之后安装。

2、采用am命令启动一次Service,这样就可以不用写Activity启动Service再注释掉Activity了。具体用法am startservice -n xxx.xxxxxxx.xxxxxxx/.MonitorService。xxx.xxxxxxx.xxxxxxx是包名,采用am启动Service的时候可能会出现Error: Requires permission not exported from uid 10080这种信息,这时候你就需要在你的AndroidManifest.xml标签中增加一个android:exported="true"可以被别的进程访问。或者你自己升级到root权限也可以am启动Service。

0 0