首页 > 代码库 > 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