您的位置:首页 > 移动开发 > Android开发

高版本android 开机广播boot_completed

2015-05-04 22:39 489 查看
高版本android在开机启动时会广播一个boot_completed,但是不是每个应用都能捕捉到,我们安装后至少打开一次该应用并且没有强制关闭该应用,在下次开机的时候就能接收到boot_completed广播了,这应该是google出于安全的考虑。

个人测试有用

原文如下:

   原来,在3.1之后,系统的PackageManager增加了对处于“stopped state”应用的管理,这个stopped和Activity生命周期中的stop状态是完全两码事,包管理器中的stopped state指的是安装后从来没有启动过或者是被用户手动强制停止的应用。这点大家可以到“设置”——>"应用程序",查看任何一个安装的应用,看看“强行停止”这个按钮是否变灰就知道了。

   系统增加了2个Flag:FLAG_INCLUDE_STOPPED_PACKAGESFLAG_EXCLUDE_STOPPED_PACKAGES ,来标识一个intent是否激活处于“stopped
state”的应用。当2个Flag都不设置或者都进行设置的时候,采用的是FLAG_INCLUDE_STOPPED_PACKAGES的效果。有了上面的新机制之后,google觉得给所有的广播intent默认加上FLAG_EXCLUDE_STOPPED_PACKAGES会非常的Cooooool,能在一定程度上避免流氓软件、病毒啊干坏事,还能提高效率,就导致了RECEIVE_BOOT_COMPLETED广播如果用户没有运行过应用或者在设置中强行停止了应用,就不会接收到BOOT_COMPLETED广播。

那么如果要实现开机自启动服务,该怎么实现?直接上源码

1、BootCompletedReceiver.java文件

[java] view
plaincopy





public class BootCompletedReceiver extends BroadcastReceiver {  

  

    @Override  

    public void onReceive(Context context, Intent intent) {  

        // TODO Auto-generated method stub  

        Log.d("LibraryTestActivity", "recevie boot completed ... ");  

        context.startService(new Intent(context, TestService.class));  

    }  

}  

2、AndroidManifest.xml文件

[html] view
plaincopy





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

  

<receiver android:name=".BootCompletedReceiver">  

    <intent-filter>    

        <action android:name="android.intent.action.BOOT_COMPLETED" />    

    </intent-filter>  

</receiver>  

注意,一定要加上权限<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

否则就收不到广播咯。

3、安装应用到你的手机后,启动一次该应用,那么下次开机就能收到BOOT_COMPLETED广播,并且就能看到TestService服务启动了。

做了个测试:到设置——>应用程序,找到刚才安装的应用,点击“强行停止”,那么重启手机后,就收不到BOOT_COMPLETED广播了。

如果该应用被有些三方安全软件强制杀掉进程后,重启手机也会收不到BOOT_COMPLETED广播。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐