Android學(xué)習(xí)筆記(六)

短信技術(shù):
短信數(shù)據(jù)庫(kù)存在于/data/data/com.android.providers.telephoney目錄下樊卓;
相關(guān)的表:
sms:_id(信息id) thread_id(會(huì)話(huà)id) address(地址) body(內(nèi)容) date(日期) type(1為收件箱信息,2為發(fā)件箱信息奈应,3為草稿箱)
★常用相關(guān)的uri(沒(méi)有API捏肢,須手動(dòng)輸入以下uri)
content://sms
content://sms/inbox 用于插入
content://sms/sent 用于發(fā)送信息表
content://sms/draft 用于草稿表
content://sms/conversations 用于會(huì)話(huà)表
★相關(guān)的使用權(quán)限:
android.permission.READ_SMS
android.permission.WRITE_SMS
★使用content://sms/conversations 查詢(xún)會(huì)話(huà)時(shí)使用的列名(google官方使用):
groups.group_thread_id 該會(huì)話(huà)Id
groups.group_date 該會(huì)話(huà)最后一條信息時(shí)間
groups.msg_count 該會(huì)話(huà)信息總數(shù)
sms.address 該會(huì)話(huà)發(fā)送的地址
sms.body 該會(huì)話(huà)最后一條信息的內(nèi)容

▲發(fā)送短信:

 SmsManager manager = SmsManager.getDefault();//獲取短信管理器實(shí)例伤疙;

manager.sendTextMessage(destinationAddress, scAddress, text, 
   sentIntent, deliveryIntent); //參數(shù)別為要發(fā)送的號(hào)碼唬渗;中心號(hào)碼钞螟,手機(jī)設(shè)置好了可置為null,
//text為要發(fā)送的文本;sentIntent為發(fā)送后要做的處理绸狐;deliveryIntent為送達(dá)后要做的處理卤恳。

▲其他方法:

ArrayList<String> parts = manager.divideMessage(content);
   //若短信過(guò)長(zhǎng)累盗,自動(dòng)拆分成幾部分寒矿;拆分后可直接發(fā)送:
manager.sendMultipartTextMessage(number, null, parts, null, null);

但當(dāng)發(fā)送完成后需要手動(dòng)將發(fā)送的信息寫(xiě)入到數(shù)據(jù)庫(kù):故用遍歷逐條發(fā)送,成功發(fā)送后再發(fā)送一條廣播若债,在接收到廣播后插入到數(shù)據(jù)庫(kù)符相;

 PendingIntent sentIntent = PendingIntent.getBroadcast(this, code,intent,
 PendingIntent.FLAG_UPDATE_CURRENT);

★§注意://PendingInent的對(duì)象是在內(nèi)存中的對(duì)象池中獲取的蠢琳,第二個(gè)參數(shù)code即為每個(gè)對(duì)象的code標(biāo)記啊终;若設(shè)為不同,則可每次都從對(duì)象池中獲取一個(gè)新的實(shí)例傲须,但效率不高。一般設(shè)置最后一個(gè)參數(shù)falg泰讽,有四種不同的值例衍,一般采用PendingIntent.FLAG_UPDATE_CURRENT昔期,意思為每次從對(duì)象池中取出一個(gè)對(duì)象,但將對(duì)象的數(shù)據(jù)做更新佛玄。這種方法效率較高硼一,其他三種參數(shù)效率較低,適作他用梦抢。

○加載發(fā)送完成后的意圖:manager.sendTextMessage(number, null, text, sentIntent, null);
○在廣播接收器的onRecive(..)方法中:對(duì)短信是否成功發(fā)送作判斷般贼,可直接判斷結(jié)果碼:

if (RESULT_OK == code) {//將號(hào)碼和信息內(nèi)容、當(dāng)前時(shí)間寫(xiě)入到數(shù)據(jù)庫(kù)中奥吩,并清空輸入框}

★№[發(fā)送信息需要權(quán)限; android:name="android.permission.SEND_SMS”]

▲接收短信:
當(dāng)系統(tǒng)收到短信時(shí)會(huì)發(fā)送一個(gè)廣播:
android.provider.Telephony.SMS_RECEIVED;這是一個(gè)有序廣播哼蛆,可進(jìn)行攔截。
●PDU(協(xié)議數(shù)據(jù)單元)
☆[pdu:是指對(duì)等層次之間傳遞的數(shù)據(jù)單位圈驼;在分層網(wǎng)絡(luò)結(jié)構(gòu)中人芽,在傳輸系統(tǒng)的每一層都將建立協(xié)議數(shù)據(jù)單元]
在系統(tǒng)接收到信息時(shí),以pdu的協(xié)議保存信息數(shù)據(jù)绩脆;若收到廣播是接收信息的廣播萤厅,就取出該數(shù)據(jù),再生成短信即可靴迫;
▲創(chuàng)建一個(gè)接收器惕味,在onReceive(..)方法中判斷:

 if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getaction())) {
   Object[] pdus = (Object[]) intent.getExtras().get("pdus");//取出pdus數(shù)據(jù)字節(jié)數(shù)組
   for (Object pdu : pdus) { //遍歷
      SmsMessage sms=SmsMessage.createFromPdu((byte[]) pdu);//將字節(jié)數(shù)組生成為短信;
    }
    ...

☆可用到的內(nèi)容:

sms.getOriginatingAddress(): 發(fā)送人的號(hào)碼
sms.getDisplayMessageBody(): 短信內(nèi)容文本
sms.getServiceCenterAddress(): 中心號(hào)碼
sms.getTimestampMillis(): 接收信息時(shí)的時(shí)間玉锌;
№★ 如果攔截到短信后名挥,不讓系統(tǒng)再收到此短信,就須注銷(xiāo)該廣播主守,并在注冊(cè)該廣播接收器時(shí)設(shè)置最高優(yōu)先級(jí)才可進(jìn)行攔截禀倔。

 if (isOrderedBroadcast()) {
   abortBroadcast();
}}

☆№[短信攔截可用于手機(jī)防盜,吸費(fèi)軟件]

◆Android間的進(jìn)程間通信,采用了Binder架構(gòu)参淫,
▲B(niǎo)inder架構(gòu)本身就是一個(gè)C/S架構(gòu)
→1救湖、在服務(wù)端創(chuàng)建Binder對(duì)象
→2、在客戶(hù)端獲取Binder的代理對(duì)象
→3涎才、然后就可以在客戶(hù)端通過(guò)BinderProxy對(duì)象像調(diào)用本地方法一樣去調(diào)用服務(wù)端的代碼鞋既。
★№[在onServiceConnected(..)方法中IBinder的對(duì)象若是在同一進(jìn)程中則是一個(gè)服務(wù)器Binder對(duì)象,若是不同的進(jìn)程則是在服務(wù)器的Binder代理]

★Service三種啟動(dòng)模式:
●Service的啟動(dòng)模式:startService(intent);
●Service的綁定模式
§1耍铜、創(chuàng)建Service的子類(lèi)MyService邑闺,在其onBind方法中返回一個(gè)binder對(duì)象;
△創(chuàng)建Binder對(duì)象:在MyService下創(chuàng)建一個(gè)內(nèi)部類(lèi)MyBinder extends Binder棕兼;則MyBinder即是一個(gè)Binder又可訪(fǎng)問(wèn)MyService下的方法陡舅;
☆№有兩種共享方法的方案:
◇a.在MyBinder創(chuàng)建與MyService中對(duì)應(yīng)的方法,并調(diào)用MyService中的方法,如:MyService.this.play();在客戶(hù)端通過(guò)獲取的binder調(diào)用這些方法來(lái)實(shí)現(xiàn)MyService中對(duì)應(yīng)的方法伴挚。
◇b.在MyBinder中提供一個(gè)方法直接返回MyService對(duì)象的引用靶衍,如:

public MyService getService() {
  return MyService.this;
}

在客戶(hù)端就可直接獲取到該MyService的引用臂寝,可直接調(diào)用MyServie下所有方法。

★[但此方案僅適用于同一個(gè)進(jìn)程內(nèi)摊灭,因?yàn)樵诹硗庖粋€(gè)進(jìn)程中可能沒(méi)有MyService,就不能獲取到MyService的引用]

§2咆贬、在客戶(hù)端(Activity)中綁定到該Service,并獲取Binder帚呼;
№a掏缎、創(chuàng)建一個(gè)ServiceConnection;

private ServiceConnection conn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) { // 該方法為與Service連接失敗時(shí)的方法 }

  public void onServiceConnected(ComponentName name, IBinder binder) {
  // 該方法為與Service連接成功時(shí)的方法
   MainActivity.this.binder = (MyBinder) binder; //構(gòu)建該binder
   service = MainActivity.this.binder.getService();
 }
};

№b、與Service進(jìn)行綁定:

Intent intent = new Intent(this, MyService.class);
bindService(intent, conn, BIND_AUTO_CREATE);

№c煤杀、Service的銷(xiāo)毀條件:
started為false且clientCount為0眷蜈;故當(dāng)一個(gè)客戶(hù)端(Activity)銷(xiāo)毀時(shí)應(yīng)當(dāng)解除綁定,否則會(huì)造成內(nèi)存泄露沈自;即在onDetroy(..)方法中執(zhí)行:unbindService(conn);

started為false且clientCount為0酌儒;故當(dāng)一個(gè)客戶(hù)端(Activity)銷(xiāo)毀時(shí)應(yīng)當(dāng)解除綁定,否則會(huì)造成內(nèi)存泄露枯途;即在onDetroy(..)方法中執(zhí)行:unbindService(conn);

★ Service綁定模式下的生命周期方法:
onCreate
onBind :Service實(shí)例第一次被綁定時(shí)執(zhí)行(只執(zhí)行一次)
onUnbind :Service實(shí)例的最后一個(gè)客戶(hù)端被解綁時(shí)執(zhí)行
onDestroy :在service銷(xiāo)毀時(shí)執(zhí)行onUnbind方法忌怎。
★№ [一般使用啟動(dòng)+綁定模式構(gòu)成的混合模式。很少單獨(dú)使用綁定模式酪夷,無(wú)法銷(xiāo)毀Service]

博客地址:Android學(xué)習(xí)筆記(六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榴啸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晚岭,更是在濱河造成了極大的恐慌鸥印,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡他匪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)潜的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人构回,你說(shuō)我怎么就攤上這事夏块∈韪溃” “怎么了纤掸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)浑塞。 經(jīng)常有香客問(wèn)我借跪,道長(zhǎng),這世上最難降的妖魔是什么酌壕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任掏愁,我火速辦了婚禮歇由,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘果港。我一直安慰自己沦泌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布辛掠。 她就那樣靜靜地躺著谢谦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萝衩。 梳的紋絲不亂的頭發(fā)上回挽,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音猩谊,去河邊找鬼千劈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牌捷,可吹牛的內(nèi)容都是我干的墙牌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼暗甥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憔古!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起淋袖,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸿市,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后即碗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體焰情,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年剥懒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了内舟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡初橘,死狀恐怖验游,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情保檐,我是刑警寧澤耕蝉,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站夜只,受9級(jí)特大地震影響垒在,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扔亥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一场躯、第九天 我趴在偏房一處隱蔽的房頂上張望谈为。 院中可真熱鬧,春花似錦踢关、人聲如沸伞鲫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榔昔。三九已至,卻和暖如春瘪菌,著一層夾襖步出監(jiān)牢的瞬間撒会,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工师妙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诵肛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓默穴,卻偏偏與公主長(zhǎng)得像怔檩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓄诽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理薛训,服務(wù)發(fā)現(xiàn),斷路器仑氛,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • #Android 基礎(chǔ)知識(shí)點(diǎn)總結(jié) ---------- ##1.adb - android debug bridg...
    Mythqian閱讀 3,283評(píng)論 2 11
  • 最近剛從舊公司離職锯岖,為面試在做準(zhǔn)備介袜,因?yàn)槠綍r(shí)開(kāi)發(fā)CV大法用得比較多,很多基礎(chǔ)知識(shí)掌握得不是很牢靠以及很多工具框架只...
    黎清海閱讀 2,186評(píng)論 1 19
  • HandlerThread是一個(gè)Android 已封裝好的輕量級(jí)異步類(lèi)出吹。HandlerThread本質(zhì)上是一個(gè)線(xiàn)程...
    kjy_112233閱讀 1,284評(píng)論 0 9
  • 1.什么是Activity?問(wèn)的不太多捶牢,說(shuō)點(diǎn)有深度的 四大組件之一,一般的,一個(gè)用戶(hù)交互界面對(duì)應(yīng)一個(gè)activit...
    JoonyLee閱讀 5,731評(píng)論 2 51