【Android】安卓学习笔记之广播(二)静态注册实现开机启动

来源:互联网 发布:零售业软件 编辑:程序博客网 时间:2024/05/20 06:50
       动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。
       这里我们准备让程序接收一条开机广播,当收到这条广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。新建一个BootCompleteReceiver 继承自

BroadcastReceiver,代码如下所示:

public class BootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();}}

       可以看到,这里不再使用内部类的方式来定义广播接收器,因为稍后我们需要在AndroidManifest.xml 中将这个广播接收器的类名注册进去。在onReceive()方法中,还是简单
地使用Toast 弹出一段提示信息。
       然后修改AndroidManifest.xml 文件,代码如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.broadcasttest"    android:versionCode="1"    android:versionName="1.0" >    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >……        <receiver android:name=".BootCompleteReceiver" >            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED" />            </intent-filter>        </receiver>    </application></manifest>
       终于,<application>标签内出现了一个新的标签<receiver>,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和<activity>标签非常相似,首先通过android:name来指定具体注册哪一个广播接收器,然后在<intent-filter>标签里加入想要接收的广播就行了,由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广播,因此我们在这里添加了相应的action。
       另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限。
现在重新运行程序后,我们的程序就已经可以接收开机广播了,首先打开到应用程序管理界面来查看一下当前程序所拥有的权限。在桌面按下Menu 键→System settings→Apps,然后点击BroadcastTest,如图所示。



可以看到,我们的程序目前拥有访问网络状态和开机自动启动的权限。然后将模拟器关闭并重新启动,在启动完成之后就会收到开机广播了。

0 0
原创粉丝点击