android 接受开机广播

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 接受开机广播相关的知识,希望对你有一定的参考价值。

声明权限
<receiver android:name="BootBroadcast" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

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

然后写一个类接受开机广播
public class BootBroadcast extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
// TODO Auto-generated method stub
Log.i("db", "start");



为什么就这样也没法看到日志啊? 说明广播根本就没有收到呀? 该怎么解决

Android接收开机广播,需要用到播广播接收者BroadcastReceiver组件。

具体代码:

    在配置文件AndroidManifest.xml中向系统注册receiver

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

    需要添加相应权限

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

    在Receiver中就可以添加开机需要进行的操作

    public class BootCompletedReceiver extends BroadcastReceiver
       @Override
       public void onReceive(Context context, Intent intent)
           
       


参考技术A 你检查下<receiver android:name="BootBroadcast" > 里面的路径对不对,应该是这里的配置错了。 参考技术B <receiver android:name="BootBroadcast" >

这里name 后面你写错了,没有找到该类,肯定接受不到日志。。。应该写的是完整的包名.类名 如果只有一个包的话 类前面可以直接加点。本回答被提问者和网友采纳
参考技术C 这种例子很多 你先在网上下一个来调试 可以后 在来查看你的代码是否有什么问题 参考技术D 呵呵,何不用Toast呢?

入门篇:8.组件3:BroadcastReceiver

广播类似于activity和service,同样是android中的基本组件。作为开发者,只需要掌握广播接受者,不必去理解其底层的机制

1.Broadcast(广播)和BroadcastReceiver(广播接受者)

广播是一种广泛运用在应用程序之间传输信息的机制。而广播接受者是对发送出来的广播进行过滤接收并相应的一类组件,它用于接收来自系统和应用中的广播

用途:

开机完成系统会发出一条广播

网络状态发生改变时体统发出一条广播

电池电量改变时,系统发出一条广播。

2.广播接受者的生命周期

广播接受者的生命周期非常短,只有大概几秒钟,因此在BroadcastReceiver里不能做一些比较耗时的操作。如果用到了比较耗时的操作,应该通过发送给Intent给Service,由Service来完成。并且需要注意的是,不能使用子线程。

3.广播的种类

   普通广播(Normal broadcasts):

       所有监听该广播的广播接受者都可以接收和监听到该广播

       特点:

             (1)同级别接受先后是随机的(无序)。

             (2)级别低的后收到广播。

             (3)接收器不能阶段广播的继续传播也不能处理广播。

             (4)同级别动态注册高于静态注册。

  有序广播(Ordered broadcasts)

      按照接受者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接受者可以篡改内容。

      特点:

             (1)同界别接受顺序是随机的。

             (2)能截断广播的继续传播,高级别的广播接收者收到该广播后,可以决定把该广播是否截断。

             (3)接受者能截断广播的继续传播,也能处理广播。

             (4)同级别动态注册高于静态注册。

  异步广播(黏滞性滞留广播)

      不能将处理结果传给下一个接受者,无法终止广播。(这类广播不常用)

4.普通广播优先级详解:

(1)在布局中添加一个按钮,用于发送广播

(2)点击发送广播按钮,携带数据发送广播,发送广播的按钮中执行如下代码:

Intent intent = new Intent();
intent.putExtra("msg","这是一条普通广播");
intent.setAction("BC_ONE");
sendBroadcast(intent);

其中BC_ONE用于过滤器过滤到该广播,该字符串可自定义。

(2)新建一个类BroadcastReceiver1.java,继承BroadcastReceiver,实现方法onReceive()。

(3)新建一个类BroadcastReceiver2.java,继承BroadcastReceiver,实现方法onReceive()。

       这里创建两个广播接受者的原因是为了比较他们两个的优先级。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by lzc on 16/6/21.
 */
public class BroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String str = intent.getStringExtra("msg");
        System.out.println("receiver1收到消息"+str);
    }
}

BroadcastReceiver2.java同理,只不过输出的是    receiver2收到消息   。

(4)在AndroidManifest.xml中注册广播接受者。

        <receiver android:name=".BroadcastReceiver1">
            <intent-filter
                android:priority="100"
                >
                <action android:name="BC_ONE"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".BroadcastReceiver2">
            <intent-filter
                android:priority="200">
                <action android:name="BC_ONE"/>
            </intent-filter>
        </receiver>

如果filter里面不加priority属性的话,两个广播接受器应当同时接收到广播。也就是同级别接收顺序为无序。而加上priority属性,则是自定义接受器的级别,数字越大,级别越高,越先收到广播。

另外,在AndroidManifest.xml中注册广播接受器属于静态注册,范围为全局。

(5)运行以上代码,得到的结果是:

06-21 13:56:01.452 10108-10108/com.example.lzc.broadcast I/System.out: receiver2收到消息这是一条普通广播
06-21 13:56:01.462 10108-10108/com.example.lzc.broadcast I/System.out: receiver1收到消息这是一条普通广播

由结果可见,receiver2比receiver1先接收到广播。

这就是普通广播的优先级体现

另外,如果在receiver2中添加截断广播的方法。abortBroadcast(),并不会截断广播。因为普通广播不允许被截断。

(6)上面介绍了静态注册接收器,这里简单提一下动态注册,所谓动态注册,也就是在java代码中注册,有效范围是当前运行的程序。

IntentFilter intentfilter = new IntentFilter("BC_ONE");//该字符串为Action
BroadcastReceiver1 bc1 = new BroadcastReceiver1();
registerReceiver(bc1,intentfilter);

5.有序广播优先级与特点:

发送有序广播的方法是sendOrderedBrocast()

其他操作和优先级与普通广播类似,但是我们会发现,有序广播既可以截断广播,也可以处理广播的数据,即在BroadcastReceiver2里面可以处理BroadcastReceiver1所发送的数据。(普通广播不可以处理)

6.异步广播(黏滞性滞留广播)简介

(1)与其他两种广播形式不同的是,异步广播可以先发送广播在注册接收器。

(2)发送方法是:sendStickyBroadcast(intent)

(3)使用异步广播时需要一个用户权限

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

 

以上是关于android 接受开机广播的主要内容,如果未能解决你的问题,请参考以下文章

Android入门第48天-静态BroadCast之接受开机广播

如何解决App无法收到android开机广播

Android 使用广播系统解决app开机自启动问题

android再发一次开机广播

Delphi XE开发 Android 开机自动启动

android4.4.4开机广播有时会收不到,请问大神是啥原因???