android broadcastReceiver學習html
在實際應用中,咱們常須要等,等待系統抑或其餘應用發出一道指令,爲本身的應用擦亮明燈指明方向。在Android中,充分考慮了普遍的這類需求,因而就有了Broadcast Receiver這樣的一個組件。每一個Broadcast Receiver均可以接收一種或若干種Intent做爲觸發事件(有不知道Intent的麼,後面會知道了...),當發生這樣事件的時候,系統會負責喚醒或傳遞消息到該Broadcast Receiver,任其處置。在此以前和這之後,Broadcast Receiver是否在運行都變得不重要了,及其綠色環保。java
這個實現機制,顯然是基於一種註冊方式的,Broadcast Receiver的相關信息寫在配置文件中,系統會負責在相關事件發生的時候及時通知到該Broadcast Receiver,這種模式適合於這樣的場景。某事件方式 -> 通知Broadcast -> 啓動相關處理應用。好比,監聽來電、郵件、短信之類的,都隸屬於這種模式。還有一種一般是在 OnResume事件中經過registerReceiver進行註冊,在OnPause等事件中反註冊,經過這種方式使其可以在運行期間保持對相關事件的關注。好比,一款優秀的詞典軟件(好比,有道詞典...),可能會有在運行期間關注網絡情況變化的需求,使其能夠在有廉價網絡的時候優先使用網絡查詢詞彙,在其餘狀況下,首先經過本地詞庫來查詞,從而兼顧腰包和體驗,一箭雙鵰一石二鳥一舉兩得。而這樣的監聽,只須要在其工做狀態下保持就好,不運行的時候,管你是天大的網路變化,與我何干。其模式能夠歸結爲:啓動應用 -> 監聽事件 -> 發生時進行處理。android
除了接受消息的一方有多種模式,發送者也有很重要的選擇權。一般,發送這有兩類,一個就是系統自己,咱們稱之爲系統Broadcast消息,在reference/android/content/Intent.html 的Standard Broadcast Actions,能夠求到相關消息的詳情。除了系統,自定義的應用能夠放出Broadcast消息,經過的接口能夠是 Context.sendBroadcast,抑或是Context.sendOrderedBroadcast。前者發出的稱爲Normal broadcast,全部關注該消息的Receiver,都有機會得到並進行處理;後者放出的稱做Ordered broadcasts,顧名思義,接受者須要按資排輩,排在後面的只能吃前面吃剩下的,前面的心情很差私吞了,後面的只能喝西北風了。
數組
當Broadcast Receiver接收到相關的消息,它們一般作一些簡單的處理,而後轉化稱爲一條Notification,一次振鈴,一次震動,抑或是啓動一個 Activity進行進一步的交互和處理。因此,雖然Broadcast整個邏輯不復雜,倒是足夠有用和好用,它統一了Android的事件廣播模型,讓不少平臺都相形見絀了。網絡
package irdc.EX06_05; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView;[/color][/font] public class EX06_05 extends Activity { /*聲明一個TextView,String數組與兩個文本字符串變量*/ private TextView mTextView1; public String[] strEmailReciver; public String strEmailSubject; public String strEmailBody; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*經過findViewById構造器建立TextView對象*/ mTextView1 = (TextView) findViewById(R.id.myTextView1); mTextView1.setText("等待接收短信..."); try { /*取得短信傳來的bundle*/ Bundle bunde = this.getIntent().getExtras(); if (bunde!= null) { /*將bunde內的字符串取出*/ String sb = bunde.getString("STR_INPUT"); /*自定義一Intent來運行寄送E-mail的工做*/ Intent mEmailIntent = new Intent(android.content.Intent.ACTION_SEND); /*設置郵件格式爲"plain/text"*/ mEmailIntent.setType("plain/text"); /* * 取得EditText01,02,03,04的值做爲 * 收件人地址,附件,主題,正文 */ strEmailReciver =new String[]{"[url=mailto:jay.mingchieh@gmail.com]jay.mingchieh@gmail.com[/url"}; strEmailSubject = "你有一封短信!!"; strEmailBody = sb.toString(); /*將取得的字符串放入mEmailIntent中*/ mEmailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, strEmailReciver); mEmailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, strEmailSubject); mEmailIntent.putExtra(android.content.Intent.EXTRA_TEXT, strEmailBody); startActivity(Intent.createChooser(mEmailIntent, getResources().getString(R.string.str_message))); } else { finish(); } } catch(Exception e) { e.printStackTrace(); } } }[/color][/font] package irdc.EX06_05; /*引用BroadcastReceiver類*/ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; /*引用telephoney.gsm.SmsMessage來收取短信*/ import android.telephony.gsm.SmsMessage; /*引用Toast類來告知用戶收到短信*/ import android.widget.Toast;[/color][/font] /*自定義繼承自BroadcastReceiver類,聆聽系統服務廣播的信息 */ public class EX06_05SMSreceiver extends BroadcastReceiver { /* * 聲明靜態字符串,並使用 * android.provider.Telephony.SMS_RECEIVED * 做爲Action爲短信的依據 */ private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED"; private String str_receive="收到短信!"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(context, str_receive.toString(), Toast.LENGTH_LONG).show(); /*判斷傳來Intent是否爲短信*/ if (intent.getAction().equals(mACTION)) { /*建構一字符串集合變量sb*/ StringBuilder sb = new StringBuilder(); /*接收由Intent傳來的數據*/ Bundle bundle = intent.getExtras(); /*判斷Intent是有數據*/ if (bundle != null) { /* pdus爲 android內置短信參數 identifier * 經過bundle.get("")返回一包含pdus的對象*/ Object[] myOBJpdus = (Object[]) bundle.get("pdus"); /*構造短信對象array,並依據收到的對象長度來建立array的大小*/ SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; for (int i = 0; i<myOBJpdus.length; i++) { messages[i] =SmsMessage.createFromPdu((byte[]) myOBJpdus[i]); } /* 將送來的短信合併自定義信息於StringBuilder當中 */ for (SmsMessage currentMessage : messages) { sb.append("接收到來自:\n"); /* 收信人的電話號碼 */ sb.append(currentMessage.getDisplayOriginatingAddress()); sb.append("\n------傳來的短信------\n"); /* 取得傳來信息的BODY */ sb.append(currentMessage.getDisplayMessageBody()); Toast.makeText ( context, sb.toString(), Toast.LENGTH_LONG ).show(); } } /* 以Notification(Toase)顯示來訊信息 */ Toast.makeText ( context, sb.toString(), Toast.LENGTH_LONG ).show(); /* 返回主Activity */ Intent i = new Intent(context, EX06_05.class); /*自定義一Bundle*/ Bundle mbundle = new Bundle(); /*將短信信息以putString()方法存入自定義的bundle內*/ mbundle.putString("STR_INPUT", sb.toString()); /*將自定義bundle寫入Intent中*/ i.putExtras(mbundle); /*設置Intent的Flag以一個全新的task來運行*/ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } } <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a> package="irdc.EX06_05" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".EX06_05" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 創建receiver聆聽系統廣播訊息 --> <receiver android:name="EX06_05SMSreceiver"> <!-- 設定要捕捉的訊息名稱為provider中Telephony.SMS_RECEIVED --> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest>