第一篇:Android學習之TextView屬性總結
IT在線教育平臺———麥子學院:http://004km.cn
TextView作為android開發(fā)中最簡單也最常用的控件,作為初學者,需要熟知其屬性并熟練掌握。如下例:
android:autoLink:設置是否當文本為URL鏈接/email/電話號碼/map時,文本顯示為可點擊的鏈接??蛇x值(none/web /email/phone/map/all)android:autoText:如果設置,將自動執(zhí)行輸入值的拼寫糾正。此處無效果,在顯示輸入法并輸入的時候起作用。
android:bufferType:指定getText()方式取得的文本類別。選項editable 類似于StringBuilder可追加字符,也就是說getText后可調(diào)用append方法設置文本內(nèi)容。spannable 則可在給定的字符區(qū)域使用樣式,參見這里
1、這里2。
android:capitalize:設置英文字母大寫類型。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
android:cursorVisible:設定光標為顯示/隱藏,默認顯示。
android:digits:設置允許輸入哪些字符。如“1234567890.+-*/%()”
android:drawableBottom:在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,并且同時和background使用時覆蓋后者。android:drawableLeft:在text的左邊輸出一個drawable,如圖片。
android:drawablePadding:設置text與drawable(圖片)的間隔,與drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可設置為負數(shù),單獨使用沒有效果。
android:drawableRight:在text的右邊輸出一個drawable。android:drawableTop:在text的正上方輸出一個drawable。android:editable:設置是否可編輯。
android:editorExtras:設置文本的額外的輸入數(shù)據(jù)。
android:ellipsize:設置當文字過長時,該控件該如何顯示。有如下值設置:”start”—?省略號顯示在開頭;”end” ——省略號顯示在結尾;”middle”—-省略號顯示在中間;”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)android:freezesText:設置保存文本的內(nèi)容以及光標的位置。
android:gravity:設置文本位置,如設置成“center”,文本將居中顯示。
android:hintText:為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在 EditView中使用,但是這里也可以用。
android:imeOptions:附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個“完成”,而不設置默認是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId:設置IME動作ID。android:imeActionLabel:設置IME動作標簽。
android:includeFontPadding:設置文本是否包含頂部和底部額外空白,默認為true。android:inputMethod:為文本指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是這里報錯找不到。IT在線教育平臺———麥子學院:http://004km.cn
android:inputType:設置文本的類型,用于幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
android:linksClickable:設置鏈接是否點擊連接,即使設置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情況下,設置重復滾動的次數(shù),當設置為 marquee_forever時表示無限次。
android:ems設:置TextView的寬度為N個字符的寬度。這里測試為一個漢字字符寬度 android:maxEms:設置TextView的寬度為最長為N個字符的寬度。與ems同時使用時覆蓋ems選項。
android:minEms:設置TextView的寬度為最短為N個字符的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength:限制顯示的文本長度,超出部分不顯示。
android:lines:設置文本的行數(shù),設置兩行就顯示兩行,即使第二行沒有數(shù)據(jù)。android:maxLines:設置文本的最大顯示行數(shù),與width或者layout_width結合使用,超出部分自動換行,超出行數(shù)將不顯示。
android:minLines:設置文本的最小行數(shù),與lines類似。android:lineSpacingExtra:設置行間距。
android:lineSpacingMultiplier:設置行間距的倍數(shù)。如”1.2”
android:numeric:如果被設置,該TextView有一個數(shù)字輸入法。此處無用,設置后唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。android:password:以小點”.”顯示文本
android:phoneNumber設:置為電話號碼的輸入方式。
android:privateImeOptions:設置輸入法選項,此處無用,在EditText將進一步討論。android:scrollHorizontally:設置文本超出TextView的寬度的情況下,是否出現(xiàn)橫拉條。android:selectAllOnFocus:如果文本是可選擇的,讓他獲取焦點而不是將光標移動為文本的開始位置或者末尾位置。TextView中設置后無效果。
android:shadowColor:指定文本陰影的顏色,需要與shadowRadius一起使用。android:shadowDx:設置陰影橫向坐標開始位置。android:shadowDy:設置陰影縱向坐標開始位置。
android:shadowRadius:設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
android:singleLine:設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,后面用“…”來表示。如android:text=“test_ singleLine ” android:singleLine=“true” android:layout_width=“20dp”將只顯示“t…”。如果不設置singleLine或者設置為false,文本將自動換行 android:text設置顯示文本.android:textAppearance:設置文字外觀。如 “?android:attr/textAppearanceLargeInverse”這里引用的是系統(tǒng)自帶的一個外觀,?表示系統(tǒng)是否有這種外觀,否則使用默認的外觀。可設置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargIT在線教育平臺———麥子學院:http://004km.cn
eInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse android:textColor:設置文本顏色
android:textColorHighlight:被選中文字的底色,默認為藍色
android:textColorHint:設置提示信息文字的顏色,默認為灰色。與hint一起使用。android:textColorLink:文字鏈接的顏色.android:textScaleX:設置文字之間間隔,默認為1.0f。android:textSize:設置文字大小,推薦度量單位”sp”,如”15sp”
android:textStyle:設置字形[bold(粗體)0, italic(斜體)1, bolditalic(又粗又斜)2] 可以設置一個或多個,用“|”隔開
android:typeface:設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體)3] android:height:設置文本區(qū)域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)android:maxHeight:設置文本區(qū)域的最大高度 android:minHeight:設置文本區(qū)域的最小高度
android:width:設置文本區(qū)域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width 的區(qū)別看這里。
android:maxWidth:設置文本區(qū)域的最大寬度 android:minWidth:設置文本區(qū)域的最小寬度
如需了解更多android開發(fā)知識,請至麥子學院官網(wǎng)查看。
第二篇:Android之a(chǎn)ctivity總結
Android之Activity總結
一、什么是Activity
Activity 是用戶接口程序,原則上它會提供給用戶一個交互式的接口功能。它是 android 應用程序的基本功能單元。Activity 本身是沒有界面的。所以activity類創(chuàng)建了一個窗口,開發(fā)人員可以通過setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當activity指向全屏窗口時,也可以用其他方式實現(xiàn):作為漂浮窗口(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道
二、Activity生命周期(生命周期方法)
由圖可知,這些方法調(diào)用的順序:
1.Activity正常啟動:onCreate-> onStart-> onResume;
2.Activity被殺掉:onPause-> onStop-> onDestroy,此為一個完整的生命周期。3.中斷處理:onPause-> onStop,恢復時onRestart-> onStart-> onResume;
4.如果當前Activity是半透明狀態(tài)或者對話框狀態(tài):那么中斷就是onPause ,恢復的時候onResume。
那么對于”O(jiān)ther app need memory”,就是我們手機在運行一個應用程序的時候,有可能打進來電話發(fā)進來短信,或者沒有電了,這時候程序都會被中斷,優(yōu)先去服務電話的基本功能,另外系統(tǒng)也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時候也就有可能被kill掉。
方法在系統(tǒng)中的作用及我們應該做什么:
onCreate(創(chuàng)建):在這里創(chuàng)建界面,做一些數(shù)據(jù)的初始化工作;
onStart(可視狀態(tài)): 到這一步變成“用戶可見不可交互”的狀態(tài);
onResume(可交互狀態(tài)):變成和用戶可交互的,(在Activity棧系統(tǒng)通過棧的方式管理這些Activity,即當前Activity在棧的最上端,運行完彈出棧,則回到上一個Activity);
onPause(暫停狀態(tài)):到這一步是可見但不可交互的,系統(tǒng)會停止動畫等消耗CPU的事情。從上文的描述已經(jīng)知道,應該在這里保存你的一些數(shù)據(jù),因為這個時候你的程序的優(yōu)先級降
低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應該在onResume里讀出來。
OnStop(停止狀態(tài)):變得不可見,被下一個activity覆蓋了。
onDestroy(殺死):這是Activity被kill前最后一個被調(diào)用方法了,可能是其他類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時性的干掉。
onPause,onstop,onDestroy,三種狀態(tài)下 activity都有可能被系統(tǒng)殺掉。
Activity棧:Activity以棧的形式進行管理,后進先出的原則
三、Activity之間的通信
在 Android 中,不同的 Activity 實例可能運行在一個進程中,也可能運行在不同的進程中。因此我們需要一種特別的機制幫助我們在 Activity 之間傳遞消息。
Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應該包含收件地址,還可以包含具體的內(nèi)容。
Intent是一種運行時綁定(runtime binding)機制
Intent負責對操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進行描述,Android則根據(jù)此Intent的描述,負責找到對應的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關信息,實現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
在應用中,我們可以以兩種形式來使用Intent:
直接Intent(應用程序內(nèi)部):指定了component(組建)屬性的Intent。通過指定具體的組件類,通知應用啟動對應的組件。
間接Intent(應用程序之間):沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標組件已經(jīng)很明確。
Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是通過查找已注冊在AndroidManifest.xml(清單)中的所有IntentFilter(意圖過濾器)及其中定義的Intent,最終找到匹配的Intent。
橫屏時:onConfigurationChanged(配置改變))
橫屏以及出現(xiàn)鍵盤鍵盤時生命周期部重新開始的方法: KeyboardHidHidden/orientation/screenSize 橫屏顯示:landscape 豎屏顯示:portrait
四大組建:activity:活動、service:服務、content provider:內(nèi)容提供商、broadcast receiver:廣播收音機
Activity的所有面試題
什么是Activity? 請描述一下Activity 生命周期?
兩個Activity之間跳轉(zhuǎn)時必然會執(zhí)行的是哪幾個方法?
你后臺的Activity被系統(tǒng) 回收怎么辦?如果后臺的Activity由于某原因被系統(tǒng)回收可了,如何在被系統(tǒng)回收之前保存當前狀態(tài)?
如何退出Activity?如何安全退出已調(diào)用多個Activity的Application? 兩個Activity之間怎么傳遞數(shù)據(jù)?
第三篇:Android學習總結
Android學習總結
零零碎碎的總結:
1.客戶端的功能邏輯不難,UI界面也不難,但寫UI花的時間是寫功能邏輯的兩倍.2.寫代碼前的思考過程非常重要,即使在簡單的功能,也需要在本子上把該功能的運行過程寫出來.3.要有自己的知識庫,可以是一個工具類,把寫過的,看過的好的代碼放進去,也可以是一個筆記本軟件.因為只有放在知識庫里的東西,才是你最重要的財富.4.如果你想做自由職業(yè)者,你需要學英語,因為在國外的盈利比國內(nèi)多很多.如果你想進大公司,好公司,你需要學英語.你想深入學習android,但中文的android文章太少了,你查查百度,到處都是copy來copy去的hellword,所以,你需要學英語.如果你想出國,你需要學英語.5.Http協(xié)議要研究透徹.http的信息頭有什么信息,分別代表什么,信息體有什么信息,代表什么,都要搞的明明白白.scoket也是一樣.6.在eclipse里的layout文件都有graphical Layout.通過這個好好的把UI調(diào)整好.7.Android里的junit每次運行都會打包新的apk到設備上跑.效率非常慢.如果是跟android無關的測試,最好自己建立一個單純的java項目做測試.8.面試的時候不要覺得自己提的薪水太高,物以稀為貴明白嗎?不管你的期望薪資多少,都有可能實現(xiàn),這只是時間問題.9.如果一家小公司通過獵頭找到你,即使公司在小,也比外面那些40,50人的公司還要好.不要覺得公司不行,擔心會倒閉.放心吧,至少活1年是沒問題的.10.不要把自己綁在android上,有空也研究下IOS(最近小弟就準備研究ios,剛買了6本書...).11.移動互聯(lián)網(wǎng)最少還有10年的快速增長.android最少還有兩年的快速增長.走android這條路是不會錯的.12.有空多學點開放平臺的SDK.比如新浪微博,騰訊微博,淘寶平臺,支付寶移動支付平臺,快錢移動支付平臺等等..這些都是不愁沒市場的.13.即使技術再差,也要發(fā)布一個應用到market上去.因為這樣你才了解做一個應用的邏輯.14.每個月拿到薪水省500-1000元出來.這些錢投在買學習資料,去培訓班上課...在培訓班,花再多的錢也是值得的.15.你真正的價值在項目經(jīng)驗和對底層的認識上.不要忽略基礎知識.16.如果有空把Android的源代碼看一下.底層的東西很枯燥,但這些很值得學.17..程序員其實是藝術家.代碼重構和設計模式,是非常非常重要的東西,必須要學
18.不要去維護一個項目,要去做一個項目.19.一開始不要輕易去大公司,雖然大公司是可以讓你呆一輩子的.但你的起點低,以后成就也低.20:每天早上提前20分鐘上班,5分鐘把今天的工作計劃寫好.15分鐘用來看各大It論壇的新聞.21:如果以前沒做過java,那就把SSH看下,自己搭建一個小服務器.這是為了接私活用.22:PS一定要學,接私活用.23:多下載市面上好的應用,每天都用,只有這樣你才能了解市場.現(xiàn)在所有的APK都可以反編譯,看源代碼麻煩,但看layout和圖片很容易,所以....你懂的.24.要有羞恥心.25.老板僅僅要求你把東西做完,需求完成.但你必須對自己要更嚴格一點.寫一段代碼,從網(wǎng)上復制一份代碼,并不是可以用就行了,你還必須明白他的原理,為什么這樣就可以?這才是對你最有用的地方,這也是你今后薪資增長的保證.26.要懂得舍得.移動領域發(fā)展太快,必要時必須要用錢換時間.不然你會遠遠落后別人(我之前花了4000大洋去培訓班學IOS三天).27.要明白自己想要什么,什么才能最大性價比提高你的能力.對我來說,能讓我提高最大的,就是Android和IOS同時會,并且自己可以做架構設計.28.看android技術書籍最快的學習方法,先通讀一次.然后把書本上的demo一個一個寫出來.不要覺得太容易不去寫.很多東西都是這樣,看起來簡單,但做起來難.最后再對照自己寫出來的程序代碼去理解書本的意思.29.應用和游戲是2個方向,沒有一個公司會同時做游戲又做應用,即使是外包公司,大多也只做一塊.專精一個就可以了.30.每次做完一個項目,要強迫自己做總結,通過這個項目,我學到了什么新技術?犯了哪些
SB錯誤?
31.一家小公司,如果有正式財務部,那肯定是正規(guī)的,不要擔心欠薪問題.如果沒有,就說不準了.bbs.12580life.com
第四篇:Android學習總結 20110325專題
Android學習總結
在這段時間主要對Android平臺有了一定的了解,對一些簡單的設計也有了一定的掌握Android概念
Android是一個基于Linux核心的開放手持設備(主要是手機)平臺操作系統(tǒng),與Windows Moble、Symbian等手機操作系統(tǒng)處于同一級別?!癆ndroid大獎賽“首頁上列出的可能設計方向
多媒體工具社交網(wǎng)絡新聞、資訊工具環(huán)保、慈善協(xié)作生產(chǎn)力工具Android Developer Challenge(ADC)游戲?qū)崟r資訊服務嶄新的用戶界面您想到的應用程序項目構架
src/:源代碼(sourse)目錄
“src”目錄包含了“Android應用程序”各個程序源文件。對于上例 ”Bmi.java”是新 序項目中的主要程序塊。gen/:自動生成(Generate)目錄
gen目錄中存放所有自動生成的文件。最關鍵就是R.java,這個文件是自動產(chǎn)生的,與”res”目錄下的XML文件內(nèi)容同步更新。
Android<版本號>/:參考函數(shù)目錄
此目錄的作用是將AndroidSDK里所有可呼叫的類、方法函數(shù),分門別類的列出,好方便開發(fā)者來參考。
assert/:對此目錄目前還不是太懂 res/:資源(Resource)目錄
res目錄存放所有程序中用到的資源文件。在里邊還有兩個經(jīng)常訪問的目錄,分別 “l(fā)ayout/:頁面布局(layout)目錄”和“values/:參數(shù)值(values)目錄”
“AndroidManifest.xml”是Android應用程序的功能列表,每個應用程序都在這個文件中,列出該程序所提供的功能。我完成的BMI程序
此程序是我參考書上的例子所完成的程序。
BMI,英文全稱:Body Mass Index,中文名稱:身高體重指數(shù),是一個計算值,整個程序的思路是當我們在對應的文本框內(nèi)輸入身高(cm)、體重(kg),輸入完成后按下“計算BMI”鍵,屏幕上就會顯示計算結果,并彈出“你應該節(jié)食”、或“你應該多吃點”等健康建議的信息框。
健康指標的計算方法是:身高(height)/(體重(weight)/100)只要BMI值超過25時就算偏胖、BMI值低于20就算偏瘦,介于這之間算正常。
下面是我完成的程序界面:
計算得到的BMI值是20.57,在20—25之間,體型正常。由于我對兩個文本框內(nèi)輸入的內(nèi)容進行了限制,因此只容許輸入數(shù)字
BMI值為25.56,信息框彈出“你該節(jié)食了”
在界面的下側有一個“健康小常識按鈕”,當點擊此按鈕時,會鏈接到一個有關健康生活小常識的網(wǎng)頁上:
在每次點擊“計算BMI值”按鈕后首先會彈出一個消息框,消息框中包括兩個按 鈕,當點擊確認按鈕時消息框消失;當點擊首頁按鈕時會連接到相應的網(wǎng)頁
下圖為點擊消息框確認按鈕后顯示的網(wǎng)頁:
總結
通過這段時間的學習,對于Android平臺的整個基本框架有了一定的了解,對程序整個運 及相互之間的調(diào)用流程也有了一定的掌握,但感覺自己java基本功比較薄弱,還得進一步學習。由于目前還沒有什么想法,我打算在后面的一段時間內(nèi)主要還是繼續(xù)掌握這方面知識,做一個類似于計算器之類的小軟件,以鞏固我這方面的知識。在查閱資料方面我還有點欠缺,尤其比較怕讀英文資料,這方面還得加強。
第五篇:Android RIL&Call學習總結
Android RIL與Call代碼學習總結
前言
本文分五部分:Android電信業(yè)務系統(tǒng)、RIL、Telephony APP Framework、Phone APP、Android通話簡單流程。
1、Android電信業(yè)務系統(tǒng)主要敘述Android整個電信業(yè)務系統(tǒng)的軟件架構。
2、RIL主要敘述Android Radio Interface Layer相關要點,涉及的代碼主要放在hardwareril目錄下。
3、Telephony APP Framework主要簡述電信業(yè)務系統(tǒng)Framework部分代碼相關要點,涉及的代碼主要放在frameworksbasetelephony目錄下。
4、Phone APP主要敘述Android的電話業(yè)務模塊,涉及的代碼主要放在packagesappsPhone目錄下。
5、Android通話簡單流程主要敘述從上層Phone APP發(fā)起電話的函數(shù)調(diào)用流程。
一、Android電話業(yè)務系統(tǒng)
簡單的說由三部分組成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)
二、RIL RIL(Radio Interface Layer),是Android電信業(yè)務系統(tǒng)和底層硬件之間的抽象層,Android提供該層方便用戶移植。手機每次請求相應的電信服務,如電話、短信、網(wǎng)絡連接等,都是通過AT指令與底層硬件進行交互的,拿電話來講,用戶請求撥打電話,需要向RIL發(fā)送相關的請求,接著RIL按照用戶的請求,調(diào)用相應的AT指令發(fā)送接口給底層發(fā)送AT指令,完成用戶撥打電話的流程。簡單的說,對RIL的移植,主要是針對不同的設備針對AT指令做相應的修改。
1、RIL移植層的三個組成部分
1)Vendor RIL 提供AT指令發(fā)送接口 2)RIL Daemon 加載RIL相關的庫同時初始化RIL,注冊RIL相關函數(shù)接口。同時,RILD也是上層和底層RIL的調(diào)用中轉(zhuǎn)站。3)RIL JNI Layer RIL JNI接口,提供上層Telephony APP Framework調(diào)用
2、RIL的初始化流程
加載ril.lib ? RIL_Init()? RIL_register(),詳細可見ridl.c中的main()函數(shù)。
3、RIL接口的調(diào)用方式
有兩種方式:主動請求(Solicited)和被動請求(Unsolicited)1)主動請求
2)被動請求
void(*OnUnsolicitedResponse)(int unsolResponse, const void *data,size_t datalen);
4、涉及的主要源代碼文件
1)reference-ril.c ? 本文件涉及的重要內(nèi)部函數(shù)及功能 requestRadioPower
開啟通訊模塊 requestQueryNetworkSelectionMode 查詢網(wǎng)絡模式 requestGetCurrentCalls
獲取當前通話 requestDial
請求呼叫 requestWriteSmsToSim
寫入短信至SIM卡 requestHangup
掛斷電話 requestSignalStrength
獲取信號強度 requestRegistrationState
獲取卡注冊狀態(tài) requestOperator
獲取運營商名稱 requestSendSMS
請求發(fā)送短信 requestSetupDataCall
撥號上網(wǎng) requestSMSAcknowledge
短信回報
requestEnterSimPin
請求輸入SIM PIN碼 requestSendUSSD
請求USSD業(yè)務 ? 本文件提供給ril.cpp調(diào)用的外部接口 RIL_Init
RIL初始化 onRequest
AT請求指令接口(異步方式)
getVersion
獲取RIL版本號,當前為“android reference-ril 1.0” onUnsolicited
AT請求指令接口(同步方式)
2)ril.cpp 該文件主要提供ril.java調(diào)用接口,實現(xiàn)RIL的JNI調(diào)用方式、RIL Event管理機制 ? 實現(xiàn)了供上層調(diào)用的接口 typedef struct {
int requestNumber;
void(*dispatchFunction)(Parcel &p, struct RequestInfo *pRI);
int(*responseFunction)(Parcel &p, void *response, size_t responselen);} CommandInfo;具體執(zhí)行的操作可以看頭文件ril_commands.h 舉一個例子:
撥打電話,對應的requestNumber為RIL_REQUEST_DIAL,對應的dispatchFunction為dispatchDial,對應的responseFunction為responseFunction。? RIL Event管理
與ril_event.cpp的Event接口配合實現(xiàn)RIL Event管理 RIL_startEventLoop rilEventAddWakeup eventLoop ril_event_init ril_event_set ril_event_add ril_event_del 4)rild.c rild的主要初始化工作都在main函數(shù)中進行。
5、RIL JNI上層對外接口
SetOnNITZTime
getIccCardStatus
supplyIccPin
supplyIccPuk
supplyIccPin2
supplyIccPuk2
changeIccPin
changeIccPin2
getCurrentCalls
getPDPContextList dial
getIMSI
getIMEI
getIMEISV
hangupConnection
acceptCall
rejectCall
getLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMute
getMute
getSignalStrength
getRegistrationState getGPRSRegistrationState getOperator
設置網(wǎng)絡身份和時區(qū) 獲取SIM卡狀態(tài) 輸入PIN碼 輸入PUK碼 輸入PIN2碼 輸入PUK2碼 修改PIN碼 修改PIN2碼 獲取當前通話 獲取PDP列表 撥號
獲取IMSI 獲取IMEI 獲取IMEISV 掛斷電話 接聽電話 電話拒接
獲取Call失敗錯誤碼 獲取PDP失敗錯誤碼 獲取撥號連接失敗錯誤碼
設置手機靜音模式(靜音/非靜音)獲取手機靜音模式(靜音/非靜音)獲取信號強度 獲取卡注冊狀態(tài) 獲取GPRS注冊狀態(tài) 獲取運營商 sendDtmf
startDtmf stopDtmf sendSMS deleteSmsOnSim writeSmsToSim
發(fā)送DTMF Start DTMF Stop DTMF 發(fā)送短信
刪除SIM卡短信 保存短信至SIM卡
6、RIL機制
RIL類有三個內(nèi)部類:RILRequest、RILSender、RILReceiver,這三個內(nèi)部類共同實現(xiàn)上層的電信業(yè)務操作請求。
RILRequest,電信服務請求,上層應用通過該類與RIL JNI層進行消息的交互,同時RIL JNI層也通過該類與RIL底層進行消息的交互; RILSender,實現(xiàn)上層請求的命令發(fā)送 RILReceiver,負責接收底層的Response ? 以下是dial的RIL調(diào)用序列 ?上層調(diào)用dial ?設置Request請求并發(fā)送至RILSender消息處理隊列
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…
send(rr);? RILSender消息處理隊列消息隊列收到EVENT_SEND后往mSocket里邊填寫相應請求 ?RILD從mSocket中讀取相應的請求為RIL_REQUEST_DIAL,并設置相應的event ?執(zhí)行dispatchDial ? onRequest ? requestDial發(fā)送AT指令
?底層給予responseVoid的響應
?RILD向mSocket填寫相應的響應信息,并往RILReceiver消息隊列發(fā)送 ? processResponse ?processSolicited ?responseVoid(JNI)
三、Telephony APP Framework概述
電信業(yè)務Framework涉及Call、SMS、SIM卡、PDP等,代碼分為兩個部分,一個是SDK API,一個是平臺內(nèi)部類,不對外開放。這部分簡單的說,就是上層電信業(yè)務與底層RIL的中間層。
1、Internal Class 1)ADN(Abbreviated Dialing Numbers,縮位撥號)相關的類 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相關的類
Call:基類,GsmCall和CdmaCall都由該基類擴展實現(xiàn) CdmaCal GsmCall
CallTracker:基類,GsmCallTracker和CdmaCallTracker都由這個基類進行擴展實現(xiàn) GsmCallTracker: CdmaCallTracker PhoneBase:基類,CDMAPhone和GSMPhone都由這個基類擴展實現(xiàn) CDMAPhone GSMPhone Phone:電話操作的一些接口 CallerInfo CallerInfoAsyncQuery CallForwardInfo:呼叫轉(zhuǎn)移
CallFailCause:GSM Call失敗錯誤碼 CallFailCause:CDMA Call失敗錯誤碼 3)數(shù)據(jù)連接相關類
DataConnection:基類,GsmDataConnection和CdmaDataConnection都基于該類擴展實現(xiàn) GsmDataConnection CdmaDataConnection DataConnectionTracker:基類,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于該類進行擴展實現(xiàn) CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相關類
IccCard:基類,RuimCard和SimCard都由該類進行擴展實現(xiàn) RuimCard SimCard IccRecords:基類,RuimRecords和SIMRecords都基于該類進行擴展實現(xiàn) RuimRecords SIMRecords IccProvider IccUtils 5)SMS相關類
SMSDispatcher:實現(xiàn)發(fā)送短信
SmsMessageBase:基類,SmsMessage由該類擴展實現(xiàn) SmsMessage:短信PDU包解析
2、SDK API Class 實現(xiàn)SDK API接口,具體架構見SDK API文檔
四、Phone APP Android自帶一個Phone App,實現(xiàn)了GSM/CDMA的通話功能,這部分代碼放在packagesappsPhone目錄下。
Phone APP開機就運行了,可以從AndroidManifest.xml設置的應用權限看出來
A、初始化Telephony Framework B、Power、Ringer、Keyboard、狀態(tài)欄、SIM卡的注冊工作 C、CallNotifier、PhoneUtils初始化工作 具體可以參見onCreate Phone APP有如下幾個重要的類
? PhoneApp requestWakeState:判斷手機是否可休眠 wakeUpScreen:喚醒手機
PhoneAppBroadcastReceiver:內(nèi)部類,可以實時監(jiān)測手機的狀態(tài),飛行模式、藍牙耳機等。? PhoneUtils 電話基本組件接口,實現(xiàn)電話的一些基本操作,如Dial、Answer、Hangup、Hold等 placeCall:電話呼出 Hangup:掛斷電話 answerCall:接聽電話
setMute/ setMuteInternal:靜音 turnOnSpeaker:免提
showIncomingCallUi:顯示來電界面 ? InCallScreen 該類實現(xiàn)通話界面流程,主要如下:
case R.id.menuAnswerAndHold,保持當前通話并接聽: internalAnswerCall ? PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,結束當前通話并接聽:
internalAnswerAndEnd ? PhoneUtils.answerAndEndActive(mPhone)case R.id.menuAnswer,接聽:
internalAnswerCall ? PhoneUtils.answerCall(mPhone)case R.id.menuIgnore,忽略:
internalHangupRingingCall ? PhoneUtils.hangupRingingCall(mPhone)case R.id.menuSwapCalls,切換通話:
internalSwapCalls ? PhoneUtils.switchHoldingAndActive(mPhone)case R.id.menuMergeCalls,合并通話: PhoneUtils.mergeCalls(mPhone)case R.id.menuManageConference,管理電話會議:
setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE)case R.id.menuShowDialpad,顯示撥號鍵盤: onShowHideDialpad ? mDialer.openDialer(true)case R.id.menuSpeaker,免提:
onSpeakerClick ? PhoneUtils.turnOnSpeaker case R.id.menuBluetooth,藍牙: onBluetoothClick case R.id.menuMute,靜音:
onMuteClick ? PhoneUtils.setMute case R.id.menuHold,通話保持: onHoldClick case R.id.menuAddCall,添加通話: PhoneUtils.startNewCall(mPhone)case R.id.menuEndCall,結束通話: internalHangup ? PhoneUtils.hangup(mPhone)? DTMFTwelveKeyDialer 該類實現(xiàn)DTMF processDtmf:發(fā)送DTMF clearDigits:清除DTMF鍵碼 startDtmfTone:播放DTMF Tone stopDtmfTone:停止播放DTMF Tone ? CallNotifier 繼承于Handler,用來實時監(jiān)測通話狀態(tài)并通知Phone Application,如PHONE_NEW_RINGING_CONNECTION(來電),PHONE_INCOMING_RING(來電響鈴),PHONE_DISCONNECT(通話掛斷),PHONE_BATTERY_LOW(電池電量低),具體相對應的處理可參見handleMessage ? CallFeaturesSetting 實現(xiàn)通話設置,此外該類包含一個內(nèi)部類VoiceMailProviderSettings用來實現(xiàn)語音信箱的設置
? CallCard/ InCallTouchUi 這兩個類都是繼承于FrameLayout,Phone用來實現(xiàn)通話自身的布局需求。
updatePhotoForCallState:更新替代圖片(如果通話號碼有設置特定代替圖片的)updateDisplayForConference:通話UI更新(用于電話會議)updateDisplayForPerson:通話UI更新
getCallFailedString:獲取通話失敗錯誤字符串 displayOnHoldCallStatus:顯示通話保持UI displayMainCallStatus:更新通話UI updateState:更新通話狀態(tài)(供外部類調(diào)用)? BluetoothHandsfree/BluetoothHeadsetService 實現(xiàn)通話藍牙耳機功能,其實現(xiàn)核心是BluetoothHeadsetService,在PhoneApp 創(chuàng)建的時候會啟動它。BluetoothHeadsetService 通過接收底層藍牙服務的狀態(tài)消息來改變自身狀態(tài),同時它也會監(jiān)聽通話的狀態(tài)變化。onBluetoothEnabled:開啟藍牙設備 onBluetoothDisabled:關閉藍牙設備 connectHeadset:連接藍牙設備 audioOn:開啟audio audioOff:關閉audio redial:通過藍牙設備重播電話 updateBatteryState:更新電池強度 updateSignalState:更新信號強度
五、Android通話簡單流程
1、撥打流程(以電話本入口為例)
?進入電話本,以某個聯(lián)系人發(fā)起呼叫,此時進入TwelveKeyDialer類的onClick函數(shù)case R.id.dialButton分支,啟動OutgoingCallBroadcaster Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//以新的TASK啟動 ?OutgoingCallBroadcaster發(fā)出Broadcast Announcement sendOrderedBroadcast(broadcastIntent, PERMISSION,new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);?收到Broadcast后,進入OutgoingCallReceiver中的doReceive啟動InCallScreen ?進入internalResolveIntent mInCallInitialStatus = internalResolveIntent(getIntent());?placeCall ?PhoneUtils.placeCallVia/ PhoneUtils.placeCall ? Connection cn = phone.dial(number);Phone是Interface,所屬的dial接口是在PhoneBase的子類GSMPhone中實現(xiàn) ?進入GsmCallTracker類中的dial函數(shù) mCT.dial(newDialString);?調(diào)用CommandsInterface的dial接口
cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());CommandsInterface的dial接口是在RIL.java中實現(xiàn)的 ?調(diào)用JNI接口dial ?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制
2、來電流程
?CallNotifier的消息處理隊列會收到PHONE_NEW_RINGING_CONNECTION ?onNewRingingConnection響鈴或震動(來電自動接聽也在里邊處理)?顯示來電界面InCallScreen PhoneUtils.showIncomingCallUi();
3、來電處理
? 接聽
?internalAnswerCall
?PhoneUtils.answerCall(mPhone)
?關閉來電鈴聲等,進入接聽流程phone.acceptCall()?調(diào)用GsmCallTracker的acceptCall mCT.acceptCall();?調(diào)用CommandsInterface acceptCall 接口 cm.acceptCall(obtainCompleteMessage())
?調(diào)用RIL JNI接口acceptCall向底層發(fā)送請求
?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制 ? 掛斷
? internalHangup ? PhoneUtils.hangup(mPhone)? 調(diào)用GsmCallTracker的handup ?調(diào)用CommandsInterface hangupConnection接口
cm.hangupConnection(conn.getGSMIndex(), obtainCompleteMessage());?調(diào)用RIL JNI接口hangupConnection向底層發(fā)送掛斷請求 ?……后續(xù)就是RIL JNI與libril的交互過程,見RIL機制 ? 通話保持恢復
PhoneUtils.switchHoldingAndActive(mPhone)? 添加一個新通話,實現(xiàn)多方通話 PhoneUtils.startNewCall(mPhone)
Android_Phone源代碼來電流程解讀
***************************CallNotifier***************************
本類extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener
電話狀態(tài)改變之后本類會接到Message,然后本Handler通過Message的不同,進入不同的case:
然后調(diào)用不同的方法處理各種狀態(tài)改變。
同時實現(xiàn)了OnQueryCompleteListener接口,當來電的時候會幫助執(zhí)行查詢操作,比如查詢并調(diào)用
Ringer設置響鈴方式。
當來電時,本類會接受到一個PHONE_NEW_RINGING_CONNECTION(Message.what),然后調(diào)用對應的方法
onNewRingingConnection(),該方法又會調(diào)用startIncomingCallQuery()方法,該方法就查詢用戶
設置的鈴聲(可能是系統(tǒng)的,也可能是用戶自定義的),如果查詢完成則直接調(diào)用onQueryComplete().假如執(zhí)行超時的話,將會發(fā)送一個延時Message,延時后將默認調(diào)用系統(tǒng)的鈴聲。
假如在延時發(fā)送Message過程中Query已經(jīng)完成,由于CallNotifier實現(xiàn)了OnQueryCopleteListener,就會自動調(diào)用onQueryComplete()方法,該方法將會首先把可能存在的延時Message給Remove,以防止
再次設置鈴聲。接著調(diào)用onCustomRingQueryComplete()方法。然后該方法里面會調(diào)用Ringer的ring()
方法啟動響鈴。
********************************Ringer*************************** Ringer的ring()方法會啟動相應的響鈴方式。
響鈴之后將會又Message發(fā)送,其內(nèi)容為PHONE_STATE_CHANGED
*******************************InCallScreen**********************
InCallScreen將會接受到發(fā)送的PHONE_STATE_CHANGED消息,然后調(diào)用onPhoneStateChanged()方法
該方法將更新屏幕,CallNotifier的onCustomRingQueryComplete里也會通過PhoneUtils.showIncomingCallUi()
來啟動InCallScreen屏幕。然后由InCallScreen處理,處理方式與前面打電話的大體一致,不過該類第一次調(diào)用時執(zhí)行了
onCreate()方法,但是以后執(zhí)行都是從onNewIntent()開始.