編輯:關於Android編程
1、 BroadcastReceiver(廣播接受者)
該組件接受被廣播的intent,Context可以通過sendBroadcast()和sendOrderedBroadcast()方法實現廣播。
public class IncomingSMSReceiver extends BroadcastReceiver{
public void onReceiver(Context context,Intent intent){
}
}
注冊接收者
編程式((意圖action name))
Filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = new IcomingSMSReceiver();
registerReceiver(receiver,filter);
聲明式
<receiver android:name=”.IncomingSMSReceiver”
//要發送者具有該權限
Android:permission=”cn.android.permission.customer”
>
<intent-filter>
<action android:name=”android.provider.Telephony.SMS_RECEIVED”></action>
</intent-filter>
</receiver>
ctx.sendBroadcast(intent,”接受者必須具有的權限串”);
手機收到短信後,android系統會廣播一個意圖(收到短信意圖),由接受者收到。
public class IncomingSMSReceiver extends BroadcastReceiver{
//android.provider.Telephony.Sms.Intents.SMS_RECEIVED_ACTION
String SMS_RECEIVED=”android.provider.Telephony.SMS_RECEIVED”; //action名稱
public void onReceive(Context context,Intent intent){
if(intent.getAction().equals(SMS_RECEIVED)){
SmsManager sms = SmsManager.getDefault();
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[])bundle.get(“pdus”);
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for(SmsMessage message : messages){
String msg = message.getMessageBody();
sms.sendTextMessage(to,null,msg,null,null);
}
}
}
}
}
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
<uses-permission android:name=”android.permission.SEND_SMS”/>
注:android.provider.Telephony.Sms.Intents.getMessageFromIntent(null);
廣播類型
普通廣播(Normal broadcasts)
異步的,同時被很多接受者一同接收到,不能將處理傳給下一個接收者,無法終止廣播。
有序廣播(Ordered broadcasts)
按照接收者的優先級順序接收廣播,優先級別再intent-filter中的priority中聲明,-1000到1000之間,值越大,優先級越高,可以終止廣播意圖的繼續傳播,接收者可以篡改內容。
<intent-filter android:priority=”1”>
<action android:name=”com.android.frameworks..BROADCST_ABORT”/>
context.sendBroadCast(intent);
//指定權限串發送廣播
context.sendBroadCast(intent,permissionStr);
context.sendOrderedBroadCast();
receiver.setResultExtra(bundle);
receiver.getResultExtra(true);
廣播接收者的響應
每次廣播到來時,會重新創建receiver對象,並且調用onReceive()方法,執行完成之後,該對象即被銷毀。當onReceive()方法在10秒內沒有執行完畢,Android會認為該程序無響應,所以在BroadcastReceiver裡不能做一些比較耗時的操作,否則會彈出ANR(Application No Response)的對話框。
如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成,這裡不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束。
BroadcastReceiver就先結束了。BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存是被優先殺死,因為它屬於空進程(沒有任何活動組件的進程)。如果它的宿主進程被殺死,那麼正在工作的子線程也會被殺死,所以采用子線程來解決時不可靠的。
public void onReceive(Context context,Intent intent){
//發送Intent啟動服務,有服務來完成比較耗時的操作
Intent Service = new Intent(content,XxxService.class);
Context.startService(service);
}
<action android:name=”android.intent.action.BATTERY_CHANGED”/>//電量變化
<action android:name=”android.intent.action.BOOT_COMPLETED”/>//啟動完成
<uses-permission www.2cto.com
android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>
本文實例講述了Android開發之自定義控件用法。分享給大家供大家參考,具體如下:今天和大家分享下組合控件的使用。很多時候android自定義控件並不能滿足需求,如何做呢
基本信息Simple2Develop 是一款基於Android平台的跨線程通信框架,可以讓你以一種簡單的方式進行復雜的通信,支持同進程中多Activity之間即時交互,子
AndroidProgressLayout實現為界面添加圓形進度條。調用setprogress()方法顯示和隱藏進度條在Android的開發中,往往有這種需求,比如一個耗
最近剛換了電腦,開始搭建Android開發環境的時候,下載SDK總是會出現如下錯誤:復制代碼 代碼如下:Failed to fetch URL http://dl-ssl