• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

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

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

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

           for(Objectpdus: pduses){

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

               SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);

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

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

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

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

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

              

           }

     

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

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

    public class SMSBroadcastReceiver extends BroadcastReceiver{

        @Override

        public void onReceive(Context context, Intent intent) {

          

        }

    }

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

     

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

           第一種:使用代碼進(jìn)行訂閱

    SMSBroadcastReceiver receiver = new SMSBroadcastReceiver();

    IntentFilter filter = new IntentFilter();

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

           context.registerReceiver(receiver,filter);

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

    ".SMSBroadcastReceiver">

              

                  "android.provider.Telephony.SMS_RECEIVED"/>

              

          

     

    第三步,增加接收短信權(quán)限

    "android.permission.RECEIVE_SMS">

     

     

     

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

     

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

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

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

     

    接收電池電量變化廣播:

    "android.intent.action.BATTERY_CHANGED"/>

     

    接收開(kāi)機(jī)啟動(dòng)廣播

    "android.intent.action.BOOT_COMPLETED"/>

    并在進(jìn)行權(quán)限聲明

     

     

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

    每次廣播消息到來(lái)時(shí),都會(huì)創(chuàng)建BroadcastReceiver實(shí)例來(lái)執(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ā)送短信的手機(jī)號(hào)碼  

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

    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ā)送時(shí)間  

    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)定

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

    貼心

    項(xiàng)目群及時(shí)溝通

    專業(yè)

    產(chǎn)品經(jīng)理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽(yù)

    堅(jiān)持

    10年專注高端品質(zhì)開(kāi)發(fā)
    • 返回頂部
    国产成人啪精品视频免费网| 人妻少妇精品久久久久久| 91麻豆精品国产自产在线观看一区 | 久久国产精品免费网站| 亚洲中文久久精品无码ww16| 国产三级国产精品国产普男人| 美女免费精品高清毛片在线视| 日韩少妇内射免费播放| 国产精品电影网在线好看| 麻豆精品国产免费观看 | 国产乱人伦偷精品视频免观看| 精品无码中出一区二区| 国产 日韩 中文字幕 制服| 国产在线观看精品香蕉v区| 国产精品久久香蕉免费播放| 精品无码国产AV一区二区三区| 久久国产综合精品SWAG蓝导航 | 日韩不卡视频在线观看| 日韩有码在线视频| 亚洲国产日韩精品| 中文字幕日韩wm二在线看| 国产日韩成人亚洲丁香婷婷| 四虎精品久久久久影院| 日韩三级草久国产| 亚洲日韩激情无码一区| 亚洲日韩AV一区二区三区中文| 亚洲AV无码成人精品区日韩| 日韩高清特级特黄毛片| 人人妻人人做人人爽精品| freesexvideos精品老师毛多| 国产福利精品在线观看| 久久国产香蕉一区精品| 国产在线精品一区二区高清不卡| 中文国产成人精品久久一区| 日韩精品亚洲aⅴ在线影院| 99久久精品国内| 久久精品一区二区| 日韩精品无码免费一区二区三区| 久久久一本精品99久久精品88 | 亚洲日韩国产精品无码av| 日韩电影中文字幕|