android开机启动Service(小发现)
2015-10-12 17:49
537 查看
最近在做一个关于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。
问题:
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。
相关文章推荐
- 四大组件之Brodcast Receiver
- 在一次也没有打开app的情况下能否接受到系统广播
- 【Android】开机启动 Service
- android接受不到开机广播
- 全局Toast
- Android 桌面浮动框
- android UiAutomator写一个自动修改密码的case
- android UiAutomator利用am命令启动和结束进程
- Android 冷知识(1)开机广播及一些特殊广播
- Android小米手机接收不到开机广播(个人笔记)
- Android应用在安装后未启动的情况下无法收到开机等各类广播
- am命令 启动activity
- Android开机广播
- 开机播放音乐
- AndroidWiki - APP作恶之开机广播监听
- Android 问题|注意项
- android收不到开机广播
- android LOG机制
- mac安装android开发环境
- Android多页面传递问题(1)