码迷,mamicode.com
首页 > 其他好文 > 详细

25、BroadCastRecevier

时间:2014-09-10 22:26:01      阅读:430      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   http   color   io   os   使用   java   

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 dr
13  */
14 public class SmsReceiver extends BroadcastReceiver {
15 
16     // 当接受到短信的时候
17     // android.provider.Telephony.SMS_RECEIVED
18     @Override
19     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             // service
48             new Thread() {
49 
50                 @Override
51                 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) url
57                                 .openConnection();
58                         conn.setRequestMethod("GET");
59                         conn.setConnectTimeout(5000);
60                         System.out.println(conn.getResponseCode());
61                     } catch (Exception e) {
62                         // TODO Auto-generated catch block
63                         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     <application
14         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     <Button
11         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 dr
14  */
15 public class IpcallActivity extends Activity {
16     @Override
17     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     <application
12         android:icon="@drawable/ic_launcher"
13         android:label="@string/app_name" >
14         <activity
15             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 dr
12  */
13 public class SmslistenercodeActivity extends Activity {
14     @Override
15     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         @Override
29         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

标签:android   style   blog   http   color   io   os   使用   java   

原文地址:http://www.cnblogs.com/androidsj/p/3965211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!