Android_BroadcastReceiver广播接收者详解及应用

来源:互联网 发布:如何查淘宝搜索热度 编辑:程序博客网 时间:2024/06/06 07:07

1.概述

广播接收者(BroadcastReceiver)用于接收广播,在Android系统中,广播应用非常常见。例如当开机完成后系统会产生一条action为android.intent.action.BOOT_COMPLETED的广播,可达到开机启动的目的;当手机接收到一条短信,系统会产生一条action为android.provider.Telephony.SMS_RECEIVED的广播,接收到这条广播就对短信进行处理 等等。

动态广播接收器比静态广播接收器要接受的早,可以尝试在AndroidManifest.xml静态和java代码动态注册广播接收者~~降低被杀死的概率

2.简单实现广播接收者

[java] view plaincopy
  1. //1.继承BroadcastReceiver,覆写onReceive方法,intent包含广播对象信息  
  2. public class SmsReceiver extends BroadcastReceiver {  
  3.   
  4.     @Override  
  5.     public void onReceive(Context context, Intent intent) {  
  6.         /* 
  7.          *  简要动作,一般不超过10秒 
  8.          *  ...To Do.. 
  9.          */  
  10.     }  
  11. }  
[html] view plaincopy
  1. <!-- 2.在项目清单文件完接收者成配置 -->  
  2. <!-- 系统发送一个广播,action为下面指定内容后,匹配该receiver -->  
  3. <receiver android:name=".SmsReceiver" >  
  4.     <intent-filter>  
  5.         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  6.     </intent-filter>  
  7. </receiver>  

3.广播类型

(1).普通广播

[java] view plaincopy
  1. //发送一个广播,所以监听该广播的广播接收者都可以监听到改广播  
  2. public void click(View view){  
  3.     Intent intent = new Intent(this, SmsReceiver.class);  
  4.     sendBroadcast(intent);  
  5. }  

(2).异步广播

[java] view plaincopy
  1. /* 
  2.  * 在onCreate()使用registerReceiver(BroadcastReceiver, IntentFilter)注册,但要注意在onDestroy()要解除注册 
  3.  */  
  4.   
  5. //  1.在onCreate注册receiver  
  6. @Override  
  7. protected void onCreate(Bundle savedInstanceState) {  
  8.     super.onCreate(savedInstanceState);  
  9.     setContentView(R.layout.activity_main);  
  10.     IntentFilter filter = new IntentFilter();  
  11.     filter.addAction("baidu.myreceiver");  
  12.     registerReceiver(receiver, filter);  
  13.       
  14. }  
  15. //  2.在onDestroy要解除注册receiver  
  16. @Override  
  17. protected void onDestroy() {  
  18.     unregisterReceiver(receiver);  
  19.     super.onDestroy();  
  20. }  

(3).有序广播

[java] view plaincopy
  1. /* 
  2.  * 按照接收者的优先级顺序接收广播,取值范围为1000到-1000,值越大,优先级越高,安卓系统关键接收者默认为0, 
  3.  * 优先级可以在xml文件的intent-filter标签中的 priority 中声明。 
  4.  */  
  5. public class MainActivity extends Activity {  
  6.     public void click(View view){  
  7.         Intent intent = new Intent();  
  8.         intent.setAction("com.baidu.smsreceiver");  
  9.         //1.1.发送一个有序广播  
  10.         sendOrderedBroadcast(intent, receiverPermission);  
  11.         //1.2.发送一条有序广播,为该广播添加一些属性,resultReceiver为最终执行的接收者,即使abortBroadcast();也要执行  
  12.         sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)  
  13.     }  
  14. }  
  15. public class SmsReceiver extends BroadcastReceiver {  
  16.   
  17.     @Override  
  18.     public void onReceive(Context context, Intent intent) {  
  19.         Object[] objs = (Object[]) intent.getExtras().get("pdus");  
  20.         for(Object obj: objs){  
  21.             SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);  
  22.             String content = smsMessage.getMessageBody();  
  23.             String number = smsMessage.getOriginatingAddress();  
  24.         }  
  25.         abortBroadcast();//终止向下一个接收者传递  
  26.     }  
  27. }  
有序广播可以终止,无序的广播不可以终止!

4.注册广播

(1).静态注册

[html] view plaincopy
  1. <!-- 在项目清单文件中注册 -->  
  2. <receiver android:name=".SmsReceiver" >  
  3.     <intent-filter>  
  4.         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  5.     </intent-filter>  
  6. </receiver>  

(2).动态注册

查看上面的一步广播,注意:注册之后,在当前activity销毁时在onDestroy()中解除注册

使用动态注册的生命周期与应用相关,而静态注册则周期更长,即使应用没有被启动,在监听到需要接收的广播时,也可以接收!

5.自定义permission

[java] view plaincopy
  1. //  1.sendBroadcast一个广播并接收一个使用权限  
  2. public class MainActivity extends Activity {  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.           
  8.     }  
  9.     public void click(View view){  
  10.         Toast.makeText(this"Ok~!!~"1).show();  
  11.         Intent intent = new Intent();  
  12.         intent.setAction("com.baidu.smsreceiver");  
  13.         sendBroadcast(intent, "baidu.permission");  //为该广播添加一个权限,但需要在该项目的项目清单文件中定义及添加权限  
  14.     }  
  15. }  
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.baidu.smstest"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="17" />  
  10. <!-- 2.在本应用中定义一个permission -->  
  11.     <!-- 出示该permission -->  
  12.     <permission android:name="baidu.permission" android:protectionLevel="dangerous"/>  
  13.     <!-- 使用该permission -->  
  14.     <uses-permission android:name="baidu.permission"/>  
  15.     <application  
  16.         android:allowBackup="true"  
  17.         android:icon="@drawable/ic_launcher"  
  18.         android:label="@string/app_name"  
  19.         android:theme="@style/AppTheme" >  
  20.     </application>  
  21.   
  22. </manifest>  
[java] view plaincopy
  1. //  3.接收者继承BroadcastReceiver,覆写onReceive方法  
  2. public class SmsReceiver extends BroadcastReceiver {  
  3.   
  4.     @Override  
  5.     public void onReceive(Context context, Intent intent) {  
  6.         // ...  
  7.     }  
  8. }  
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.testreceiver"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="17" />  
  10. <!-- 4.接收者项目清单文件定义以出示该权限 -->  
  11.     <permission android:name="baidu.permission" android:protectionLevel="dangerous"/>  
  12.     <uses-permission android:name="baidu.permission"/>  
  13.     <application  
  14.         android:allowBackup="true"  
  15.         android:icon="@drawable/ic_launcher"  
  16.         android:label="@string/app_name"  
  17.         android:theme="@style/AppTheme" >  
  18.         <!-- permission属性和指定级别 -->  
  19.         <receiver android:name=".TextReceiver" android:permission="baidu.permission">  
  20.             <intent-filter android:priority="800">  
  21.                 <action android:name="com.baidu.smsreceiver"/>  
  22.             </intent-filter>  
  23.         </receiver>  
  24.     </application>  
  25.   
  26. </manifest>  

6.应用

(1).短信窃听器

[java] view plaincopy
  1. /* 
  2. * 1.继承BroadcastReceiver,覆写onReceive方法 
  3. */  
  4. public class SmsReceiver extends BroadcastReceiver {  
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         //  1.1接收到短信信息,get("pdus"),可能包含多条短信信息,故用数组表示  
  8.         Object[] objs = (Object[]) intent.getExtras().get("pdus");  
  9.         for(Object obj: objs){  
  10.         //  1.2转换为每条短信的byte[] 得到smsMessage对象  
  11.             SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);  
  12.         //  1.3对短信操作,获得关键数据  
  13.             String content = smsMessage.getMessageBody();       //短信内容  
  14.             String number = smsMessage.getOriginatingAddress(); //短信号码  
  15.             if("110".equals(number)){  
  16.                 abortBroadcast();                               //终止广播向下传递  
  17.                 SmsManager manager = SmsManager.getDefault();   //得到Sms短信管理器  
  18.                 //转发一条短信,需要声明权限  
  19.                 manager.sendTextMessage("5556"null"Kill"nullnull);  
  20.             }  
  21.             System.out.println("content="+content);  
  22.             System.out.println("number="+number);  
  23.         }  
  24.         Toast.makeText(context, "OK!", Toast.LENGTH_SHORT).show();  
  25.     }  
  26. }  
[html] view plaincopy
  1. <!-- 2.在项目清单文件中配置接收者, 及出示可能需要的权限 -->  
  2. <!-- 接收短信权限 -->  
  3. <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
  4. <!-- 发送短信权限 -->  
  5. <uses-permission android:name="android.permission.SEND_SMS"/>  
  6. <application  
  7.     android:allowBackup="true"  
  8.     android:icon="@drawable/ic_launcher"  
  9.     android:label="@string/app_name"  
  10.     android:theme="@style/AppTheme" >  
  11.       
  12.     <!-- 广播接收者声明 -->  
  13.     <receiver android:name=".SmsReceiver" >  
  14.         <intent-filter>  
  15.             <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  16.         </intent-filter>  
  17.     </receiver>  
  18. </application>  

(2).电话拨打器

[java] view plaincopy
  1. public class TextReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         //得到拨打电话号码  
  5.         String number = getResultData();  
  6.         //处理拨打的电话号码  
  7.         setResultData("010"+number);  
  8.         System.out.println(number);  
  9.     }  
  10.   
  11. }  
[html] view plaincopy
  1. <!-- 出示处理外来电话的权限 -->  
  2. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>  
  3. <application  
  4.     android:allowBackup="true"  
  5.     android:icon="@drawable/ic_launcher"  
  6.     android:label="@string/app_name"  
  7.     android:theme="@style/AppTheme" >  
  8.     <receiver android:name=".TextReceiver">  
  9.         <intent-filter android:priority="800">  
  10.             <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>  
  11.         </intent-filter>  
  12.     </receiver>  
  13. </application> 

0 0
原创粉丝点击