Java 开机启动

1、授权:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

2、intent-filter & name使用类全名

<receiver    android:name="com.bd.testbootservice.MyReceiver"    android:enabled="true"    android:exported="true" >

    <intent-filter android:priority="1000">        <action android:name="android.intent.action.BOOT_COMPLETED"></action>        <category android:name="android.intent.category.HOME"></category>    </intent-filter></receiver>

3、避免使用SD卡:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.bd.testbootservice"    android:installLocation="internalOnly">

Android API Level8以上的时候,程序可以安装在SD卡上。如果程序安装在SD卡上,那么在BOOT_COMPLETED广播发送之后,SD卡才会挂载,因此程序无法监听到该广播。

解决办法:同时监听开机和sd卡挂载。(也不能只监听挂载就认为开机了,因为有的手机没有sd卡)

实现对挂载进行监听meda mounted如下:

<receiver android:name="com.bd.testbootservice.MyReceiver" >
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<data android:scheme="file" >
</data>
</intent-filter>
</receiver>
监听meda mounted的Receiver就不写了。

如何实现一个能同时监听开机BOOT_COMPLETED和挂载meda mounted的广播接收器呢?

理论上只要将meda mounted的intent-filter和BOOT_COMPLETED的intent-filter放在一起就行了,但是,放同一个intent-filter里,boot complete监听不到,需要放到两个intent filter中:

<receiver android:name="com.bd.testbootservice.MyReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<data android:scheme="file" >
</data>
</intent-filter>
</receiver>

4、Stopped state

(一)
在做Android开发时,很多应用由于各种目的,希望在机器启动时被唤醒,一般的做法是写一个BroadcastReceiver,接收对应的boot action,当然别忘了在Manifest中添加permission "android.permission.RECEIVE_BOOT_COMPLETED“。但是最近在做4.0开发时,有同事声称这个广播接收不到了,同时其他有人又说自己的能接收到,到底是怎么回事呢。

原来,在3.1之后,系统的package manager增加了对处于“stopped state”应用的管理,这个stopped和Activity生命周期中的stop状态是完全两码事,指的是安装后从来没有启动过和被用户手动强制停止的应用,与此同时系统增加了2个Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES ,来标识一个intent是否激活处于“stopped state”的应用。当2个Flag都不设置或者都进行设置的时候,采用的是FLAG_INCLUDE_STOPPED_PACKAGES的效果。

有了上面的新机制之后,google觉得给所有的广播intent默认加上FLAG_EXCLUDE_STOPPED_PACKAGES会非常的Cooooool,能在一定程度上避免流氓软件、病毒啊干坏事,还能提高效率,就导致了本文题目中说的问题,RECEIVE_BOOT_COMPLETED广播如果用户没有运行过应用,就不会响应了。

不过google还是留了点余地,允许应用和后台服务通过给广播intent设置FLAG_INCLUDE_STOPPED_PACKAGES来唤醒处于“stopped state”的程序,也就是用户自己写的广播intent可以控制这个机制,但是系统自带的广播intent,由于不能修改,就只能接受这个现实了。

(二)

android 4.0为了防止一些malware(恶意软件)不经用户启动就在后台运行,默认安装的程序在用户启动前是完全被系统忽略的,即使程序注册了广播,系统也不会给该程序传递广播。只有程序被用户运行过之后,消息广播才会生效。而且,即使程序已经运行过了,如果被用户Force Stop(强制停止),又会回到被系统忽略的状态。这个问题其实从3.1的时候就已经有了,最近用4.0的系统测试才发现了这个问题的存在,引起不少麻烦。

5、通过adb发送命令 ~/Library/Android/sdk/platform-tools

adb发送BOOT_COMPLETED
我们可以通过

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
命令发送BOOT_COMPLETED广播,而不用重启测试机或模拟器来测试BOOT_COMPLETED广播,这条命令可以更精确的发送到某个package,如下:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name

6、

7、

参考:

http://www.trinea.cn/android/android-boot_completed-not-work/

时间: 2024-12-25 05:55:26

Java 开机启动的相关文章

Linux中tomcat开机启动配置脚本【参考其他文章的总结备忘录】

参考文章http://blog.sina.com.cn/s/blog_a57562c80101ic47.html http://blog.csdn.net/cheng168520/article/details/4312828 http://blog.sina.com.cn/s/blog_7f395ece0100ti5y.html 以前在自己本机上安装过一个Linux,后台应为系统崩溃,以前配置的开机启动脚本.数据库主从双备份.负载均衡等都没了,所以现在在重新配置一次,赶紧做个笔记防止自己以后又

不错的linux下通用的java程序启动脚本(转载)

转自:http://www.cnblogs.com/langtianya/p/4164151.html 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. 原文地址:http://www.tudaxia.com/archives/10 start函数中,nohup部分其实也

tomcat以服务形式开机启动

第一步 将tomcat配置为服务模式 cp $TOMCAT_HOME/bin/catalina.sh /etc/init.d/tomcat #将tocmt启动文件复制到/etc/init.d下 vim /etc/init.d/tomcat #修改脚本文件 #在脚本的第三行后面插入下面两行 # chkconfig: 2345 10 90 # description:Tomcat service #第一行是服务的配置:第一个数字是服务的运行级,2345表明这个服务的运行级是2.3.4和5级(Linu

CentOS设置开机启动

# 1编辑启动文件vi /etc/rc.d/rc.local export JAVA_HOME=/usr/local/java/jdk1.7.0_55 # start fastDFS/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf/usr/bin/fdfs_storaged /etc/fdfs/storage.conf/usr/local/nginx/sbin/nginx # start rediscd /redis/6379./bin/redis-se

【Android开发日记】初次探秘Android Service!Service开机启动+重力感应+弹窗+保持运行

前言: 最近在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Activity启动和销毁.满足了自己的需求.现记录学习心得.希望能给你带来一些帮助. 1.Service创建:重写4个方法 onBind():返回一个IBinder对象,这个对象可以使应用程序与Service通信.如果用startService.stopService启动和关闭Service的话,Service和访问者是无法通信交换数据的.onBind()返回值设

centos7 增加tomcat开机 启动

1. 增加tomcat启动参数 tomcat 需要增加一个pid文件 在tomca/bin 目录下面,增加 setenv.sh 配置,catalina.sh启动的时候会调用,同时配置java内存参数. #add tomcat pid CATALINA_PID="$CATALINA_BASE/tomcat.pid" #add java opts JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M

CentOS 7 服务器配置--配置Tomcat开机启动

#编辑Tomcat的文件,追加内容 vi /data/tomcat/apache-tomcat-8.0.43/bin/catalina.sh #追加内容,在CLASSPATH= 上面的第三行 CATALINA_PID="$CATALINA_BASE/tomcat.pid" #在/usr/lib/systemd/system添加tomcat.service文件 vi /usr/lib/systemd/system/tomcat.service #追加内容 [Unit] Descripti

默认开机启动;通过Broadcastreceiver广播监听开机启动,实现&quot;没有activity&quot;的自启服务或者自启应用程序。

一.首先介绍一下如何开机启动: 第一种:  监控RECEIVE_BOOT_COMPLETED,即开机启动事件 第二种: 监控sd卡mount事件  开机总会扫描sd卡吧? 监控sd卡事件也有类似开机启动效果,特别app安装在sd卡的情况下有些os是抓取不到RECEIVE_BOOT_COMPLETED 第三种: android:installLocation="internalOnly", 限制app的安装位置,使其能抓取到RECEIVE_BOOT_COMPLETED 我们也可以同时使用

Android开机启动程序

android程序实现开机启动的原理,简单点说就是做一个广播接收器,接收到开机广播时就启动activity或service或执行其它操作.Android系统在启动的时候会发出一个开机广播,内容为ACTION_BOOT_COMPLETED,我们写一个接收器,每当接收到这个广播的时候,就说明是刚开机,然后启动需要开机启动的程序就行了.具体步骤: 第一步,新建BootBroadcastReciever.java,继承BroadcastReceiver, public class BootBroadca