第一篇:Android學(xué)習(xí)總結(jié)
Android學(xué)習(xí)總結(jié)
零零碎碎的總結(jié):
1.客戶端的功能邏輯不難,UI界面也不難,但寫UI花的時間是寫功能邏輯的兩倍.2.寫代碼前的思考過程非常重要,即使在簡單的功能,也需要在本子上把該功能的運行過程寫出來.3.要有自己的知識庫,可以是一個工具類,把寫過的,看過的好的代碼放進去,也可以是一個筆記本軟件.因為只有放在知識庫里的東西,才是你最重要的財富.4.如果你想做自由職業(yè)者,你需要學(xué)英語,因為在國外的盈利比國內(nèi)多很多.如果你想進大公司,好公司,你需要學(xué)英語.你想深入學(xué)習(xí)android,但中文的android文章太少了,你查查百度,到處都是copy來copy去的hellword,所以,你需要學(xué)英語.如果你想出國,你需要學(xué)英語.5.Http協(xié)議要研究透徹.http的信息頭有什么信息,分別代表什么,信息體有什么信息,代表什么,都要搞的明明白白.scoket也是一樣.6.在eclipse里的layout文件都有g(shù)raphical Layout.通過這個好好的把UI調(diào)整好.7.Android里的junit每次運行都會打包新的apk到設(shè)備上跑.效率非常慢.如果是跟android無關(guān)的測試,最好自己建立一個單純的java項目做測試.8.面試的時候不要覺得自己提的薪水太高,物以稀為貴明白嗎?不管你的期望薪資多少,都有可能實現(xiàn),這只是時間問題.9.如果一家小公司通過獵頭找到你,即使公司在小,也比外面那些40,50人的公司還要好.不要覺得公司不行,擔(dān)心會倒閉.放心吧,至少活1年是沒問題的.10.不要把自己綁在android上,有空也研究下IOS(最近小弟就準(zhǔn)備研究ios,剛買了6本書...).11.移動互聯(lián)網(wǎng)最少還有10年的快速增長.android最少還有兩年的快速增長.走android這條路是不會錯的.12.有空多學(xué)點開放平臺的SDK.比如新浪微博,騰訊微博,淘寶平臺,支付寶移動支付平臺,快錢移動支付平臺等等..這些都是不愁沒市場的.13.即使技術(shù)再差,也要發(fā)布一個應(yīng)用到market上去.因為這樣你才了解做一個應(yīng)用的邏輯.14.每個月拿到薪水省500-1000元出來.這些錢投在買學(xué)習(xí)資料,去培訓(xùn)班上課...在培訓(xùn)班,花再多的錢也是值得的.15.你真正的價值在項目經(jīng)驗和對底層的認識上.不要忽略基礎(chǔ)知識.16.如果有空把Android的源代碼看一下.底層的東西很枯燥,但這些很值得學(xué).17..程序員其實是藝術(shù)家.代碼重構(gòu)和設(shè)計模式,是非常非常重要的東西,必須要學(xué)
18.不要去維護一個項目,要去做一個項目.19.一開始不要輕易去大公司,雖然大公司是可以讓你呆一輩子的.但你的起點低,以后成就也低.20:每天早上提前20分鐘上班,5分鐘把今天的工作計劃寫好.15分鐘用來看各大It論壇的新聞.21:如果以前沒做過java,那就把SSH看下,自己搭建一個小服務(wù)器.這是為了接私活用.22:PS一定要學(xué),接私活用.23:多下載市面上好的應(yīng)用,每天都用,只有這樣你才能了解市場.現(xiàn)在所有的APK都可以反編譯,看源代碼麻煩,但看layout和圖片很容易,所以....你懂的.24.要有羞恥心.25.老板僅僅要求你把東西做完,需求完成.但你必須對自己要更嚴(yán)格一點.寫一段代碼,從網(wǎng)上復(fù)制一份代碼,并不是可以用就行了,你還必須明白他的原理,為什么這樣就可以?這才是對你最有用的地方,這也是你今后薪資增長的保證.26.要懂得舍得.移動領(lǐng)域發(fā)展太快,必要時必須要用錢換時間.不然你會遠遠落后別人(我之前花了4000大洋去培訓(xùn)班學(xué)IOS三天).27.要明白自己想要什么,什么才能最大性價比提高你的能力.對我來說,能讓我提高最大的,就是Android和IOS同時會,并且自己可以做架構(gòu)設(shè)計.28.看android技術(shù)書籍最快的學(xué)習(xí)方法,先通讀一次.然后把書本上的demo一個一個寫出來.不要覺得太容易不去寫.很多東西都是這樣,看起來簡單,但做起來難.最后再對照自己寫出來的程序代碼去理解書本的意思.29.應(yīng)用和游戲是2個方向,沒有一個公司會同時做游戲又做應(yīng)用,即使是外包公司,大多也只做一塊.專精一個就可以了.30.每次做完一個項目,要強迫自己做總結(jié),通過這個項目,我學(xué)到了什么新技術(shù)?犯了哪些
SB錯誤?
31.一家小公司,如果有正式財務(wù)部,那肯定是正規(guī)的,不要擔(dān)心欠薪問題.如果沒有,就說不準(zhǔn)了.bbs.12580life.com
第二篇:Android RIL&Call學(xué)習(xí)總結(jié)
Android RIL與Call代碼學(xué)習(xí)總結(jié)
前言
本文分五部分:Android電信業(yè)務(wù)系統(tǒng)、RIL、Telephony APP Framework、Phone APP、Android通話簡單流程。
1、Android電信業(yè)務(wù)系統(tǒng)主要敘述Android整個電信業(yè)務(wù)系統(tǒng)的軟件架構(gòu)。
2、RIL主要敘述Android Radio Interface Layer相關(guān)要點,涉及的代碼主要放在hardwareril目錄下。
3、Telephony APP Framework主要簡述電信業(yè)務(wù)系統(tǒng)Framework部分代碼相關(guān)要點,涉及的代碼主要放在frameworksbasetelephony目錄下。
4、Phone APP主要敘述Android的電話業(yè)務(wù)模塊,涉及的代碼主要放在packagesappsPhone目錄下。
5、Android通話簡單流程主要敘述從上層Phone APP發(fā)起電話的函數(shù)調(diào)用流程。
一、Android電話業(yè)務(wù)系統(tǒng)
簡單的說由三部分組成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)
二、RIL RIL(Radio Interface Layer),是Android電信業(yè)務(wù)系統(tǒng)和底層硬件之間的抽象層,Android提供該層方便用戶移植。手機每次請求相應(yīng)的電信服務(wù),如電話、短信、網(wǎng)絡(luò)連接等,都是通過AT指令與底層硬件進行交互的,拿電話來講,用戶請求撥打電話,需要向RIL發(fā)送相關(guān)的請求,接著RIL按照用戶的請求,調(diào)用相應(yīng)的AT指令發(fā)送接口給底層發(fā)送AT指令,完成用戶撥打電話的流程。簡單的說,對RIL的移植,主要是針對不同的設(shè)備針對AT指令做相應(yīng)的修改。
1、RIL移植層的三個組成部分
1)Vendor RIL 提供AT指令發(fā)送接口 2)RIL Daemon 加載RIL相關(guān)的庫同時初始化RIL,注冊RIL相關(guān)函數(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)絡(luò)模式 requestGetCurrentCalls
獲取當(dāng)前通話 requestDial
請求呼叫 requestWriteSmsToSim
寫入短信至SIM卡 requestHangup
掛斷電話 requestSignalStrength
獲取信號強度 requestRegistrationState
獲取卡注冊狀態(tài) requestOperator
獲取運營商名稱 requestSendSMS
請求發(fā)送短信 requestSetupDataCall
撥號上網(wǎng) requestSMSAcknowledge
短信回報
requestEnterSimPin
請求輸入SIM PIN碼 requestSendUSSD
請求USSD業(yè)務(wù) ? 本文件提供給ril.cpp調(diào)用的外部接口 RIL_Init
RIL初始化 onRequest
AT請求指令接口(異步方式)
getVersion
獲取RIL版本號,當(dāng)前為“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 舉一個例子:
撥打電話,對應(yīng)的requestNumber為RIL_REQUEST_DIAL,對應(yīng)的dispatchFunction為dispatchDial,對應(yīng)的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
設(shè)置網(wǎng)絡(luò)身份和時區(qū) 獲取SIM卡狀態(tài) 輸入PIN碼 輸入PUK碼 輸入PIN2碼 輸入PUK2碼 修改PIN碼 修改PIN2碼 獲取當(dāng)前通話 獲取PDP列表 撥號
獲取IMSI 獲取IMEI 獲取IMEISV 掛斷電話 接聽電話 電話拒接
獲取Call失敗錯誤碼 獲取PDP失敗錯誤碼 獲取撥號連接失敗錯誤碼
設(shè)置手機靜音模式(靜音/非靜音)獲取手機靜音模式(靜音/非靜音)獲取信號強度 獲取卡注冊狀態(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è)務(wù)操作請求。
RILRequest,電信服務(wù)請求,上層應(yīng)用通過該類與RIL JNI層進行消息的交互,同時RIL JNI層也通過該類與RIL底層進行消息的交互; RILSender,實現(xiàn)上層請求的命令發(fā)送 RILReceiver,負責(zé)接收底層的Response ? 以下是dial的RIL調(diào)用序列 ?上層調(diào)用dial ?設(shè)置Request請求并發(fā)送至RILSender消息處理隊列
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…
send(rr);? RILSender消息處理隊列消息隊列收到EVENT_SEND后往mSocket里邊填寫相應(yīng)請求 ?RILD從mSocket中讀取相應(yīng)的請求為RIL_REQUEST_DIAL,并設(shè)置相應(yīng)的event ?執(zhí)行dispatchDial ? onRequest ? requestDial發(fā)送AT指令
?底層給予responseVoid的響應(yīng)
?RILD向mSocket填寫相應(yīng)的響應(yīng)信息,并往RILReceiver消息隊列發(fā)送 ? processResponse ?processSolicited ?responseVoid(JNI)
三、Telephony APP Framework概述
電信業(yè)務(wù)Framework涉及Call、SMS、SIM卡、PDP等,代碼分為兩個部分,一個是SDK API,一個是平臺內(nèi)部類,不對外開放。這部分簡單的說,就是上層電信業(yè)務(wù)與底層RIL的中間層。
1、Internal Class 1)ADN(Abbreviated Dialing Numbers,縮位撥號)相關(guān)的類 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相關(guān)的類
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ù)連接相關(guān)類
DataConnection:基類,GsmDataConnection和CdmaDataConnection都基于該類擴展實現(xiàn) GsmDataConnection CdmaDataConnection DataConnectionTracker:基類,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于該類進行擴展實現(xiàn) CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相關(guān)類
IccCard:基類,RuimCard和SimCard都由該類進行擴展實現(xiàn) RuimCard SimCard IccRecords:基類,RuimRecords和SIMRecords都基于該類進行擴展實現(xiàn) RuimRecords SIMRecords IccProvider IccUtils 5)SMS相關(guān)類
SMSDispatcher:實現(xiàn)發(fā)送短信
SmsMessageBase:基類,SmsMessage由該類擴展實現(xiàn) SmsMessage:短信PDU包解析
2、SDK API Class 實現(xiàn)SDK API接口,具體架構(gòu)見SDK API文檔
四、Phone APP Android自帶一個Phone App,實現(xiàn)了GSM/CDMA的通話功能,這部分代碼放在packagesappsPhone目錄下。
Phone APP開機就運行了,可以從AndroidManifest.xml設(shè)置的應(yīng)用權(quán)限看出來
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,保持當(dāng)前通話并接聽: internalAnswerCall ? PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,結(jié)束當(dāng)前通話并接聽:
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,結(jié)束通話: 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(電池電量低),具體相對應(yīng)的處理可參見handleMessage ? CallFeaturesSetting 實現(xiàn)通話設(shè)置,此外該類包含一個內(nèi)部類VoiceMailProviderSettings用來實現(xiàn)語音信箱的設(shè)置
? CallCard/ InCallTouchUi 這兩個類都是繼承于FrameLayout,Phone用來實現(xiàn)通話自身的布局需求。
updatePhotoForCallState:更新替代圖片(如果通話號碼有設(shè)置特定代替圖片的)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 通過接收底層藍牙服務(wù)的狀態(tài)消息來改變自身狀態(tài),同時它也會監(jiān)聽通話的狀態(tài)變化。onBluetoothEnabled:開啟藍牙設(shè)備 onBluetoothDisabled:關(guān)閉藍牙設(shè)備 connectHeadset:連接藍牙設(shè)備 audioOn:開啟audio audioOff:關(guān)閉audio redial:通過藍牙設(shè)備重播電話 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)
?關(guān)閉來電鈴聲等,進入接聽流程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機制 ? 通話保持恢復(fù)
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接口,當(dāng)來電的時候會幫助執(zhí)行查詢操作,比如查詢并調(diào)用
Ringer設(shè)置響鈴方式。
當(dāng)來電時,本類會接受到一個PHONE_NEW_RINGING_CONNECTION(Message.what),然后調(diào)用對應(yīng)的方法
onNewRingingConnection(),該方法又會調(diào)用startIncomingCallQuery()方法,該方法就查詢用戶
設(shè)置的鈴聲(可能是系統(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,以防止
再次設(shè)置鈴聲。接著調(diào)用onCustomRingQueryComplete()方法。然后該方法里面會調(diào)用Ringer的ring()
方法啟動響鈴。
********************************Ringer*************************** Ringer的ring()方法會啟動相應(yīng)的響鈴方式。
響鈴之后將會又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()開始.
第三篇:Android的學(xué)習(xí)總結(jié)
Android學(xué)習(xí)總結(jié)
Android的學(xué)習(xí)總結(jié)
現(xiàn)在對于Android的學(xué)習(xí)已有斗個學(xué)期了,但它對我來說其實還是一個大大的謎,還有待我去對它一一揭曉。
在還沒有學(xué)習(xí)Android這門課之前,當(dāng)聽到別人談到它時,知道它離我們很近,但是它給我的感覺卻是那么的神奇,一直就是在聽說著關(guān)于Android系統(tǒng)怎么怎么的新聞,知道它就在我的生活中,離我很近,我也在用它,但還是總有一種很遙不可及的感覺,覺得它不在我的思想里,所以呢,對于這門課《Android系統(tǒng)開發(fā)與實踐》的學(xué)習(xí)很是期待的。
在上一個學(xué)期快要結(jié)束的時候,就聽到老師說了一下,說下一個學(xué)期我們可能會學(xué)習(xí)Android系統(tǒng)的開發(fā),他還說這個Android系統(tǒng)的開發(fā)很值得學(xué)習(xí),很值得我們?nèi)ヌ剿鳎f這個Android還一直在開發(fā)中,是一項很好玩的系統(tǒng),當(dāng)時就很是興奮了,總是會在想Android系統(tǒng)到底是怎樣的,它是如何的深入我們的生活,又是如何的到我們所用的這些設(shè)備當(dāng)中的,這一切都讓我感到很好奇。就這樣帶著一系列的問題走進了 這個學(xué)期,終于就要與它見面了,這門課也就在這樣的背景下,這樣的一種環(huán)境下走進了我的課堂,它給了我一種興奮感,對于它的出現(xiàn),我很是期待的,一開始老師就給我們講解了一些關(guān)于Android的知識,也給我們展示了Android系統(tǒng)開發(fā)的平臺,真的給了我一種奇妙的感覺,它不僅有編譯,它還有一個模擬器,就和我們用的手機一模一樣,上面也有簡單的幾個圖標(biāo):電話、短信等等,真的感覺到了不可思議,感覺到一種神秘,Android系統(tǒng)的開發(fā)就是在這樣的一個平臺上完成的,你可以對它進行你想要的修改,只要是你想到的,你都可以支盡情的嘗試,這讓人興奮。
這門課的學(xué)習(xí)從這里就這樣開始了,《Android系統(tǒng)開發(fā)與實踐》這本課本它是以討論Android系統(tǒng)平臺為基礎(chǔ),并結(jié)合實例講解教程和實踐指導(dǎo)類教材。本書中全方位的講解了Google開放移動應(yīng)用平臺Android的各種特性,深入探討了應(yīng)用程序的基本組件、界面布局的基礎(chǔ),結(jié)合Internet實現(xiàn)通訊錄的設(shè)計和發(fā)送短信實例詳細介紹了Android系統(tǒng)平臺開發(fā) 1
Android學(xué)習(xí)總結(jié) 的步驟和方法,從而實現(xiàn)對Android系統(tǒng)的平臺開發(fā)的深入了解。
基于嵌入式技術(shù)的Android是目前增長速度最快的智能3G手機操作系統(tǒng),其底層系統(tǒng)是以Linux內(nèi)核為基礎(chǔ),用C語言開發(fā);中間層包括函數(shù)庫library和虛擬機Dalvik,用C++語言開發(fā);上層應(yīng)用軟件,包括通話程序,短信程序等,用Java語言開發(fā)。所以,要想好好的學(xué)習(xí)Android系統(tǒng)的開發(fā),那就必須掌握C++和Java語言,它們都是基礎(chǔ)。
Android學(xué)習(xí)并不是那么的容易,你得很努力很認真的去學(xué)習(xí),但如果只是淺淺的了解,那就簡單得多,但并不是這樣的,你得更加深入的去學(xué)習(xí),你才算是懂一點。
Linux是Android開發(fā)的基礎(chǔ),Linux是一套免費使用和自由傳授的類UNIX操作系統(tǒng),它速度快,運行穩(wěn)定,對硬件的配置要求低,兼具了其他系統(tǒng)的優(yōu)點,最關(guān)鍵是可以免費使用,所以Linux得到了迅猛的發(fā)展,我們學(xué)習(xí)Android的開發(fā)就得了解Linux,它常用的一些操作命令是我們必須要理解和掌握的,比如說:su命令,它是最基本的命令之一,常用于不同用戶間切換。例如,如果登錄用戶為user1,要切換為user2,則用如下命令——$su user2 就行了;pwd命令,用于顯示用戶當(dāng)前所在的目錄;cd命令,不僅顯示當(dāng)前狀態(tài),還改變當(dāng)前狀態(tài),它的用法跟DOS下的cd命令基本一致;ls命令,它跟DOS下的dir命令一樣,用于建立磁帶備份系統(tǒng),目前廣泛用于建立文件發(fā)布檔案;gzip命令,用于壓縮文件;mkdir命令,用于建立目錄,跟DOS下的md命令用法幾乎一樣的;cp命令,用于復(fù)制文件或目錄;rm命令,用于刪除文件或目錄;mv命令,用于移動文件和更多文件;reboot命令,重啟命令;halt命令,關(guān)閉命令。這些都是我們學(xué)習(xí)Android系統(tǒng)所必須掌握的。
Android系統(tǒng)的開發(fā)更離不開Java,Java是一種簡單的,面向?qū)ο蟮模植际降模忉寛?zhí)行的,健壯的,安全的,結(jié)構(gòu)中立的,可移植的,高效率的,多線程的和動態(tài)的語言,Java在Android平臺開發(fā)中的應(yīng)用起到了很關(guān)鍵的作用,Android的開發(fā)需要Java的上引動開發(fā)工具,Eclipse開發(fā)工具就是目前最主流的Java開發(fā)工具,Eclipse本身只是一個框架平臺,2
Android學(xué)習(xí)總結(jié)
但是眾多插件的支持使得Eclipse擁有其他功能相對固定的IDE軟件很難具有的靈活性,許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。
Android的學(xué)習(xí)真的不是那么容易的,就一個平臺的搭建就已經(jīng)難到了我,就這樣一個開發(fā)平臺它得有一個Java的環(huán)境,還要有IDE等等,花了一大半的時間終于搭建了一個框架,它的一些插件必須要在線的升級,就是說必須要有網(wǎng)才行,這是一件很難熬的事,但等到搭建好后,那是一種成就感,通過學(xué)習(xí)讓我知道了Android系統(tǒng)也有它的不足之處:安全和隱私,由于手機與互聯(lián)網(wǎng)的緊密聯(lián)系,個人隱私很難得到保護,互聯(lián)網(wǎng)的深入發(fā)展也將會帶來新一輪的隱私危機;運營商仍然能夠影響到Android手機;同類機型用戶減少:在不少手機論壇都會有針對某一型號的資源,而對于Android平臺手機,由于廠商豐富,產(chǎn)品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統(tǒng)一機型的程序強化;過分依賴開發(fā)商,缺少標(biāo)準(zhǔn)的配置等等的,這些的不足都在等待我們?nèi)ヌ剿鳌?/p>
Android系統(tǒng)平臺的結(jié)構(gòu)有:應(yīng)用程序?qū)樱瑧?yīng)用程序框架層,運行庫層,Linux內(nèi)核層。只有了解了這些才能助我們更好的學(xué)習(xí)Android系統(tǒng),Android系統(tǒng)開發(fā)的相關(guān)環(huán)境必須安裝并配置好,這是一個細活:第一得安裝Java環(huán)境,然后還得修改Javadoc的link。第二設(shè)置環(huán)境變量,第三就安裝repo,第四得在線下載Android源碼并更新,第五是編譯Android源碼并得到~/project/Android/cupcake/out目錄,第六在模擬器上運行編譯好的Android源碼,第七編譯linux kernel,第八是編譯模塊,第九編譯SDK。這個安裝步驟我們得一步一步的做好,如果有哪一步做錯了,就會影響到最終的結(jié)果。當(dāng)你把所有的準(zhǔn)備工作做好后,創(chuàng)建一個新的Android項目,你就會有一點點的興奮與成就感,那是一種很自豪的一種享受。
在Android系統(tǒng)的開發(fā)過程當(dāng)中我們要了解和熟悉源碼的獲得,源碼樹結(jié)構(gòu)分析、Android源碼簡要分析、還有Android的移植,作為一個Android開發(fā)者,必要的時候閱讀下Android源碼可以拓寬一下自己的視野和對Android的認知程度,Google的Android的源 3
Android學(xué)習(xí)總結(jié)
碼管理倉庫用的是Git。Android是一個開源手機終端系統(tǒng),基于Linux內(nèi)核,我們可以下載一個Git客戶端,在Windows下安裝Git的客戶端軟件很方便的,安裝完成后,我們建立一個文件夾,就可用于存放將要下載的源碼,主機編譯工具和仿真環(huán)境,對于這些目錄和文件我們還要求會背下來,但得了解,了解它們是我們學(xué)習(xí)Android系統(tǒng)開發(fā)更加的輕松了。
要想學(xué)習(xí)好Android系統(tǒng)的開發(fā),我們光學(xué)一些理論性的知識,那是遠遠不夠的,我們得把理論與實踐結(jié)合起來,才能起到事半功倍的效果,本來對于Android系統(tǒng)開發(fā)的學(xué)習(xí)就應(yīng)該從實踐當(dāng)中去深入的,在學(xué)習(xí)的過程中,我們要有足夠的耐心和足夠的時候,去練習(xí),去實踐。在這門課當(dāng)中的實例,比如,打電話,就讓我們眼前一亮了,我們一直以來每天在做的打電話就是這樣來的,這個實例提起了我們對Android系統(tǒng)的又一興趣,Android系統(tǒng)的開發(fā)不僅給我們的生活帶來了便利,也給我們帶來了歡樂。
這以上就是這一段時間來我對Android系統(tǒng)開發(fā)的學(xué)習(xí)的一個總結(jié)與一個體會,Android系統(tǒng)的開發(fā)真的讓我長了不少的知識,也帶來了不少的見識,雖然我對于它的掌握還不那么的深,學(xué)習(xí)的也還不足,但我還是會一直堅持的學(xué)習(xí)下去,因為它的奇妙,因為我們的生活需要它,它的開發(fā)是永無止境的,它的學(xué)習(xí)也將是永無止境的。
第四篇:Android BroadcastReceiver學(xué)習(xí)總結(jié)
Android BroadcastReceiver學(xué)習(xí)總結(jié)
BroadCast(廣播),概念:一種在系統(tǒng)內(nèi)進行通信的機制.通過這種機制,它能夠?qū)⑾到y(tǒng)中的某個進程的信息或者意圖傳遞到其他的對這些信息或者意圖感興趣的進程.廣播發(fā)送者:想要主動傳遞自己的信息或者意圖給系統(tǒng)或者特定的接收者,以便其作出響應(yīng).廣播接收者:想要接收系統(tǒng)或者特定進程的某些信息或意圖,以便作出相應(yīng)的響應(yīng).Android廣播機制包含三個基本要素: 廣播(Broadcast)-----用于發(fā)送廣播。
廣播接收器(BroadcastReceiver)-----用于接收廣播。
意圖內(nèi)容(Intent)-----用于保存廣播相關(guān)信息的媒介。
廣播的過程:首先在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過濾的信息(如Action、Category)裝入一個Intent對象,然后通過調(diào)用Context.sendBroadcast()、Context.sendOrderBroadcast()方法,把Intent對象以廣播的方式發(fā)出去。當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊的BroadcastReceiver會檢查注冊時的Intentfilter是否與發(fā)送的Intent相匹配,若匹配就會調(diào)用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法,onReceiver()方法執(zhí)行完成后,BroadcastReceiver的實例就會銷毀。
sendBroadCast():發(fā)送普通廣播可以在同一時刻被所有接收者收到
優(yōu)點:消息傳遞效率高
缺點:各個接收者之間無法通信,無法終止消息傳播
sendOrderedBroadCast:發(fā)送有序廣播
接收者將按預(yù)先聲明的優(yōu)先級依次接收廣播消息 優(yōu)先級設(shè)置: android:priority(-1000∽1000)數(shù)越大級別越高 也可調(diào)用IntentFilter對象的setPriority()設(shè)置
上一個接收者可往廣播中壓入數(shù)據(jù)傳遞給下一個接收者
任意一個接收者都可終止廣播的傳播,下一個就不能接收 注意:
如果找不到合適的BroadcastReceiver組件,應(yīng)用不會有任何問題。onReceiver()方法不能在10秒執(zhí)行完成,會認為該進程無響應(yīng)。彈出ANR(application no response)的對話框。
源代碼實例如下: 發(fā)送普通廣播: Aactivity:
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button =(Button)findViewById(R.id.button1);button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0){ Intent intent = new Intent();
intent.setAction(“com.coslay.action.CUSTOM_BROADCAST”);intent.putExtra(“msg”,“簡單的消息”);sendBroadcast(intent);} });} 程序啟動BroadcastReceiver只需要兩步: 創(chuàng)建需要啟動的BroadcastReceiver的Intent 調(diào)用Context的sendBroadcast()或sendOrderedBroadcast()方法來啟動指定的BroadcastReceiver BroadcastReceiver:
public class CustomReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1){
Toast.makeText(arg0, “接收到的Intent的Action為:”+arg1.getAction()+“n消息內(nèi)容是:”+arg1.getStringExtra(“msg”), Toast.LENGTH_LONG).show();} 只要重寫B(tài)roadcastReceiver的onReceive(Context context,Intent intent)方法即可。然后在如下注冊監(jiān)聽器即可。
AndroidManifest.xml:
指定該BroadcastReceiver能匹配的Intent有兩種方式: 1.使用代碼進行指定: IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);SomeReceiver receiver = new SomeReceiver();registerReceiver(receiver,filter);2.在AndroidManifest.xml文件中配置。如上所示。發(fā)送有序廣播: Aactivity:
button2 =(Button)findViewById(R.id.button2);button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent();
intent.setAction(“com.coslay.action.SORTED_BROADCAST”);intent.putExtra(“msg”, “簡單的消息”);sendOrderedBroadcast(intent, null);} });BroadcastReceiver:
public class SortedBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){
Toast.makeText(context, “接收到的Intent的Action為:”+intent.getAction()+“n消息內(nèi)容是:”+intent.getStringExtra(“msg”), Toast.LENGTH_LONG).show();//創(chuàng)建一個Bundle對象,并存入數(shù)據(jù) Bundle bundle = new Bundle();//將bundle存入結(jié)果中
bundle.putString(“first”, “第一個BroadcastReceiver存入的消息”);setResultExtras(bundle);//取消Broadcast的繼續(xù)傳播 //abortBroadcast();} } 優(yōu)先接收到Broadcast的接收者可以通過 setResultExtras(bundle);方法將處理結(jié)果存入Broadcast中,然后傳給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true)可以獲取上一個接收者存入的數(shù)據(jù)。
AndroidManifest.xml:
接收系統(tǒng)廣播(接收開機廣播啟動服務(wù)): BroadcastReceiver如下: public class LaunchReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Intent tIntent = new Intent(context , LaunchService.class);// 啟動指定Service context.startService(tIntent);} } Service如下: public class LaunchService extends Service { @Override public IBinderonBind(Intent intent){ return null;} @Override public void onCreate(){ // 定義1秒執(zhí)行一行輸出 new Timer().schedule(new TimerTask(){ @Override public void run(){ System.out.println(“-----” + new Date()+ “-----”);} }, 0, 1000);} } AndroidManifest.xml: BroadcastReceiver可以實現(xiàn)Service與Activity之間的通信: Activity如下: public class MusicBox extends Activity implements OnClickListener { // 獲取界面中顯示歌曲標(biāo)題、作者文本框 TextView title, author;// 播放/暫停、停止按鈕 ImageButton play, stop;ActivityReceiveractivityReceiver;public static final String CTL_ACTION = “org.crazyit.action.CTL_ACTION”;public static final String UPDATE_ACTION = “org.crazyit.action.UPDATE_ACTION”;// 定義音樂的播放狀態(tài),0x11代表沒有播放;0x12代表正在播放;0x13代表暫停 int status = 0x11;String[] titleStrs = new String[] { “心愿”, “約定”, “美麗新世界” };String[] authorStrs = new String[] { “未知藝術(shù)家”, “周蕙”, “伍佰” }; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main);// 獲取程序界面界面中的兩個按鈕 play =(ImageButton)this.findViewById(R.id.play);stop =(ImageButton)this.findViewById(R.id.stop);title =(TextView)findViewById(R.id.title);author =(TextView)findViewById(R.id.author);// 為兩個按鈕的單擊事件添加監(jiān)聽器 play.setOnClickListener(this);stop.setOnClickListener(this);activityReceiver = new ActivityReceiver();// 創(chuàng)建IntentFilter IntentFilter filter = new IntentFilter();// 指定BroadcastReceiver監(jiān)聽的Action filter.addAction(UPDATE_ACTION);// 注冊BroadcastReceiver registerReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 啟動后臺Service startService(intent);} // 自定義的BroadcastReceiver,負責(zé)監(jiān)聽從Service傳回來的廣播 public class ActivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ // 獲取Intent中的update消息,update代表播放狀態(tài) int update = intent.getIntExtra(“update”,-1);// 獲取Intent中的current消息,current代表當(dāng)前正在播放的歌曲 int current = intent.getIntExtra(“current”,-1);if(current >= 0){ title.setText(titleStrs[current]);author.setText(authorStrs[current]);} switch(update){ case 0x11: play.setImageResource(R.drawable.play);status = 0x11;break;// 控制系統(tǒng)進入播放狀態(tài) case 0x12: // 播放狀態(tài)下設(shè)置使用暫停圖標(biāo) play.setImageResource(R.drawable.pause);// 設(shè)置當(dāng)前狀態(tài) status = 0x12;break;// 控制系統(tǒng)進入暫停狀態(tài) case 0x13: // 暫停狀態(tài)下設(shè)置使用播放圖標(biāo) play.setImageResource(R.drawable.play);// 設(shè)置當(dāng)前狀態(tài) status = 0x13;break;} } } @Override public void onClick(View source){ // 創(chuàng)建Intent Intentintent = new Intent(“org.crazyit.action.CTL_ACTION”);switch(source.getId()){ // 按下播放/暫停按鈕 case R.id.play: intent.putExtra(“control”, 1);break;// 按下停止按鈕 case R.id.stop: intent.putExtra(“control”, 2);break;} // 發(fā)送廣播,將被Service組件中的BroadcastReceiver接收到 sendBroadcast(intent);} } Service的實例代碼如下: public class MusicService extends Service { MyReceiverserviceReceiver;AssetManager am;String[] musics = new String[] { “wish.mp3”, “promise.mp3”, “beautiful.mp3” };MediaPlayermPlayer;// 當(dāng)前的狀態(tài),0x11 代表沒有播放 ;0x12代表 正在播放;0x13代表暫停 int status = 0x11;// 記錄當(dāng)前正在播放的音樂 int current = 0; @Override public IBinderonBind(Intent intent){ return null;} @Override public void onCreate(){ am = getAssets();// 創(chuàng)建BroadcastReceiver serviceReceiver = new MyReceiver();// 創(chuàng)建IntentFilter IntentFilter filter = new IntentFilter();filter.addAction(MusicBox.CTL_ACTION);registerReceiver(serviceReceiver, filter);// 創(chuàng)建MediaPlayer mPlayer = new MediaPlayer();// 為MediaPlayer播放完成事件綁定監(jiān)聽器 mPlayer.setOnCompletionListener(new OnCompletionListener()//① { @Override public void onCompletion(MediaPlayermp){ current++;if(current >= 3){ current = 0;} // 發(fā)送廣播通知Activity更改文本框 Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“current”, current);// 發(fā)送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);// 準(zhǔn)備、并播放音樂 prepareAndPlay(musics[current]);} });super.onCreate();} public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent){ int control = intent.getIntExtra(“control”,-1);switch(control){ // 播放或暫停 case 1: // 原來處于沒有播放狀態(tài) if(status == 0x11){ // 準(zhǔn)備、并播放音樂 prepareAndPlay(musics[current]);status = 0x12;} // 原來處于播放狀態(tài) else if(status == 0x12){ // 暫停 mPlayer.pause();// 改變?yōu)闀和顟B(tài) status = 0x13;} // 原來處于暫停狀態(tài) else if(status == 0x13){ // 播放 mPlayer.start();// 改變狀態(tài) status = 0x12;} break;// 停止聲音 case 2: // 如果原來正在播放或暫停 if(status == 0x12 || status == 0x13){ // 停止播放 mPlayer.stop();status = 0x11;} } // 發(fā)送廣播通知Activity更改圖標(biāo)、文本框 Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“update”, status);sendIntent.putExtra(“current”, current);// 發(fā)送廣播,將被Activity組件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);} } private void prepareAndPlay(String music){ try { // 打開指定音樂文件 AssetFileDescriptorafd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加載指定的聲音文件。mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());// 準(zhǔn)備聲音 mPlayer.prepare();// 播放 mPlayer.start();} catch(IOException e){ e.printStackTrace();} } } 1應(yīng)用程序配置全屏 應(yīng)用程序配置全屏: android:theme=“@android:style/Theme.NoTitleBar.Fullscreen” /> 【bug】 但是系統(tǒng)提示的是: android:style/Theme_NoTitleBar_Fullscreen ——錯誤的配置 Android的bug。 去掉標(biāo)題欄: android:theme=“@android:style/Theme.NoTitleBar” 2 Dialog Dialog dialog = new AlertDialog.Builder(LoginActivity.this) .setTitle(“退出確認”) .setMessage(“確定退出程序?”) .setPositiveButton(“確定”,new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog,@Override int which){})new DialogInterface.OnClickListener(){ //事件處理} public void onClick(DialogInterface dialog,.setNeutralButton(“取消”,int which){//取消 } }).create();dialog.show(); 3只有豎屏 4線程 new Thread(){public void run(){} try {} sleep(3000);// 等待三秒,自動進入軟件主窗口 Intent intent = new Intent(MainActivity.this,LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);finish();e.printStackTrace();} catch(Exception e){ }.start(); 5Tabhost 總結(jié) // 生成一個TabSpec對象,這個對象代表了一個頁 TabHost.TabSpec listSpec = tabHost.newTabSpec(“tabSpecTag”); 在listSpec添加其他屬性時 通過 // 設(shè)置該頁的indicator listSpec.setIndicator(bookTab); 此bookTab 是一個View對象 例如布局 布局里面可以套View 這樣實現(xiàn)自定義選項卡的效果 6獲取在layout布局中xxx.xml的實例 LayoutInflatermInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.item1, null); 此處item1就是 一個布局文件第五篇:Android 學(xué)習(xí)總結(jié)1(范文)