博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 学习 笔记_08. 广播机制
阅读量:6980 次
发布时间:2019-06-27

本文共 6822 字,大约阅读时间需要 22 分钟。

1、广播机制

   (1、广播接收者在Android中注册

   (2、当一个事件产生后,它可以发送一个广播信息,然后这些接收者来接收这些信息

   (3、广播接收者的实现一般是写成一个类,该类继承Android提供的类BroadcastReceiver,并且复写该类的onCreate方法,在该方法中实现接收到信息后的处理过程

2、实例

    例1:采用在 Mainifest.xml文件中注册BroadcastReceiver

           首先在发送端Main.java建立一个intent,然后通过它的setAction方法设置接收器的action类型,

           最后在activity中启动broadcast,即sendBroadcast(intent)函数

                          

   TestReceiver.java

1 package zzl.broadcast_01; 2  3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6  7 public class TestReceiver extends BroadcastReceiver{ 8      9     public TestReceiver()10     {11         System.out.println("TestReceiver");12         13     }14     @Override15     public void onReceive(Context arg0, Intent arg1) {16         System.out.println("OnReceiver");17         18     }19 }

    Main.java

1 package zzl.broadcast_01; 2  3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button;10 11 public class Main extends Activity {12 13     private Button insert = null;14     @Override15     protected void onCreate(Bundle savedInstanceState) {16         super.onCreate(savedInstanceState);17         setContentView(R.layout.activity_main);18         19         insert=(Button)findViewById(R.id.insert);20         insert.setOnClickListener(new MyStartOnClickListener());21     }22     public class MyStartOnClickListener implements OnClickListener23     {24 25         public void onClick(View arg0) {26             // TODO Auto-generated method stub27             28             //采用intent发送数据29             Intent intent = new Intent();30             //只发送给action为ACTION_EDIT的对象,对应Manifest中的action31             intent.setAction(Intent.ACTION_EDIT);32             //*通过广播方式发送该intent,只有特定action的接收者才能收到该广播信息*/33             Main.this.sendBroadcast(intent);34         }35     }36     @Override37     public boolean onCreateOptionsMenu(Menu menu) {38         // Inflate the menu; this adds items to the action bar if it is present.39         getMenuInflater().inflate(R.menu.activity_main, menu);40         return true;41     }42 43 }

结果:

   

3、实例1总结

     需要在Android中注册,也就是说在Manifest中,需要在<application/>中有这样的代码:

1        
3
4
5
6

4、实例2

      (1、 BroadcastReceive用于监听被广播的事件(intent),为此它必须进行注册,与例子1中在Manifest.xml当中进行注册的注册方法不同,

例子2将引入第二种方法,在应用程序的代码中进行注册。在例1中,如果应用程序已经关闭,BroadcastReceive都会处于活动状态,都会接收到广播信息。这个就需要各取所需

了。

      (2、如果一个BroadcastReceive用于更新UI,则采用在代码中进行注册:Activity启动时注册,关闭时取消注册。

           【注册】 registerReceiver(receiver ,filter) ; 【取消注册】 unregisterRecevier(receiver);

                        

MainActivity.java

1 package zzl.broadcast_02; 2  3 import android.app.Activity; 4 import android.content.IntentFilter; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button;10 11 public class MainActivity extends Activity {12 13     private Button registe=null;14     private Button unregiste=null;15     private SMSReceiver smsReceiver=null;16     private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";17     @Override18     protected void onCreate(Bundle savedInstanceState) {19         super.onCreate(savedInstanceState);20         setContentView(R.layout.activity_main);21         22         registe=(Button)findViewById(R.id.regiest);23         unregiste=(Button)findViewById(R.id.unregiest);24         25         registe.setOnClickListener(new RegisterRecevierListener());26         unregiste.setOnClickListener(new UnRegisterRecevierListener());27     }28 29     class RegisterRecevierListener implements OnClickListener{30 31         @Override32         public void onClick(View v) {33             // TODO Auto-generated method stub34             /* 1、生成一个BroadcastRecevier对象35              * 2、生成一个intentFilter对象(和Manifest中的Filter)36              * 3、为IntentFilter添加一个Action:SMS_ACTION37              * (只有filter中的action和intent中的action一样)38              * 4、将BroadcastRecevier对象注册到系统当中39              * */40             smsReceiver =new SMSReceiver();41             IntentFilter filter=new IntentFilter();42             filter.addAction(SMS_ACTION);43             MainActivity.this.registerReceiver(smsReceiver,filter);44             System.out.println("promise to receive message");45         }46     }47     class UnRegisterRecevierListener implements OnClickListener{48 49         @Override50         public void onClick(View v) {51             // TODO Auto-generated method stub52             //解除BroadcastRecevier对象注册53             MainActivity.this.unregisterReceiver(smsReceiver);54             System.out.println("unpromise to receive message");55         }56     }57     58     59     @Override60     public boolean onCreateOptionsMenu(Menu menu) {61         // Inflate the menu; this adds items to the action bar if it is present.62         getMenuInflater().inflate(R.menu.activity_main, menu);63         return true;64     }65 66 }

SMSReceiver.java

1 package zzl.broadcast_02; 2  3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.telephony.SmsMessage; 8  9 10 public class SMSReceiver extends BroadcastReceiver{11 12     @Override13     public void onReceive(Context context, Intent intent) {14         // TODO Auto-generated method stub15         System.out.println("receive message");16         17         //通过intent获得bundle对象中的数据18         Bundle bundle = intent.getExtras();19         //在bundle对象中有个名为“pdus”的属性,这个属性的值是object数组20         Object[] myOBJpdus = (Object[])bundle.get("pdus");21         //新建一个SmsMessage数组:用于存储消息内容的22         SmsMessage[] messages = new SmsMessage[myOBJpdus.length];23         System.out.println(messages.length);24         for(int i = 0; i < messages.length; i++)25         {26             //使用object数组当中的对象创建SmsMessage对象:27             messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);28             //调用SmsMessage对象的getDisplayMessageBody()方法,就可以得到消息的内容29             System.out.println(messages[i].getDisplayMessageBody());30         }31     }32 }

结果:

                            

 5、实例2总结

     (1、 设置的action过滤为"android.provider.Telephony.SMS_RECEIVED",即只有具备该action的广播接收器才能给接收到短信。

     (2、 发送短信采用的是DDMS来模拟的,即该短信的发送是由另外的程序执行的。

           DDMS发送出来的短信息是通过intent发送的,intent里面就自带了名为"android.provider.Telephony.SMS_RECEIVED"的action。

               

     (3、要使自己写的android程序能够收到短信息来临的广播,则不管是在应用程序中注册broadcastReceiver还是在Manifest.xml中注册,

          在manifest.xml文件中必须添加一句代码:

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

          并且该代码是和application平级的,也就是说是manifest的直接子标签.如果没有改句,即使程序中注册过广播接收,同样也收不到短信的。

         一开始没有意识到这个问题,导致程序在测试过程中,出现了bug,百度过后才找到原因,以此为戒。

转载于:https://www.cnblogs.com/daomul/archive/2013/03/03/2935960.html

你可能感兴趣的文章
认识HTML5的WebSocket 认识HTML5的WebSocket
查看>>
openresty 前端开发入门五之Mysql篇
查看>>
eclipse设置
查看>>
Oracle数据库文件坏块损坏的恢复方法
查看>>
用户登录
查看>>
【Python 第8课】while
查看>>
Mysql INSERT、REPLACE、UPDATE的区别
查看>>
checkbox点击切换选中状态
查看>>
DIY强大的虚拟化环境-技术可行性部分
查看>>
你不得不知道的Visual Studio 2012(1)- 每日必用功能
查看>>
python3的数据类型以及模块的含义
查看>>
vstpd服务
查看>>
跟阿里云技术专家阙寒一起深度了解视频直播CDN技术
查看>>
SQL SERVER中ROLLUP的用法
查看>>
配置DCOM中excel权限
查看>>
WEB SSH Ajaxterm客户端配置(1)
查看>>
FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
查看>>
ondblog 修改informix日志模式
查看>>
ipvsadm命令参考
查看>>
网站排名下降的原因
查看>>