亚洲乱码卡一卡二卡三永久-亚洲乱码一二三四区-亚洲乱码一区二区三区在线观看-亚洲伦理一区-成人在色线视频在线观看免费大全-成人在线91

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

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(); //短信內(nèi)容

           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ā)送是通過調(diào)用 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"/>

          

      

 

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

"android.permission.RECEIVE_SMS">

 

 

 

廣播被分為兩種不同的類型,“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結(jié)果 傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優(yōu)先級別(聲明在intent-filter元素的 android:priority屬性中,數(shù)據(jù)大優(yōu)先級別越高,取值范圍:-1000到1000也可以調(diào)用IntentFilter對象的 setPriority()進行設(shè)置),被接收者依次接收廣播。如: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í)行接收者,前面的接收者有 權(quán)終止廣播(BroadcastReceiver.abortBroadcast() ),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將處理結(jié)果存進廣播Intent,然后傳給下一個接 收者。

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

 

接收電池電量變化廣播:

"android.intent.action.BATTERY_CHANGED"/>

 

接收開機啟動廣播

"android.intent.action.BOOT_COMPLETED"/>

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

 

 

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

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

貼心

項目群及時溝通

專業(yè)

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

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部
主站蜘蛛池模板: 国产在线精品一区二区三区 | 在线色片 | 国产aa大片| 韩国伦理片在线免费观看 | 在线看福利片 | 亚洲免费人成在线视频观看 | 久久久国产精品免费 | 黄色大片免费看 | 国产一级特黄毛片 | 亚洲成a人片在线观看导航 亚洲成a人片在线观看精品 | 成人永久免费福利视频网站 | 欧美性精品hd在线观看 | 中文在线亚洲 | 国产区亚洲区 | 精品一区二区三区视频在线观看 | 99久久精品毛片免费播放 | 综合国产在线 | 色库一区导航 | 91免视频| 日本一区二区三区免费在线观看 | 日本国产最新一区二区三区 | 香蕉茄子视频 | 99精品网| 午夜小视频网站 | 在线观看91精品国产入口 | 免费视频日韩 | 色在线播放 | 亚洲国产成人久久午夜 | 国产视频综合 | 在线播放国产一区二区三区 | 久久天天躁狠狠躁夜夜中文字幕 | 丁香六月婷婷综合 | 91欧美秘密入口 | 一区二区国产在线观看 | 国产高清不卡视频在线播放 | 妞干网中文字幕 | 波多野结衣一区二区三区88 | 高清国语自产拍免费视频国产 | 成人午夜私人影院入口 | 午夜精品福利视频 | 日韩一级欧美一级在线观看 |