A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一啊啊啊
回复 使用道具 举报
新人报道,,,,,,,来看看
回复 使用道具 举报
看看,谢谢了
回复 使用道具 举报


##01_为什么需要广播接受者

        广播:
    电台:发送一定频道的广播消息,50mhz,;
    收音机:调整到一定频道,接收广播消息;
   

    android应用程序里面的电台:系统内置的一个服务,会把事件(电量不足、电量充满、开机启动完成)作为一个广播消息发送其他的接收者;
    android应用程序里面的收音机:自己写的一个广播接收者的一个类。



##02_广播接受者案例_ip拨号器(重点)

* 开发广播接收者的步骤:
         
    1、买个收音机:

                public class OutCallBroadCastReceiver extends BroadcastReceiver {
                        public void onReceive(Context context, Intent intent) {
                }

    2、插上电池:

                <receiver android:name="com.itheima.ipcall.OutCallBroadCastReceiver" />

    3、调整到一个频道:

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

##03_广播接受者案例_短信监听器(重点)
        pdus : protocol data unit s 协议数据单元

    特点:
        即使广播接收者没有运行,当广播消息到达的时候,系统会自动启动广播接收者的进程,调用onReceive方法,接收消息。
        4.0版本之后为了安全考虑,要求应用程序必须要有界面,必须被用户运行过一次,广播接受者才会生效
        4.0版本的强行停止相当于冻结一个应用,一旦应用程序被用户强行停止了,广播接受者就不会生效了。直到用户手工打开这个应用程序为止。
        4.0版本之前没有这样的安全设计

步骤:

         1、买个收音机
         2、插上电池      
         3、调整到一个频道  

   配置文件:

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

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

   代码:

        package com.itheima.smslistener;

        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        import android.telephony.gsm.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 srcPhone = sms.getOriginatingAddress();
                               
                                System.out.println("content========"+content);
                                System.out.println("srcPhone========"+srcPhone);
                               
                }
        }

        }

       

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

        测试的时使用2.3的模拟器,4.0之后版本没有卸载、挂载、移除SD卡的功能。

步骤:

         1、买个收音机
         2、插上电池
         3、调整到一个频道       


   配置文件:

                 <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这个属性 -->
                        <data android:scheme="file"/>
                    </intent-filter>
            
        </receiver>

代码:

        package com.itheima.sdlistener;

        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        import android.widget.Toast;
       
        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)){
                        Toast.makeText(context, "已经插上了SD卡.................", 0).show();
                }
                if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
                        Toast.makeText(context, "拔掉了SD卡.................", 0).show();
                }
               
                if("android.intent.action.MEDIA_REMOVED".equals(action)){
                        Toast.makeText(context, " 移除了SD卡.................", 0).show();
                }


       
        }
}

       

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

步骤:

         1、买个收音机
         2、插上电池
         3、调整到一个频道       

       
要做的事情:让软件开启后关闭不了:

    禁用返回键和最小化键(小房子键);

* 示例代码
   
配置文件:

         <receiver android:name="com.itheima.lesuo.BootCompletedBroadCastReceiver">
            
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

代码:

        package com.itheima.lesuo;

        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
       
        public class BootCompletedBroadCastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
               
                //开启mainactivity
                Intent i = new Intent(context,MainActivity.class);
                //告诉activity自己来维护任务栈,如果任务栈没有当前任务,就会重新创建一个任务放入任务栈
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               
                context.startActivity(i);
                System.out.println("***********88888888888启动完成*********************************");
                }

        }

       
   
##06_广播接受者案例_卸载安装(重点)
* 示例代码:

    配置文件:
       

                <receiver android:name="com.itheima.azxz.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_ADDED" />
               <!--   必须添加这个属性 -->
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
-


        代码:

        package com.itheima.azxz;

        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        import android.widget.Toast;
       
        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)){
                        Toast.makeText(context, "安装了一个新软件...................", 0).show();
                }
               
                if("android.intent.action.PACKAGE_REMOVED".equals(action)){
                        Toast.makeText(context, "卸载了一个软件...................", 0).show();
                }
               
                if("android.intent.action.PACKAGE_REPLACED".equals(action)){
                        Toast.makeText(context, "重新安装了一个软件...................", 0).show();
                }
               
        }
        }


  
##07_发送自定义广播

    创建广播电台的步骤:

                //创建一个传递消息的意图对象
                Intent intent = new Intent();
               
                //设置要广播的事件类型
                intent.setAction("com.itheima.broadcast.HMSSDT");
               
                //设置广播的消息数据
                intent.putExtra("news", "黑马49期,晚上12点半准时开播.........");
               
                //发送一个广播消息
                sendBroadcast(intent);

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


* 无序广播:

                广播接收者只要注册接收相应的事件类型,就能接收到的广播;

                  //发送一个广播消息(无序广播)
                sendBroadcast(intent);


* 有序广播:

                当广播把消息发送出去后,消息会根据广播接收者的优先级从高到低一级一级地下发消息。
                可以拦截消息,也可以修改消息。

   发送有序广播:

        Intent intent = new Intent();
               
        intent.setAction("com.itheima.orderedbroadcast.ZYFFNTBT");
        //发送一个有序的广播
        //intent 意图
        //permission 指定接收者需要添加了权限
        //resultReceiver 指定哪个广播接收者最后接到消息
        //scheduler 消息处理器
        //initialCode 给消息指定初始代码
        //initialData 指定消息的数据
        //initialExtras 指定额外的参数
        sendOrderedBroadcast(intent, null, null, null, 1, "国务院开始发放2014年农田补贴:900元", null);

   


  广播接收者的配置文件:

         <receiver android:name="com.itheima.zf.ProvinceBroadCastReceiver">
            <intent-filter android:priority="1000" >
                <action  android:name="com.itheima.orderedbroadcast.ZYFFNTBT"/>
            </intent-filter>
        </receiver>


  广播接收者的代码:
       
                String info = getResultData();
                System.out.println("---------我是省级人民政府,已经接收到了中央发的消息:"+info);
               
           //Toast.makeText(context, "我是省级人民政府,已经接收到了中央发的消息:"+info, 0).show();
        setResultData("国务院开始发放2014年农田补贴:400元");

回复 使用道具 举报
感谢楼主分享
看看
回复 使用道具 举报
感谢楼主分享
回复 使用道具 举报
eddddddddddd
回复 使用道具 举报
hhhhhhhhhhhhhhhhhhhhhhhhhhhh
回复 使用道具 举报
O(∩_∩)O谢谢啊啊
回复 使用道具 举报
签到 签到 签到
回复 使用道具 举报
溜溜溜溜
回复 使用道具 举报
haha,dingding
回复 使用道具 举报
不错,学习一下
回复 使用道具 举报
什么鬼,。。。
回复 使用道具 举报
好好学习,天天向上!!!
回复 使用道具 举报
{:2_30:}{:2_30:}
回复 使用道具 举报
好好学习,天天向上
回复 使用道具 举报
我哦看看看看看你看看
回复 使用道具 举报
学学学学  顶顶顶
回复 使用道具 举报
好好学习,天天向上。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马