BroadcastReceiver简单使用

本文介绍了Android中的BroadcastReceiver(广播接收者),包括为何需要广播接收者,详细讲解了几个重要案例,如ip拨号器、短信监听器、SD卡状态监听、开机启动等,并提到了有序广播和无序广播的概念。BroadcastReceiver能够在不运行状态下接收系统或自定义事件,实现特定功能,例如监听电话拨打、短信接收、SD卡状态变化等。
摘要由CSDN通过智能技术生成
##01_为什么需要广播接受者
    
    电台:中央人民广播电台,93.4mhz;
    收音机:93.4mhz,收听广播;

    Android系统内置的电台,发送一些事件:接收短信、外拨电话、电量不足、电量充满、SD插拔、软件安装与下载等。
    Android应用程序中的收音机:广播接收者,指定需要接收的事件类型;
    可以做一些对用户有用的业务逻辑操作。


广播接收者的特点:

    1、即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消息;
    2、从android4.0之后,添加了一个新特点,如果强制停止就相当于冻结了这个程序,只能等到下次手工启动后才能生效;
    
##02_广播接受者案例_ip拨号器(重点)
    17951 139999999

    步骤:
    1、准备一个收音机:
        创建一个广播接收者的类,继承BroadcastReceiver:

            public class OutCallBroadcastReceiver extends BroadcastReceiver {
                public void onReceive(Context context, Intent intent) {
                }
            }
    2、插上一块电池:
         <receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver"></receiver>
    3、调整到一定的频道:
         <receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver">
            <intent-filter >
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

    4、添加权限到清单文件:
         <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>


##03_广播接受者案例_短信监听器(重点)
    
    配置文件:

     <receiver android:name="com.iheima.smslistener.SMSBroadcastReceiver">
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
      </receiver>

    代码:

    package com.iheima.smslistener;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.SmsMessage;
    
    public class SMSBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            
            //接收短信的内容
            Object[] objs = (Object[]) intent.getExtras().get("pdus");
            for(Object obj : objs){
                SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
                
                String content = sms.getMessageBody();
                
                String phone = sms.getOriginatingAddress();
                System.out.println("content=="+ content);
                System.out.println("phone=="+ phone);
            }
    
        }
    
    }

    
##04_广播接受者案例_sd卡状态监听(重点)

    android2.3的模拟器上测试,4.0之后的版本上去掉了SD插拔的功能;
    从

代码:


配置文件:

        <receiver android:name="com.itheima.sdlistener.SDBroadcastReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.MEDIA_MOUNTED" />
                    <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
                    <action android:name="android.intent.action.MEDIA_REMOVED" />
                    <!-- 这个属性必须添加 -->
                    <data android:scheme="file"/>
                </intent-filter>
            </receiver>

代码:

        package com.itheima.sdlistener;
        
        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        
        public class SDBroadcastReceiver extends BroadcastReceiver {
        
        @Override
        public void onReceive(Context context, Intent intent) {
    
            //得到广播的事件类型
            String action= intent.getAction();
            if("android.intent.action.MEDIA_MOUNTED".equals(action)){
                System.out.println("SD卡已经插上了............");
            }
            if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
                System.out.println("SD卡已拔掉了............");
            }
            
            if("android.intent.action.MEDIA_REMOVED".equals(action)){
                System.out.println("SD卡已经移除上了............");
            }
            }
        }

##05_广播接受者案例_开机启动(重点)(代码不全)

    配置文件:

    <receiver android:name="com.itheima.bootcomplete.BootCompleteBroadcastReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    代码:

    package com.itheima.bootcomplete;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.sax.StartElementListener;
    
    public class BootCompleteBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            
            Intent i = new Intent(context,MainActivity.class);
            
            //告诉activity使用自己的任务栈来维护界面,如果任务栈中没有当前任务就创建一个任务
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            
            context.startActivity(i);
        }
    
    }

    
##06_广播接受者案例_卸载安装(重点)
    
配置文件:

     <receiver android:name="com.itheima.azxzlistener.AZXZBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_INSTALL" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <!-- 这个属性必须添加 -->
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>

代码:
        
    package com.itheima.azxzlistener;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class AZXZBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        
        if("android.intent.action.PACKAGE_INSTALL".equals(action)){
            System.out.println("有一个新软件安装了...........");
        }
        if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            System.out.println("有一个软件卸载了...........");
        }
        if("android.intent.action.PACKAGE_REPLACED".equals(action)){
            System.out.println("有一个软件升级了...........");
        }
        }

    }
  
##07_发送自定义广播

示例代码:

        代码:

        Intent intent = new Intent();
        intent.putExtra("news", "我是广播");
        //给广播设置一个事件类型
        intent.setAction("com.itheima.selfbroadcast.SBC");
        //发送广播消息
        sendBroadcast(intent);


##08_有序广播和无序广播(重点)

   
    有序广播:广播发送的消息会按照广播接收者的优先级从高到低一级一级的发放消息。
            消息可以被拦截,被修改;
    
    无序广播:广播发送的消息发送出去后,只要广播接收者指定了它的事件类型,都可以接收到这个消息。
            消息不能被拦截;

代码:

    Intent intent = new Intent();
        
        intent.setAction("com.itheima.FFNTBT");
        //发送一个有序的广播
        //intent 传递数据的意图对象
        //receiverPermission 指定了只有这个权限的广播接收者才能接收到这个消息
        //resultReceiver 指定了哪个广播接收者最后接收到消息 
        //scheduler 消息处理器
        //initialCode 初始的消息码
        //initialData 初始数据
        //initialExtras 发送的额外数据
        sendOrderedBroadcast(intent, null, null, null, 1, "我是国务院,发放2014年农田补贴,每亩地补贴900元", null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值