• <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ā)
    • 返回頂部
    日韩美女在线观看一区| 国模精品视频一区二区三区| 久久久久久国产精品美女| 亚洲日韩精品无码专区加勒比☆| 老色鬼永久精品网站| 亚洲中文字幕久久精品无码VA | 国产精品jlzz视频| 精品久久久久久久久亚洲偷窥女厕 | 亚洲&#228;v永久无码精品天堂久久 | 久9这里精品免费视频| 国内精品91最新在线观看| 国产香蕉国产精品偷在线| 久久久精品人妻无码专区不卡 | 青青青国产依人精品视频 | 国产精品第44页| 精品伊人久久大线蕉地址| 天堂精品高清1区2区3区| 成人h动漫精品一区二区无码| 最新国产精品剧情在线SS| 国产精品青青在线麻豆| 一级一级特黄女人精品毛片视频| 久久久精品久久久久三级| 亚洲依依成人精品| 久久精品亚洲AV久久久无码| 亚洲国产成人精品青青草原| 91久久精品视频| 国产精品久久久久久久久免费| 久久精品卫校国产小美女| 四虎精品视频在线永久免费观看| 激情亚洲一区国产精品| 国美女福利视频午夜精品| 无码精品A∨在线观看十八禁| 国产精品一区二区久久精品涩爱| 日韩精品无码区免费专区 | 日韩色日韩视频亚洲网站 | 精品蜜臀久久久久99网站| 国产a视频精品免费观看| 国产成人yy精品1024在线| 国产香蕉久久精品综合网| 国产精品免费观看久久| 揄拍成人国产精品视频|