【Android】BroadCast广播机制应用与实例

2017-03-23 23:57:38

如何编写广播接收器

第一步:需要继承BroadcastReceiver类,覆写其中的onReceive()方法. 

[java] view plain copy

  1. class MyBroadcastReceiver extends BroadcastReceiver {  

  2.      //接收到广播会被自动调用    

  3.     @Override  

  4.     public void onReceive (Context context, Intent intent) {  

  5.         //从Intent中获取action  

  6.         …your code here…  

  7.     }  

  8. }  

第二步:定义好广播接收器还不行,必须向系统注册以便让其知道该接收器可以处理哪些广播事件。

常见方式是采用静态注册,修改MENIFEST.xml文件, 在<application></application>中加入receiver标签.

[html] view plain copy

  1. <application>  

  2.     <activity name=""/>  

  3.     <receiver android:name=".MyBroadcastReceiver">  

  4.         <!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action 可以是自定义的也可是系统的 -->   

  5.         <intent-filter>  

  6.             <action android:name="com.app.bc.test"/>  

  7.         </intent-filter>  

  8.     </receiver>  

  9. </application>  

第三步:此时我们可以发送一个广播事件出去,代码如下:

[java] view plain copy

  1. Intent intent = new Intent(“com.app.bc.test”);  

  2. sendBroadcast(intent);//发送广播事件  


动态注册广播接收器

在某个Activity中,我们可以用代码来实现动态注册:

[java] view plain copy

  1. //生成一个BroadcastReceiver对象  

  2. SMSReceiver  smsReceiver = new SMSReceiver();  

  3. //生成一个IntentFilter对象  

  4. IntentFilter filter = new IntentFilter();         

  5. filter.addAction(“android.provider.Telephony.SMS_RECEIVED”);  

  6. //将BroadcastReceiver对象注册到系统当中  

  7. //此处表示该接收器会处理短信事件  

  8. TestBC1Activity.this.registerReceiver(smsReceiver, filter);   


静态注册和动态注册的区别

1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。

操作小结

静态注册的步骤:

定义广播接收器,继承BroadcastReceiver类,覆写onReceive函数.
在xml文件中注册监听器,定义Intent-Filter中感兴趣的action操作.
使用sendBroadCast向系统发送对其感兴趣的广播接收器中.

动态注册的步骤:

[java] view plain copy

  1. SMSReceiver  smsReceiver = new SMSReceiver();  

  2. IntentFilter filter = new IntentFilter();         

  3. filter.addAction(“android.provider.Telephony.SMS_RECEIVED”);  

  4. TestBC1Activity.this.registerReceiver(smsReceiver, filter);   

(无需在配置文件中注册接收器)

应用实例

[java] view plain copy

  1. package com.app.test02;  

  2.   

  3. import android.app.Activity;  

  4. import android.content.Intent;  

  5. import android.content.IntentFilter;  

  6. import android.os.Bundle;  

  7. import android.view.View;  

  8. import android.view.View.OnClickListener;  

  9.   

  10. public class BroadCastActivity1 extends Activity{  

  11.     Intent intent = new Intent();  

  12.     BroadCastTest1 bCastTest1 = new BroadCastTest1();  

  13. //  BroadCastTest11 bCastTest11 = new BroadCastTest11();  

  14. //  BroadCastTest111 bCastTest111 = new BroadCastTest111();  

  15.     @Override  

  16.     protected void onCreate(Bundle savedInstanceState) {  

  17.         // TODO Auto-generated method stub  

  18.         super.onCreate(savedInstanceState);  

  19.           

  20.         setContentView(R.layout.activity_bc1);  

  21.         //静态注册  

  22.         findViewById(R.id.button1).setOnClickListener(new OnClickListener() {  

  23.             @Override  

  24.             public void onClick(View v) {  

  25.                 // TODO Auto-generated method stub  

  26.                 intent.setAction("bc.test101");  

  27.                 intent.putExtra("name""静态的");  

  28.                 sendBroadcast(intent);  

  29. //              sendOrderedBroadcast(intent, null);  

  30.             }  

  31.         });  

  32.         //动态注册  

  33.         findViewById(R.id.button2).setOnClickListener(new OnClickListener() {  

  34.             @Override  

  35.             public void onClick(View v) {  

  36.                 // TODO Auto-generated method stub  

  37.                   

  38.                 IntentFilter intentFilter = new IntentFilter();  

  39.  &nb

  • 2018-11-17 21:05:48

    Android ANR发生的原因总结和解决办法

    ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

  • 2018-11-17 21:08:09

    Android 单个应用的内存限制

    获取Android手机应用内存大小 手机不同其性能也不同,手机本身内存可能有大有小,所以针对每个应用的内存大小也不相同。

  • 2018-11-17 21:11:14

    Android中App可分配内存的大小

     结果:(1)未设定属性android:largeheap = "true"时,可以申请到的最大内存空间为221M。      (2)设定属性android:largeheap = "true"时, 可以申请的最大内存空间为478M,是原来的两倍多一些。

  • 2018-11-17 22:44:53

    LeakCanary,30分钟从入门到精通

    在性能优化中,内存是一个不得不聊的话题;然而内存泄漏,显示已经成为内存优化的一个重量级的方向。当前流行的内存泄漏分析工具中,不得不提的就是LeakCanary框架;这是一个集成方便, 使用便捷,配置超级简单的框架,实现的功能却是极为强大的。

  • 2018-11-17 22:53:01

    gc for alloc freed

    在数组中选择图片然后显示,然后。。。logcat不断显示GC回收。最后程序黑屏。

  • 2018-11-17 23:25:38

    Android高效内存1:一张图片占用多少内存

    在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。另外本文知识点也是面试官喜欢问的一个点,看看自己的回答到什么级别了。

  • 2018-11-18 09:06:06

    Android子线程中更新UI的3种方法

    UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理。