首页 > 代码库 > 25、BroadCastRecevier

25、BroadCastRecevier

BroadCastRecevier 有两种注册方式
1. 清单文件里注册: 一旦应用程序被部署到手机, 广播接受者就会生效

2. 代码里面注册: 一旦代码所在的进程被杀死了, 广播接受者就失效了.

 广播接受者分为两种类型:

1. 有序的广播. 短信到来的广播 电话拨打的广播
-1000~1000 设置广播的优先级
android:priority="1000"

从高优先级->低优先级 依次传递
abortbroadcast() 方法 可以终止广播事件。

2. 无序广播.
没有优先级 任何人 注册广播接受者的人,都可以接收到广播.
没有abortboradcast()方法。

sendBroadcast(intent); // 发送一条广播
sendOrderedBroadcast(intent, receiverPermission); // 发送一条有序广播

sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

    scheduler, initialCode, initialData, initialExtras)

如果发送广播的时候 使用的 上面的api发送出去的广播 第三个参数 resultReceiver 指定了广播的接受者

即便是中间我把广播给终止 abortbroadcast()resultReceiver 还是会接受到广播时间。

setResultData(null);   设置广播中的数据为空。

案例:通过广播接受者监听用户的短信

 1 import java.net.HttpURLConnection; 2 import java.net.URL; 3  4 import android.content.BroadcastReceiver; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.telephony.SmsManager; 8 import android.telephony.SmsMessage; 9 10 /**11  * 通过广播接受者监听用户的短信12  * @author dr13  */14 public class SmsReceiver extends BroadcastReceiver {15 16     // 当接受到短信的时候17     // android.provider.Telephony.SMS_RECEIVED18     @Override19     public void onReceive(Context context, Intent intent) {20 21         // 阻塞时间超过10秒 很容易anr 异常22         System.out.println("thread name =" + Thread.currentThread().getName());23 24         // intent 存放的有接收到的短信的内容25         Object[] pdus = (Object[]) intent.getExtras().get("pdus");26         for (Object pdu : pdus) {27 28             SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);29             // 获取短信的正文内容30             final String content = message.getMessageBody();31             // 获取短信的发送者32             final String address = message.getOriginatingAddress();33             System.out.println(content);34             System.out.println(address);35             36             // 把收到短信的系统的广播事件给结束37             if ("15555215556".equals(address)) {38                 abortBroadcast();  // 把收到短信的系统的广播事件给结束39 40                 SmsManager manager = SmsManager.getDefault();41                 manager.sendTextMessage(address, null,42                         "ni qu siba ,wo yijing xihuan le xxx", null, null);43             }44 45             // 因为广播接受者的生命周期非常的端 ,广播接受者所在的进程很有可能会别系统回收46             // 子线程也会被销毁.47             // service48             new Thread() {49 50                 @Override51                 public void run() {52                     String path = "http://192.168.1.247:8080/web/SmsServlet?address="53                             + address + "&content=" + content;54                     try {55                         URL url = new URL(path);56                         HttpURLConnection conn = (HttpURLConnection) url57                                 .openConnection();58                         conn.setRequestMethod("GET");59                         conn.setConnectTimeout(5000);60                         System.out.println(conn.getResponseCode());61                     } catch (Exception e) {62                         // TODO Auto-generated catch block63                         e.printStackTrace();64                     }65                     super.run();66                 }67             }.start();68 69         }70     }71 72 }
 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3     package="cn.itcast.smslistener" 4     android:versionCode="1" 5     android:versionName="1.0" > 6  7     <uses-sdk android:minSdkVersion="8" /> 8  9     <uses-permission android:name="android.permission.RECEIVE_SMS" />10     <uses-permission android:name="android.permission.INTERNET" />11     <uses-permission android:name="android.permission.SEND_SMS" />12 13     <application14         android:icon="@drawable/ic_launcher"15         android:label="@string/app_name" >16         <receiver android:name=".SmsReceiver" >17             <intent-filter android:priority="1000" >18                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />19             </intent-filter>20         </receiver>21     </application>22 23 </manifest>

 

案例:修改号码为ip拨号

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="vertical" > 6     <EditText 7         android:id="@+id/et_ipnumber" 8         android:layout_width="match_parent" 9         android:layout_height="wrap_content" />10     <Button11         android:id="@+id/button1"12         android:layout_width="wrap_content"13         android:layout_height="wrap_content"14         android:onClick="click"15         android:text="设置ip号码" />16 </LinearLayout>
 1 import android.app.Activity; 2 import android.content.Context; 3 import android.content.SharedPreferences; 4 import android.content.SharedPreferences.Editor; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.EditText; 8  9 /**10  * 实现自动ip拨号。比如:添加一个17951后。11  * 然后你在拨打电话的时候,默认在你拨打的电话前面加上17951。12  * 13  * @author dr14  */15 public class IpcallActivity extends Activity {16     @Override17     public void onCreate(Bundle savedInstanceState) {18         super.onCreate(savedInstanceState);19         setContentView(R.layout.main);20     }21 22     public void click(View view) {23         EditText et = (EditText) this.findViewById(R.id.et_ipnumber);24         String ipnumber = et.getText().toString().trim();25         SharedPreferences sp = getSharedPreferences("config",26                 Context.MODE_PRIVATE);27         Editor editor = sp.edit();28         editor.putString("ipnumber", ipnumber);29         editor.commit();30     }31 }
 1 import android.content.BroadcastReceiver; 2 import android.content.Context; 3 import android.content.Intent; 4 import android.content.SharedPreferences; 5  6 public class OutGoingCallReceiver extends BroadcastReceiver { 7  8     @Override 9     public void onReceive(Context context, Intent intent) {10         // getResultData():得到当前拨打的电话号码。11         System.out.println(getResultData());12         // abortBroadcast();13         SharedPreferences sp = context.getSharedPreferences("config",14                 Context.MODE_PRIVATE);15         String ipnumber = sp.getString("ipnumber", "");16         17         // 修改广播中的数据(修改电话号码)。18         setResultData(ipnumber + getResultData());19     }20 21 }
 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3     package="cn.itcast.ipcall" 4     android:versionCode="1" 5     android:versionName="1.0" > 6  7     <uses-sdk android:minSdkVersion="8" /> 8  9     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />10 11     <application12         android:icon="@drawable/ic_launcher"13         android:label="@string/app_name" >14         <activity15             android:name=".IpcallActivity"16             android:label="@string/app_name" >17             <intent-filter>18                 <action android:name="android.intent.action.MAIN" />19                 <category android:name="android.intent.category.LAUNCHER" />20             </intent-filter>21         </activity>22 23         <receiver android:name=".OutGoingCallReceiver" >24             <intent-filter android:priority="1000" >25                 <!-- 广播事件:拦截外拨电话 -->26                 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />27             </intent-filter>28         </receiver>29     </application>30 31 </manifest>

范例:广播接收者的类型

 1 import android.app.Activity; 2 import android.content.BroadcastReceiver; 3 import android.content.Context; 4 import android.content.Intent; 5 import android.content.IntentFilter; 6 import android.os.Bundle; 7 import android.view.View; 8  9 /**10  * 广播接收者的类型11  * @author dr12  */13 public class SmslistenercodeActivity extends Activity {14     @Override15     public void onCreate(Bundle savedInstanceState) {16         super.onCreate(savedInstanceState);17         setContentView(R.layout.main);18     }19 20     public void register(View view) {21         IntentFilter filter = new IntentFilter(22                 "android.provider.Telephony.SMS_RECEIVED");23         SmsReceiver receiver = new SmsReceiver();24         registerReceiver(receiver, filter);25     }26 27     class SmsReceiver extends BroadcastReceiver {28         @Override29         public void onReceive(Context context, Intent intent) {30             System.out.println("接收到了广播");31         }32     }33     34 }
1 <uses-permission android:name="android.permission.RECEIVE_SMS" />

 

25、BroadCastRecevier