第一篇:黑馬程序員Android就業(yè)面試技巧系列-技術(shù)篇(敏捷開(kāi)發(fā)一)
【濟(jì)南中心】Android就業(yè)面試技巧系列-技術(shù)篇(敏捷開(kāi)發(fā)
一)
敏捷開(kāi)發(fā)由來(lái)
2001年2月11日到13日,17位軟件開(kāi)發(fā)領(lǐng)域的領(lǐng)軍人物聚集在美國(guó)猶他州的滑雪勝地雪 鳥(niǎo)(Snowbird)雪場(chǎng)。經(jīng)過(guò)兩天的討論,“敏捷”(Agile)這個(gè)詞為全體聚會(huì)者所接受,用以概括一套全新的軟件開(kāi)發(fā)價(jià)值觀。這套價(jià)值觀,通過(guò)一 份簡(jiǎn)明扼要的《敏捷宣言》傳遞給世界,同時(shí)即宣告了敏捷開(kāi)發(fā)運(yùn)動(dòng)的開(kāi)始?!睹艚菪浴?/p>
我們通過(guò)身體力行和幫助他人來(lái)揭示更好的軟件開(kāi)發(fā)方式。經(jīng)由這項(xiàng)工作,我們形成了如下價(jià)值觀:
個(gè)體與交互
重于 過(guò)程和工具 可用的軟件
重于 完備的文檔 客戶(hù)協(xié)作
重于 合同談判 響應(yīng)變化
重于 遵循計(jì)劃
在每對(duì)比對(duì)中,后者并非全無(wú)價(jià)值,但我們更看重前者。敏捷開(kāi)發(fā)模式
敏捷開(kāi)發(fā)是一種以人為核心、迭代、循序漸進(jìn)的開(kāi)發(fā)方法。敏捷方法強(qiáng)調(diào)以人為本,專(zhuān)注于交付對(duì)客戶(hù)有價(jià)值的軟件。在高度協(xié)作的開(kāi)環(huán)境中,使用迭代式的方式進(jìn)行增量開(kāi)發(fā),經(jīng)常使用反饋進(jìn)行思考、反省和總結(jié),不停的進(jìn)行自我調(diào)整和完善.敏捷開(kāi)發(fā),相對(duì)傳統(tǒng)軟件開(kāi)發(fā)模式,它主要是針對(duì)快速變化的需求,不斷優(yōu)化管理流程,最終推出優(yōu)質(zhì)軟件.黑馬程序員濟(jì)南中心 編著
敏捷開(kāi)發(fā)的宣言
一:個(gè)體及交互比流程與工具更具價(jià)值 二:可用的軟件比冗長(zhǎng)的文檔更有價(jià)值 三:與客戶(hù)的協(xié)作比合同談判更有價(jià)值 四:對(duì)變化的響應(yīng)比遵循計(jì)劃更有價(jià)值 5個(gè)價(jià)值
1.承諾 – 愿意對(duì)目標(biāo)做出承諾
2.專(zhuān)注– 把你的心思和能力都用到你承諾的工作上去 3.開(kāi)放– Scrum 把項(xiàng)目中的一切開(kāi)放給每個(gè)人看 4.尊重– 每個(gè)人都有他獨(dú)特的背景和經(jīng)驗(yàn)
5.勇氣– 有勇氣做出承諾,履行承諾,接受別人的尊重 Scrum的重要名詞
Backlog一次迭代開(kāi)發(fā)的時(shí)間周期,一般最多以30天為一個(gè)周期。在這段時(shí)間內(nèi),開(kāi)發(fā)團(tuán)隊(duì)需要完成一個(gè)制定的Backlog。
Product Owner負(fù)責(zé)監(jiān)督整個(gè)Scrum進(jìn)程、修訂計(jì)劃的一個(gè)團(tuán)隊(duì)成員。研發(fā)項(xiàng)目管理經(jīng)理
流程經(jīng)理 敏捷教練 開(kāi)發(fā)主管
Sprint planning meeting開(kāi)發(fā)團(tuán)隊(duì)成員參加,一般為15分鐘。每個(gè)開(kāi)發(fā)成員需要向Scrum Master匯報(bào)三個(gè)項(xiàng)目:今天完成了什么? 是否遇到了障礙? 即將要做什么?通過(guò)該會(huì)議,團(tuán)隊(duì)成員可以相互了解項(xiàng)目進(jìn)度。
Sprint review meeting對(duì)剛結(jié)束的Sprint進(jìn)行總結(jié)。會(huì)議的參與人員為團(tuán)隊(duì)開(kāi)發(fā)的內(nèi)部人員。一般該會(huì)議為3小時(shí)。
PBI Product Backlog Item 產(chǎn)品待辦清單條目,簡(jiǎn)稱(chēng)PBI 敏捷開(kāi)發(fā)成員架構(gòu) Scrum Master
負(fù)責(zé)管理Scrum流程,確保Scrum正常運(yùn)轉(zhuǎn)。Scrum Master是教練,是牧羊犬,是Scrum項(xiàng)目秩序的維護(hù)者。
· 負(fù)責(zé)監(jiān)督整個(gè)Scrum項(xiàng)目進(jìn)程,調(diào)整項(xiàng)目計(jì)劃 · 確保開(kāi)發(fā)團(tuán)隊(duì)成員的能力能夠勝任產(chǎn)品的開(kāi)發(fā);
· 促進(jìn)團(tuán)隊(duì)中不同角色的成員間充分交流和溝通,并負(fù)責(zé)為項(xiàng)目的進(jìn)行掃除障礙; · 保證開(kāi)發(fā)團(tuán)隊(duì)不受外力的干擾和阻撓;
· 掌握產(chǎn)品開(kāi)發(fā)進(jìn)度,參與每日Scrum會(huì)議、Sprint計(jì)劃會(huì)議和Sprint評(píng)審會(huì)議?!?Scrum Master最經(jīng)常的情況就是由過(guò)去的項(xiàng)目組長(zhǎng)(Team leader)來(lái)?yè)?dān)當(dāng) 產(chǎn)品負(fù)責(zé)人 Product Owner
負(fù)責(zé)管理產(chǎn)品Backlog 并使游戲項(xiàng)目?jī)r(jià)值最大化,代表項(xiàng)目的全體利益相關(guān)者。
黑馬程序員濟(jì)南中心 編著
Product Owner的角色通常由市場(chǎng)部門(mén)的人員或開(kāi)發(fā)部門(mén)內(nèi)部主要使用該產(chǎn)品的人來(lái)?yè)?dān)任,他的主要工作是根據(jù)市場(chǎng)需求,確定產(chǎn)品的功能,列入Product Backlog中,并為這些功能確定優(yōu)先級(jí)別。
Scrum團(tuán)隊(duì)按照功能的優(yōu)先級(jí),將它們從高到低分配到各個(gè)Sprint中進(jìn)行開(kāi)發(fā),這些被分配到一個(gè)Sprint中完成的功能就形成了Sprint Backlog。
在產(chǎn)品的整個(gè)開(kāi)發(fā)過(guò)程中,Product Owner對(duì)于產(chǎn)品的需求可能會(huì)發(fā)生改變。他可以修改Product Backlog,增加某些功能需求、刪除某些功能需求、修改優(yōu)先級(jí)等等,但這些行為只能在各個(gè)Sprint之間進(jìn)行 團(tuán)隊(duì)
團(tuán)隊(duì)是負(fù)責(zé)開(kāi)發(fā)軟件的跨職能小組。團(tuán)隊(duì)是自我管理的,在Scrum Master 的幫助下,團(tuán)隊(duì)提出承諾,完成自己的承諾,實(shí)現(xiàn)軟件價(jià)值。
一般由5-10個(gè)能全職工作的成員組成較為理想;團(tuán)隊(duì)成員橫跨各個(gè)職能,通常包含開(kāi)發(fā),測(cè)試,文檔設(shè)計(jì)人員等等。敏捷開(kāi)發(fā)團(tuán)隊(duì)原則 最大的分歧
最大的分歧在于開(kāi)發(fā)人員和測(cè)試人員之間。作為敏捷團(tuán)隊(duì)的成員,測(cè)試人員被期望能編寫(xiě)一點(diǎn)代碼,同時(shí)開(kāi)發(fā)人員可以做一 些測(cè)試。各自的強(qiáng)項(xiàng)還是很重要:新的角色要求每個(gè)成員成為大家所謂的“通才”。測(cè)試人員大多數(shù)時(shí)間作測(cè)試,開(kāi)發(fā)人員大都編寫(xiě)代碼,但所有人都分享他們的工 作,而且有能力承擔(dān)他們面前的任務(wù)。發(fā)現(xiàn)中立點(diǎn)
團(tuán)隊(duì)決定作為一個(gè)團(tuán)隊(duì)需要做什么,如何最好地分配工作。第一步是讓團(tuán)隊(duì)成員說(shuō)說(shuō)他們自己的技能集、優(yōu)點(diǎn)和缺點(diǎn)。但卻不希望他們根據(jù)以前角色(如,軟件測(cè)試員或開(kāi)發(fā)員)來(lái)定
黑馬程序員濟(jì)南中心 編著
義自己。所以找到一個(gè)中立點(diǎn),列出了小型離線(xiàn)會(huì)議,和每周工作之外的小時(shí)集體活動(dòng)所需的事項(xiàng)。正確執(zhí)行應(yīng)用程序
團(tuán)隊(duì)找到了讓自己感到舒服的新水平。整個(gè)項(xiàng)目的工作流程順利進(jìn)行,只做一個(gè)待辦的事情,而不是四個(gè)。Scrum過(guò)程簡(jiǎn)單介紹 將整個(gè)產(chǎn)品的Backlog分解成若干Sprint Backlog,每個(gè)Sprint Backlog是按照目前的人力物力條件可以完成的。召開(kāi)Sprint planning meeting,劃分、確定這個(gè)Sprint內(nèi)需要完成的任務(wù),標(biāo)注任務(wù)的優(yōu)先級(jí)并分配給每個(gè)成員。進(jìn)入Sprint開(kāi)發(fā)周期,在這個(gè)周期內(nèi),每天需要召開(kāi)Daily Scrum meeting。4 整個(gè)Sprint周期結(jié)束,召開(kāi)Sprint review meeting,將成果演示給Product Owner。5 團(tuán)隊(duì)成員最后召開(kāi)Sprint retrospective meeting,總結(jié)問(wèn)題和經(jīng)驗(yàn)。6 周而復(fù)始,按照同樣的步驟進(jìn)行下一次Sprint。敏捷開(kāi)發(fā)流程
黑馬程序員濟(jì)南中心 編著
敏捷開(kāi)發(fā)模型流程圖
從敏捷開(kāi)發(fā)流程模型圖當(dāng)中可以看出,在敏捷實(shí)施過(guò)程當(dāng)中,有四種會(huì)議,分別是計(jì)劃會(huì),每日站會(huì),回顧會(huì),評(píng)審會(huì),其中數(shù)計(jì)劃會(huì)最為重要。在敏捷開(kāi)發(fā)模式中,每種會(huì)議都有其特殊的職責(zé)和使命,不同的會(huì)議上所討論的內(nèi)容是不一致的,只要把握住會(huì)議的關(guān)鍵點(diǎn),就可以為團(tuán)隊(duì)的敏捷模式服務(wù)。
Sprint Planning敏捷迭代計(jì)劃會(huì)議 1 Sprint Planning敏捷迭代計(jì)劃會(huì)議
在每個(gè)敏捷迭代開(kāi)始之初,由產(chǎn)品負(fù)責(zé)人講解需求,并由開(kāi)發(fā)團(tuán)隊(duì)進(jìn)行估算工時(shí)的計(jì)劃會(huì)議。在會(huì)議上需要:排列需求優(yōu)先級(jí);分析和評(píng)估產(chǎn)品Backlog并確定該迭代的目標(biāo);計(jì)劃會(huì)議上還需要制定迭代計(jì)劃,包括: 根據(jù)產(chǎn)品Backlog(功能點(diǎn))創(chuàng)建Sprint Backlog(即迭代任務(wù));然后為Sprint backlog中的任務(wù)做估算;團(tuán)隊(duì)成員從產(chǎn)品Backlog中挑選他們承諾完成的條目。
敏捷的迭代實(shí)現(xiàn)始于計(jì)劃會(huì)議,所以一個(gè)好的計(jì)劃會(huì)議是每個(gè)迭代成功的基礎(chǔ),一般分兩個(gè)階段進(jìn)行,兩個(gè)階段參與會(huì)議的人員會(huì)不一樣; 計(jì)劃會(huì)議的目標(biāo):
黑馬程序員濟(jì)南中心 編著
1、基于敏捷規(guī)劃產(chǎn)生的Product Backlog以及優(yōu)先級(jí),通過(guò)計(jì)劃會(huì)議,確定迭代的目標(biāo)、團(tuán)隊(duì)成員、形成Sprint Backlog,明確評(píng)審會(huì)、回顧會(huì)時(shí)間;
2、分解Sprint Backlog并確定相應(yīng)的完成時(shí)間,并由團(tuán)隊(duì)成員共同挑選這些Sprint Backlog;
階段一參與人員:產(chǎn)品經(jīng)理、Product Owner、Scrum Master、團(tuán)隊(duì)成員,有業(yè)務(wù)人員的話(huà)還可以邀請(qǐng)業(yè)務(wù)人員一起參加。會(huì)議時(shí)長(zhǎng):1-4小時(shí) 一般參考進(jìn)程安排如下:
1、Scrum Master公開(kāi)迭代時(shí)間表;
2、產(chǎn)品經(jīng)理和Product Owner講述Product Backlog,對(duì)應(yīng)的業(yè)務(wù)價(jià)值和優(yōu)先級(jí);
3、團(tuán)隊(duì)針對(duì)Sprint Backlog和優(yōu)先級(jí)達(dá)成一致;
4、Scrum Master和團(tuán)隊(duì)成員共同確定Sprint Backlog; 階段二參與人員:Scrum Master、團(tuán)隊(duì)成員,其他人員選擇性參加 會(huì)議時(shí)長(zhǎng):1-4小時(shí) 一般參考進(jìn)程安排如下:
1、團(tuán)隊(duì)成員針對(duì)Sprint Backlog共同分解任務(wù);
2、團(tuán)隊(duì)成員共同進(jìn)行工作量評(píng)估(每個(gè)Task不超過(guò)2天),確定開(kāi)始時(shí)間和完成時(shí)間;
3、團(tuán)隊(duì)成員共同認(rèn)領(lǐng)任務(wù);
4、共同確定DoD,團(tuán)隊(duì)達(dá)成一致;
5、團(tuán)隊(duì)共同確認(rèn)迭代目標(biāo)和價(jià)值;
如果單個(gè)迭代內(nèi)安排的Product Backlog安排的比較多的話(huà),一般迭代計(jì)劃會(huì)議需要開(kāi)一個(gè)整天,雖然時(shí)間有點(diǎn)長(zhǎng),但這個(gè)會(huì)議會(huì)確認(rèn)整個(gè)迭代的詳細(xì)計(jì)劃和安排,因此也是值得的。
黑馬程序員濟(jì)南中心 編著
一個(gè)典型的Sprint計(jì)劃會(huì)議時(shí)間表
Sprint 計(jì)劃會(huì)議:13:00 – 17:00(建議每小時(shí)休息10分鐘)
13:00 – 13:30 產(chǎn)品負(fù)責(zé)人對(duì)Sprint目標(biāo)進(jìn)行總體介紹,概括產(chǎn)品Backlog。定下演示的時(shí)間地點(diǎn)。
13:30 – 15:00 團(tuán)隊(duì)估算時(shí)間,在必要的情況下拆分Backlog條目——把“故事”進(jìn)一步拆分成“任務(wù)”。產(chǎn)品負(fù)責(zé)人在必要時(shí)修改重要性評(píng)分。理清每個(gè)條目的含義。所有重要性高的Backlog條目都要填寫(xiě)“如何演示”。
15:00 – 16:00 團(tuán)隊(duì)選擇要放入Sprint中的故事。計(jì)算生產(chǎn)率,用作核查工作安排的基礎(chǔ)。16:00 – 17:00 為每日Scrum會(huì)議(簡(jiǎn)稱(chēng)每日例會(huì))安排固定的時(shí)間地點(diǎn)——如果和上次不同的話(huà)。
Sprint應(yīng)該多長(zhǎng)才好?
時(shí)間短就好。公司會(huì)因此而變得“敏捷”,有利于隨機(jī)應(yīng)變。
短的Sprint = 短反饋周期 = 更頻繁的交付 = 更頻繁的客戶(hù)反饋 = 在錯(cuò)誤方向上花的時(shí)間更少 = 學(xué)習(xí)和改進(jìn)的速度更快 繪制任務(wù)版
任務(wù)版中的任務(wù)是分解到手頭的實(shí)際的工作
把要做的任務(wù),正在做的任務(wù)和已經(jīng)完成的任務(wù),用簡(jiǎn)單的貼士貼在白板上.不同的顏色表示不同的重要程度.開(kāi)發(fā)人員選擇任務(wù)帖在規(guī)定時(shí)間內(nèi)完成任務(wù)
黑馬程序員濟(jì)南中心 編著
敏捷開(kāi)發(fā)遇到的撲克牌(計(jì)劃紙牌)
每個(gè)人都會(huì)得到如上圖所示的13張卡片。在估算故事(任務(wù))的時(shí)候,每個(gè)人都選出一張卡片來(lái)表示他的時(shí)間估算(以故事點(diǎn)的方式表示),并把它正面朝下扣在桌上。所有人都完成以后,桌上的紙牌會(huì)被同時(shí)揭開(kāi)。這樣每個(gè)人都會(huì)被迫進(jìn)行自我思考,而不是依賴(lài)于其他人估算的結(jié)果。
如果在兩個(gè)估算之間有著巨大差異,團(tuán)隊(duì)就會(huì)就此進(jìn)行討論,并試圖讓大家對(duì)故事內(nèi)容達(dá)成共識(shí)。他們也許會(huì)進(jìn)行任務(wù)分解,之后再重新估算。這樣的循環(huán)會(huì)往復(fù)進(jìn)行,直到時(shí)間估算趨于一致為止,也就是每個(gè)人對(duì)這個(gè)故事的估算都差不多相同。2 Daily Stand-up Meeting每日站會(huì)
黑馬程序員濟(jì)南中心 編著
團(tuán)隊(duì)每天進(jìn)行溝通的內(nèi)部短會(huì),因一般只有15分鐘且站立進(jìn)行而得名,團(tuán)隊(duì)成員通常會(huì)在會(huì)議上講述如下3點(diǎn)內(nèi)容: 1)
昨天我做了什么 2)
今天我計(jì)劃要做什么
3)
我遇到了什么問(wèn)題,妨礙了我盡可能有效地工作
Scrum Master記錄會(huì)議上提出的問(wèn)題,但是不要在會(huì)議上討論和解決問(wèn)題,而是要會(huì)后在找相關(guān)人員進(jìn)行討論和解決。3 Sprint Review 敏捷迭代評(píng)審會(huì)議
在迭代結(jié)束前給產(chǎn)品負(fù)責(zé)人演示并接受評(píng)價(jià)的會(huì)議,并根據(jù)反饋結(jié)果,提出新的產(chǎn)品Backlog 參與人員:產(chǎn)品經(jīng)理、Product Owner、Scrum Master、團(tuán)隊(duì)所有成員 會(huì)議時(shí)長(zhǎng):1-4小時(shí),視演示內(nèi)容而定
主要是檢驗(yàn)迭代成果,檢查是否完成迭代計(jì)劃中的迭代目標(biāo),有可能的話(huà)要求用戶(hù)參與測(cè)試流程,并得到用戶(hù)對(duì)產(chǎn)品的認(rèn)可,鼓勵(lì)用戶(hù)自己進(jìn)行測(cè)試設(shè)計(jì)和進(jìn)行破壞性測(cè)試,充分暴露產(chǎn)品的設(shè)計(jì)和功能問(wèn)題。
由Scrum Master來(lái)推進(jìn)會(huì)議進(jìn)程,Product Owner記錄用戶(hù)反饋,根據(jù)結(jié)果維護(hù)產(chǎn)品 backlog,一般在迭代結(jié)束前做一次。4 Sprint Retrospective 敏捷迭代回顧會(huì)議
在每個(gè)迭代結(jié)束后召開(kāi)的關(guān)于自我持續(xù)改進(jìn)的會(huì)議,圍繞如下三個(gè)問(wèn)題進(jìn)行討論: 1)
本次迭代有哪些做得好;
2)
本次迭代我們?cè)谀男┓矫孢€能做得更好; 3)
我們?cè)谙麓蔚鷾?zhǔn)備在哪些方面改進(jìn);
黑馬程序員濟(jì)南中心 編著
團(tuán)隊(duì)確定問(wèn)題優(yōu)先級(jí),并根據(jù)優(yōu)先級(jí)確定團(tuán)隊(duì)能夠解決的Top問(wèn)題;團(tuán)隊(duì)討論Top問(wèn)題的措施,并選擇在下一個(gè)迭代可以完成措施,分配責(zé)任人進(jìn)行跟蹤。參與人員:Scrum Master,Product Owner,團(tuán)隊(duì)成員。會(huì)議時(shí)長(zhǎng):0.5-1.5小時(shí)
主要針對(duì)當(dāng)前迭代,團(tuán)隊(duì)成員自由講述可以需要保持的做法,改進(jìn)的點(diǎn)以及持續(xù)跟蹤計(jì)劃。Scrum Master將團(tuán)隊(duì)討論以及行動(dòng)計(jì)劃形成會(huì)議紀(jì)要,并發(fā)送給整個(gè)團(tuán)隊(duì)和有關(guān)同事。需要按照回顧會(huì)議的結(jié)論,維護(hù)一份待辦事項(xiàng)列表,在下次回顧會(huì)議上進(jìn)行跟蹤。案例分析
案例一:某Team在每日站會(huì)中,Scrum master準(zhǔn)時(shí)組織大家開(kāi)始晨會(huì),成員一個(gè)接著一個(gè)說(shuō),昨天做了什么事情,今天計(jì)劃做什么事情,遇到什么問(wèn)題,成員A說(shuō)昨天遇到了一個(gè)問(wèn)題未能解 決,Scrum master問(wèn)遇到的是什么問(wèn)題,成員A詳細(xì)說(shuō)明了該問(wèn)題,這時(shí)成員B說(shuō)這個(gè)問(wèn)題他也遇到過(guò),他是通過(guò)XX方式解決的,討論后成員A明白了,然后繼續(xù)晨 會(huì),由于小組成員有10個(gè)人,整個(gè)會(huì)議開(kāi)下來(lái)大概花費(fèi)了30分鐘。
問(wèn)題分析:Scrum master不應(yīng)該在每日站會(huì)上詢(xún)問(wèn)詳細(xì)的問(wèn)題細(xì)節(jié),而應(yīng)該轉(zhuǎn)移到會(huì)下詢(xún)問(wèn),當(dāng)團(tuán)隊(duì)成員之間進(jìn)行討論的時(shí)候,Scrum master需要及時(shí)拉回來(lái),討論應(yīng)該轉(zhuǎn)移到會(huì)下進(jìn)行,晨會(huì)要在固定的時(shí)間固定的地方并且在固定的時(shí)間內(nèi)完成。會(huì)議時(shí)間需要控制在15分鐘之內(nèi)。
案例二:某Team在開(kāi)回顧會(huì)議中,Scrum master詳細(xì)總結(jié)了本次迭代中有哪些做不夠好的,并指出了對(duì)應(yīng)的事和人,接著對(duì)應(yīng)的責(zé)任人開(kāi)始述說(shuō)哪些地方確實(shí)是做的不夠好及其原因,最后給出改進(jìn)措施然后結(jié)束會(huì)議。
問(wèn)題分析:回顧會(huì)不是批斗會(huì),不應(yīng)該只說(shuō)做的不好的,做的好的也要說(shuō),Scrum master主要是鼓舞大家的士氣,應(yīng)該先從做的好的方面開(kāi)始說(shuō)起;并且做的不好的方面都只對(duì)事,黑馬程序員濟(jì)南中心 編著
不對(duì)人,做的不好是整個(gè)Team的責(zé)任,不僅僅是某幾個(gè) 人的責(zé)任;最后的改進(jìn)措施需要給有后續(xù)跟蹤的責(zé)任人和有效性的反饋。
在敏捷的迭代執(zhí)行過(guò)程中,上述四種會(huì)議會(huì)隨著每個(gè)迭代一直進(jìn)行,基本上形成了一個(gè)閉環(huán),可以讓團(tuán)隊(duì)在每個(gè)迭代的執(zhí)行過(guò)程當(dāng)中去學(xué)習(xí)和總結(jié),從而正確的按照敏捷的要求去做,使團(tuán)隊(duì)真正的敏捷起來(lái)。
黑馬程序員濟(jì)南中心 編著
第二篇:黑馬程序員android開(kāi)發(fā)筆記(一)
01、什么是3G 02、android系統(tǒng)簡(jiǎn)介 03、android背景介紹 04、android的framewor簡(jiǎn)介 05、兩種虛擬機(jī)的比較 06、sdk的下載以及簡(jiǎn)介 07、創(chuàng)建android模擬器 08、ddms簡(jiǎn)介
09、platform-tools的簡(jiǎn)介及常見(jiàn)adb指令
10、android項(xiàng)目的目錄結(jié)構(gòu)
11、android下apk安裝的過(guò)程
12、常見(jiàn)的adb指令介紹
13、創(chuàng)建模擬器遇到的常見(jiàn)錯(cuò)誤
14、電話(huà)撥號(hào)器
15、點(diǎn)擊事件的四種寫(xiě)法
16、短信發(fā)送器
17、相對(duì)布局&單位介紹
18、現(xiàn)形布局&布局的組合
19、表格布局&絕對(duì)布局 20、幀布局
21、測(cè)試相關(guān)概念
22、android下junit測(cè)試框架配置
23、logcat簡(jiǎn)介
24、保存文件到手機(jī)內(nèi)存
25、android下文件訪(fǎng)問(wèn)的權(quán)限
26、保存文件到SD卡中
27、分析setting源代碼獲取SD卡大小
28、_sharePreference入門(mén)
29、xml文件的序列化 30、采用pull解析xml文件
31、采用斷電調(diào)試的方法觀察pull解析的的流程
32、android下創(chuàng)建一個(gè)sqllite數(shù)據(jù)庫(kù)
33、sql語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
34、系統(tǒng)api實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查&Sqlite3工具的使用
35、數(shù)據(jù)庫(kù)的事物
36、listView入門(mén)
37、采用layoutInflater打氣筒創(chuàng)建一個(gè)view對(duì)象
38、采用數(shù)據(jù)適配器ArryAdapter
39、常用數(shù)據(jù)適配器simpleAdapter 40、數(shù)據(jù)適配器總結(jié)
41、內(nèi)容提供者簡(jiǎn)介
42、內(nèi)容提供者的實(shí)現(xiàn)
43、短信的備份
44、插入一條記錄到系統(tǒng)短信應(yīng)用
45、內(nèi)容觀察者
46、獲取系統(tǒng)的聯(lián)系人信息
47、保存聯(lián)系人到系統(tǒng)通訊錄
48、讀取聯(lián)系人的一個(gè)小細(xì)節(jié)
49、網(wǎng)絡(luò)圖片查看器
50、anr產(chǎn)生的原理&如何避免
51、android消息機(jī)制入門(mén)
52、網(wǎng)絡(luò)html查看器
53、字符亂碼問(wèn)題的處理
54、采用get方式提交數(shù)據(jù)到服務(wù)器
55、采用post方式提交數(shù)據(jù)到服務(wù)器
56、提交數(shù)據(jù)到服務(wù)器中文亂碼問(wèn)題的處理
57、采用httpclient提交數(shù)據(jù)到服務(wù)器
58、異步http框架簡(jiǎn)介&實(shí)現(xiàn)原理
59、異步http框架提交數(shù)據(jù)到服務(wù)器 60、上傳文件到服務(wù)器
61、smartimageview&常見(jiàn)開(kāi)源代碼 62、多線(xiàn)程下載的原理 63、多線(xiàn)程斷點(diǎn)下載的原理
64、多線(xiàn)程java代碼移植到android 65、多線(xiàn)程下載文本頁(yè)面的更新 66、顯示意圖激活另一個(gè)activity 67、隱式意圖激活另一個(gè)activity 68、隱式意圖的配置
69、隱式意圖和顯示意圖的使用場(chǎng)景 70、在不同activity之間數(shù)據(jù)傳遞 71、activity的聲明周期 72、activity的啟動(dòng)模式
73、activity橫豎屏切換的聲明周期 74、開(kāi)啟新的activity獲取他的返回值 75、請(qǐng)求碼和結(jié)果碼的作用 76、利用廣播實(shí)現(xiàn)ip撥號(hào) 77、短信竊聽(tīng)器
78、自定義廣播時(shí)間&發(fā)送自定義廣播&廣播接受者優(yōu)先級(jí) 79、采用服務(wù)執(zhí)行長(zhǎng)期后臺(tái)操作 80、采用服務(wù)竊聽(tīng)電話(huà)&服務(wù)的聲明周期 81、android進(jìn)程優(yōu)先級(jí)&為什么使用服務(wù) 82、綁定方式開(kāi)啟服務(wù)&調(diào)用服務(wù)的方法 83、服務(wù)的聲明周期(混合開(kāi)啟 84、采用aidl綁定遠(yuǎn)程服務(wù)
85、代碼注冊(cè)廣播接受者&利用廣播調(diào)用服務(wù)的辦法 86、加載大圖片到內(nèi)存 87、獲取圖片exif信息 88、從gallery獲取圖片 89、圖片畫(huà)畫(huà)板 90、扒開(kāi)美女衣服 91、圖片的縮放 92、圖片的旋轉(zhuǎn)
93、圖片的平移&鏡面&倒影效果 94、圖片的合成 95、圖片的顏色處理 96、多媒體播放api簡(jiǎn)介 97、人臉識(shí)別
98、mediaplayer的生命周期 99、soundpoo簡(jiǎn)介
100、sufaceview的生命周期 101、播放在線(xiàn)視頻
102、視頻播放器進(jìn)度的處理 103、調(diào)用系統(tǒng)照相機(jī)拍照和錄像 104、采用camera拍照 105、常見(jiàn)對(duì)話(huà)框 106、notification入門(mén) 107、菜單
108、android下的樣式 109、android下的主題
110、代碼編寫(xiě)ui 111、html創(chuàng)建ui 112、幀動(dòng)畫(huà)
113、代碼創(chuàng)建創(chuàng)建的tween動(dòng)畫(huà) 114、xml文件定義動(dòng)畫(huà) 115、傳感器簡(jiǎn)介 116、117、殺死進(jìn)程 118、apk的安裝 119、應(yīng)用程序的反編譯 120、動(dòng)態(tài)創(chuàng)建fragment 121、用fragment創(chuàng)建一個(gè)選項(xiàng)卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之間的通訊 125、應(yīng)用程序國(guó)際化
04、android的framewor簡(jiǎn)介
Wap:wait and play Wireless Makeup Language(WML)精簡(jiǎn)的html語(yǔ)言 Applications:android自帶的基本上層應(yīng)用 Aplication framework:應(yīng)用程序框架 Librarics: Linux lernel:
05、兩種虛擬機(jī)的比較
編譯后文件格式:
jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架構(gòu):
jvm:基于棧的架構(gòu)
dalvik vm:基于寄存器的架構(gòu)
Cpu直接訪(fǎng)問(wèn)寄存器因此dalvik虛擬機(jī)的效率比jvm高
06、sdk的下載以及簡(jiǎn)介
->獲取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,實(shí)際上是eclipse的插件)SDK具體內(nèi)容
Android 4.2.2(API16)
->SDK Plateform:開(kāi)發(fā)時(shí)使用到的jar包->Samples for sdk:
->ARM EABI V7a System Image:模擬器運(yùn)行時(shí)的鏡像->Intel n86 Aton System:模擬器運(yùn)行時(shí)的鏡像->MIPS System Image:模擬器運(yùn)行時(shí)的鏡像->google APIs:google提供的jar包,可以直接使用google提供的一些API->source for android SDK:SDK全部的源代碼 Extrals:
->tools:開(kāi)發(fā)的工具
->support library:實(shí)現(xiàn)高版本的android向下的兼容->google Admed Ads SDK:gongle提供的廣告插件->Analyties App Irackiong SDK:應(yīng)用的用戶(hù)分析->cloud message:云消息
->gongle play service:收費(fèi)服務(wù)
->google USB Driver:真實(shí)的設(shè)備驅(qū)動(dòng)
開(kāi)發(fā)時(shí):基于4.0,兼容2.2、2.3.3
07、創(chuàng)建android模擬器
avd:android virture developer VGA:480*640(電視的標(biāo)準(zhǔn)分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更寬)
08、ddms簡(jiǎn)介
ddms:模擬器不支持中文,因此發(fā)送中文會(huì)顯示不出來(lái)
09、platform-tools的簡(jiǎn)介及常見(jiàn)adb指令
Android調(diào)試橋:內(nèi)部實(shí)現(xiàn)就是socket讓兩個(gè)系統(tǒng)之間實(shí)現(xiàn)數(shù)據(jù)交互
->reset adb:模擬器找不到時(shí)候可以重啟->adb device:列出所有的連接的設(shè)備->adb kill-server:殺死adb調(diào)試橋->adb start-server 啟動(dòng)adb調(diào)試橋 dx.bat:將.class文件打包
10、android項(xiàng)目的目錄結(jié)構(gòu)
一:SDK的目錄結(jié)構(gòu)
->Samples->Api demo:根據(jù)API demo(模擬器上面可以看見(jiàn))的效果可以在sample中看見(jiàn)
相應(yīng)的代碼
->Source:jar包所有的sdk源代碼都在這個(gè)文件夾里->SystemImage:系統(tǒng)鏡像
->temp:下載更新臨時(shí)存儲(chǔ)的文件夾,一般是空的->tools:emulater.ext 不同版本的模擬器
二:New Android Application->theme:留給以后作為擴(kuò)展,現(xiàn)在并沒(méi)有太大的作用->target SDK:一般選擇高版本,因?yàn)楦甙姹緦?duì)下兼容
->mark project as a library:一般不選擇,意思是將這個(gè)項(xiàng)目提供一個(gè)
jar包供別人使用 三:文件夾目錄
.setting:設(shè)置目錄
assets:資產(chǎn)目錄,存放一些文件,這些文件會(huì)被原封不動(dòng)打包到應(yīng)用程序的 apk中
bin:
gen:自動(dòng)生成的目錄
->builderConfig.java:生成的配置信息->R.java: Android 4.1.2->android.jar開(kāi)發(fā)環(huán)境,jar包
可以在properties中修改,jar包就是SDK
011、Android下apk的安裝過(guò)程
一、Android安裝過(guò)程分析:
->setContentView:甚至view的對(duì)象,把里面的xml文件加載到
->在project中選擇build automaticly會(huì)自動(dòng)把文件生成字節(jié)碼文件,.class $代表的class文件生成的是內(nèi)部類(lèi)->dex.bat文件會(huì)把.class文件生成.dex文件
->apk壓縮文件解壓內(nèi)部?jī)?nèi)容
->META-INF: 應(yīng)用程序的簽名
eclipse的調(diào)試簽名文件
->res:資源文件
->classes.dex:class文件
->resources.arsc:資源ID映射
->android軟件安裝的過(guò)程:
->拷貝xxx.apk帶/data/app/xxx-1.apk->在/data/data目錄下創(chuàng)建一個(gè)文件夾,文件夾名稱(chēng)當(dāng)前應(yīng)用程序的報(bào)名
012、常見(jiàn)adb指令
前提:
->設(shè)備連接上電腦而且驅(qū)動(dòng)安裝正常,如果安裝不正常的話(huà),會(huì)有黃色的問(wèn)號(hào)顯示;
->設(shè)備上打開(kāi)USB調(diào)試;
指令:
->adb device(如果啟動(dòng)發(fā)現(xiàn)這個(gè)程序沒(méi)有安裝會(huì)自動(dòng)安裝)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多個(gè)設(shè)備的話(huà),如果不指定安裝的是哪個(gè)設(shè)備程序會(huì)報(bào)錯(cuò)->adb push haha.prop /sdcard/haha.txt 將文件移到
(360管家,豌豆莢之類(lèi)的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話(huà),會(huì)因?yàn)閮蓚€(gè)adb指令搶端口號(hào)而掛掉)(adb版本之間兼容不是很好,經(jīng)常報(bào)錯(cuò)可以考慮下版本的問(wèn)題)->adb shell:遠(yuǎn)程連接到了android的linux終端
ls:顯示文件夾
ps:顯示正在運(yùn)行的程序 ping:網(wǎng)絡(luò)連通性
013、創(chuàng)建模擬器遇到的常見(jiàn)錯(cuò)誤
->路徑最好不要有中文:
->應(yīng)用安裝不上,或者安裝模擬器的時(shí)候開(kāi)啟一個(gè)新的模擬器:
可能是模擬器的資源被占用,模擬器在運(yùn)行的時(shí)候其實(shí)占用著硬盤(pán)上面的一個(gè)文件,這個(gè)文件位于工作空間.android/avd/iphone.avd 里面會(huì)有鏡像文件,當(dāng)一個(gè)模擬器開(kāi)啟起來(lái)了,就給你創(chuàng)建一個(gè)文件夾.knock的文件夾,代表著這個(gè)模擬器被鎖定了,如果把模擬器關(guān)掉,就沒(méi)有程序占據(jù)這幾個(gè)鏡像資源了,那么這幾個(gè)程序就會(huì)被自動(dòng)刪除。通常情況下不會(huì)出問(wèn)題,開(kāi)啟時(shí)候創(chuàng)建文件,關(guān)閉時(shí)關(guān)閉文件,但是當(dāng)電腦出現(xiàn)不正常狀態(tài)時(shí):比如藍(lán)屏,停電關(guān)機(jī)時(shí)候這些資源還沒(méi)來(lái)得及刪除,模擬器就關(guān)閉了,因此開(kāi)啟時(shí)這些資源仍在,程序默認(rèn)模擬器被占用,因此會(huì)重新開(kāi)啟一個(gè)模擬器。
->模擬器沒(méi)有信號(hào):
模擬器用socket橋接在電腦上
終結(jié)解決方案是給電腦連上網(wǎng),分配一個(gè)IP->常見(jiàn)命令操作:
14、電話(huà)撥號(hào)器
->新建文件
->界面設(shè)置:文本框、點(diǎn)擊按鈕
->
->設(shè)置點(diǎn)擊事件:找到空間,然后設(shè)置點(diǎn)擊事件,再點(diǎn)擊事件里面獲得了另外一
個(gè)空間的數(shù)據(jù),激活一個(gè)intent->獲得權(quán)限:清單文件中添加uses permision
15、點(diǎn)擊事件的四種寫(xiě)法
->電話(huà)撥號(hào)器的優(yōu)化:
每次撥打電話(huà)都會(huì)執(zhí)行的操作是:查找控件,然后找到控件的文本,撥打電
話(huà)。其實(shí)每次撥打電話(huà)文本控件已經(jīng)創(chuàng)建好了沒(méi)有必要每次查找按鈕之后再 查詢(xún)控件。
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new MyListener());}
private class MyListener implementsandroid.view.View.OnClickListener{
@Override
public void onClick(View arg0){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);
}
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;} }
->
1、點(diǎn)擊事件的四種寫(xiě)法:
->給按鈕注冊(cè)點(diǎn)擊事件:創(chuàng)建一個(gè)內(nèi)部類(lèi)定義點(diǎn)擊事件。具體代碼見(jiàn)上
button.setOnClickListener(new MyListener());
->
2、采用匿名內(nèi)部類(lèi)創(chuàng)建點(diǎn)擊事件:
button.setOnClickListener(new OnClickListener()){
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動(dòng)生成的方法存根
callPhone();
}
});}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} } }
->
3、如果有很多的按鈕點(diǎn)擊事件,建議用這種方式:讓Activity實(shí)現(xiàn)點(diǎn)擊 事件的接口,每個(gè)按鈕點(diǎn)擊事件都設(shè)置成this,讓該類(lèi)實(shí)現(xiàn) OnClickListener然后進(jìn)行判斷。package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);}
@Override public void onClick(View v){
// TODO 自動(dòng)生成的方法存根
switch(v.getId()){
case R.id.bt_dial:
callPhone();
break;
} } }->
4、在布局文件中綁定一個(gè)點(diǎn)擊的方法,如果點(diǎn)擊按鈕就會(huì)調(diào)用這個(gè)方法,通
過(guò)反射技術(shù)試圖調(diào)用這個(gè)方法
布局文件中設(shè)置: package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
public void dialButtonClick(View v){ callPhone();}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} }
16、短信發(fā)送器
->界面的設(shè)計(jì):兩個(gè)large Text,一個(gè)Button
android:textColor 設(shè)置字體顏色
android:singleLine=“true” 設(shè)置是否是單行
android:lines=“5” 設(shè)置行數(shù)
windows下面的顏色是GBR,而android下需要輸入的格式確實(shí)
RGB,所以需要轉(zhuǎn)換
adb默認(rèn)設(shè)置time out為5秒->內(nèi)容設(shè)計(jì):按鈕-文本->判斷->發(fā)送
導(dǎo)包的時(shí)候千萬(wàn)別導(dǎo)到gsm包,否則會(huì)顯示過(guò)時(shí);
發(fā)送沒(méi)有歷史記錄 package com.example.sms;
import java.util.ArrayList;
import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;private EditText et_content;
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_send);
et_number =(EditText)findViewById(R.id.et_number);
et_content =(EditText)findViewById(R.id.et_content);
button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;}
@Override public void onClick(View v){
// TODO 自動(dòng)生成的方法存根
switch(v.getId()){
case R.id.bt_send:
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
Toast.makeText(this, “號(hào)碼或者內(nèi)容不能為空”,Toast.LENGTH_SHORT).show();
return;
}else{
SmsManager smsManager = SmsManager.getDefault();
ArrayList
for(String str:contents){
smsManager.sendTextMessage(number, null, str, null, null);
}
}
} } }
17、相對(duì)布局&單位介紹
->布局說(shuō)明:
->同級(jí)控件:
android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“
->相對(duì)父控件:
android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->對(duì)齊方式:
->文本顏色:#00000000~#ff000000(argb)文字的透明度->單位介紹:
dp也就是dip:device independent pixels(設(shè)備獨(dú)立像素),是一種與密度無(wú)關(guān)的像素單位,在每英寸160點(diǎn)的屏幕上,1dp = 1px。不同設(shè)備有不同的顯示效果,這個(gè)和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個(gè),不依賴(lài)像素
1.