91亚洲精华国内精华精华液_国产高清在线精品一区不卡_精品特级一级毛片免费观看_欧美日韩中文制服有码_亚洲精品无码你懂的网站369

當系統(tǒng)收到短信時,會發(fā)出一個action名稱為android.provier.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內容,使用名稱 “pdus”即可從Intent中獲取短信內容。

pdus是一個object類型的數(shù)組,每一個object都是一個byte[]字節(jié)數(shù)組,每一項為一條短信。

Object[] pduses= (Object[])intent.getExtras().get("pdus");

       for(Objectpdus: pduses){

           byte[] pdusmessage = (byte[])pdus;

           SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);

           String mobile = sms.getOriginatingAddress();//發(fā)送短信的手機號碼

           String content = sms.getMessageBody(); //短信內容

           Date date = new Date(sms.getTimestampMillis());

           SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

           String time = format.format(date);  //得到發(fā)送時間

          

       }

 

廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發(fā)送是通過調用 Context.sendBroadcast()、Context.sendOrdeedBroadcast()、 context.sendStickyBroadcast()來實現(xiàn)的,通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,這 個特性跟JMS中的Topic消息接收者類似,要實現(xiàn)一個廣播接收者方法如下:

第一步,繼承BroadcastReceiver,并重寫onReceive()方法

public class SMSBroadcastReceiver extends BroadcastReceiver{

    @Override

    public void onReceive(Context context, Intent intent) {

      

    }

}

onReceive的生命周期為10秒,所以里面的操作不能超過10秒

 

第二步,訂閱感興趣的廣播Intent,訂閱方法有兩種:

       第一種:使用代碼進行訂閱

SMSBroadcastReceiver receiver = new SMSBroadcastReceiver();

IntentFilter filter = new IntentFilter();

       filter.addAction("android.provider.Telephony.SMS_RECEIVED");

       context.registerReceiver(receiver,filter);

       第二種:在AndroidManifest.xml文件中的節(jié)點里進行訂閱

".SMSBroadcastReceiver">

          

              "android.provider.Telephony.SMS_RECEIVED"/>

          

      

 

第三步,增加接收短信權限

"android.permission.RECEIVE_SMS">

 

 

 

廣播被分為兩種不同的類型,“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果 傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優(yōu)先級別(聲明在intent-filter元素的 android:priority屬性中,數(shù)據(jù)大優(yōu)先級別越高,取值范圍:-1000到1000也可以調用IntentFilter對象的 setPriority()進行設置),被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C。A得到 廣播后,可以往廣播里存入數(shù)據(jù),當廣播傳給B時,B可以從廣播中得到A存入的數(shù)據(jù)。

 

Context.sendBroadcast()發(fā)送的是普通廣播,所有訂閱者都有機會獲得并進行處理。

Context.sendOrderedBroadcast()發(fā)送的是有序廣播,系統(tǒng)會根據(jù)接收者聲明的優(yōu)先級別按順序逐個執(zhí)行接收者,前面的接收者有 權終止廣播(BroadcastReceiver.abortBroadcast() ),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將處理結果存進廣播Intent,然后傳給下一個接 收者。

sendStickyBroadcast() 意思只要是如果發(fā)送廣播之后才執(zhí)行registerReceiver(BroadcastReceiver,IntentFilter).這個方法依然可 以接受到。換句話說,在ReceiverActivity里是通過代碼來注冊Recevier而不是在Manifest里面注冊的。 sendStickyBroadcast發(fā)出的最后一個Intent會被保留,當下次Recevier處于活躍的時候,又會接受到它。需要加 BROADCAST_STICKY權限,否則會拋SecurityException

 

接收電池電量變化廣播:

"android.intent.action.BATTERY_CHANGED"/>

 

接收開機啟動廣播

"android.intent.action.BOOT_COMPLETED"/>

并在進行權限聲明

 

 

在Android中,程序的響應(Responsive)被活動管理器(Activity Manager)和窗口管理器(Window Manager)這兩個系統(tǒng)服務所監(jiān)視,當BroadcastReceiver在10秒內沒有執(zhí)行完畢,Android會認為該程序無響應,所以在 BroadcastReceiver里不能做一些比較耗時的操作,否則會彈出ANR(Application No Response)的對話框。如果需要完成一項比較耗時的工作,應該通過發(fā)送Intent給Service,由Service來完成,而不是使用子線程的 方法來解決,因為BroadcastReceiver的生命周期很短(在onReceive()執(zhí)行后BroadcastReceiver的實例就會被銷 毀),子線程可能還沒有結束BroadcastReceiver就先結束了。如果BroadcastReceiver結束了,它的宿主進程還在運行,那么 子線程還會繼續(xù)執(zhí)行。但宿主進程此時很容易在系統(tǒng)需要內在時被優(yōu)先殺死。因為它屬于空進程(沒有任何活動組件的進程)。

每次廣播消息到來時,都會創(chuàng)建BroadcastReceiver實例來執(zhí)行onReceive()方法。

 

事例:

 

[java] view plaincopy

  1. package com.king.sms;  

  2.   

  3. import java.text.SimpleDateFormat;  

  4. import java.util.Date;  

  5.   

  6. import android.content.BroadcastReceiver;  

  7. import android.content.Context;  

  8. import android.content.Intent;  

  9. import android.telephony.SmsMessage;  

  10.   

  11.   

  12.   

  13. public class SMSBroadcastReceiver extends BroadcastReceiver{  

  14.   

  15.     @Override  

  16.     public void onReceive(Context context, Intent intent) {  

  17.         Object[] pduses= (Object[])intent.getExtras().get("pdus");  

  18.         for(Object pdus: pduses){  

  19.             byte[] pdusmessage = (byte[])pdus;  

  20.             SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);  

  21.             String mobile = sms.getOriginatingAddress();//發(fā)送短信的手機號碼  

  22.             String content = sms.getMessageBody(); //短信內容  

  23.             Date date = new Date(sms.getTimestampMillis());  

  24.             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

  25.             String time = format.format(date);  //得到發(fā)送時間  

  26.               

  27.         }  

  28.     }  

  29.   

  30. }  


 

//    AndroidManifest.xml

 

 

[java] view plaincopy

  1. "1.0" encoding="utf-8"?>  

  2. "http://schemas.android.com/apk/res/android"  

  3.       package="com.king.sms"  

  4.       android:versionCode="1"  

  5.       android:versionName="1.0">  

  6.     "8" />  

  7.     "color:#ff0000;">"android.permission.RECEIVE_SMS">  

  8.   

  9.     "@drawable/icon" android:label="@string/app_name">  

  10.         ".SMSBroadcastReceiver">  

  11.               

  12.                 "android.provider.Telephony.SMS_RECEIVED"/>  

  13.               

  14.           

  15.   

  16.       

  17.  

 

 

穩(wěn)定

產品高可用性高并發(fā)

貼心

項目群及時溝通

專業(yè)

產品經理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質開發(fā)
  • 返回頂部