标签: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" />
标签:android style blog http color io os 使用 java
原文地址:http://www.cnblogs.com/androidsj/p/3965211.html