【黑馬程序員】軟件項(xiàng)目管理
(一)咱們現(xiàn)在是在學(xué)習(xí)階段,慢慢的接觸項(xiàng)目這個(gè)概念。那么項(xiàng)目是什么?
一個(gè)項(xiàng)目的組成,還有期生命周期,項(xiàng)目經(jīng)理如何管理項(xiàng)目,項(xiàng)目如何分解,每個(gè)階段的產(chǎn)出,都是什么,我們?cè)谶M(jìn)入工作前,可以提前了解一下,就能大概體會(huì)項(xiàng)目經(jīng)理的工作內(nèi)容,也能體諒一個(gè)項(xiàng)目所帶來(lái)的壓力。
首先軟件項(xiàng)目管理,什么是項(xiàng)目?什么是軟件項(xiàng)目? 項(xiàng)目是唯一的,臨時(shí)的,即在一定的時(shí)間內(nèi)完成。
具體定義:項(xiàng)目是為了創(chuàng)造一個(gè)唯一的產(chǎn)品或提供一個(gè)唯一的服務(wù)而進(jìn)行的臨時(shí)性的努力。項(xiàng)目的特征: 項(xiàng)目有明確的目標(biāo)
項(xiàng)目之間的活動(dòng)具有相關(guān)性 限定的周期 有獨(dú)特性
資源成本的約束性(預(yù)算)
項(xiàng)目的不確定性(需求變更、人員變動(dòng)。。)
說(shuō)了那么多項(xiàng)目的特征,那么軟件項(xiàng)目又有什么特別的嗎?
軟件項(xiàng)目是一個(gè)邏輯實(shí)體,相互之間的作用更強(qiáng),變更會(huì)隨時(shí)發(fā)生,以及更深的漸進(jìn)聯(lián)系。正是由于軟件項(xiàng)目的變更性很強(qiáng),所以為了確保軟件項(xiàng)目的成功,提出了要對(duì)軟件項(xiàng)目進(jìn)行管理。
項(xiàng)目管理的定義:項(xiàng)目管理是一系列的伴隨著項(xiàng)目的進(jìn)行而進(jìn)行的、目的是為了確保項(xiàng)目能達(dá)到期望結(jié)果的一系列管理行為。
軟件項(xiàng)目管理與傳統(tǒng)的項(xiàng)目管理之間的比較區(qū)別:軟件項(xiàng)目的管理除了要對(duì)軟件項(xiàng)目深入了解,掌握項(xiàng)目管理的知識(shí),還要有相應(yīng)的經(jīng)驗(yàn)和技巧
了解了項(xiàng)目管理,現(xiàn)在就來(lái)看看必不可少的項(xiàng)目管理知識(shí)體系(pmbok)
十大管理:范圍管理、時(shí)間管理、費(fèi)用管理、質(zhì)量管理、人員管理、溝通管理、風(fēng)險(xiǎn)管理、采購(gòu)管理、集成管理、利益相關(guān)者管理 采鑒自傳統(tǒng)項(xiàng)目管理,過(guò)程的管理如流水線生產(chǎn)生產(chǎn)的產(chǎn)品都是一樣的,不同的過(guò)程造就不同的產(chǎn)品,那么對(duì)于軟件項(xiàng)目管理來(lái)說(shuō),不同的過(guò)程一樣產(chǎn)生不同的產(chǎn)品,不同的過(guò)程造就的產(chǎn)品質(zhì)量也就不同,那么管理好了過(guò)程產(chǎn)品質(zhì)量也就會(huì)相應(yīng)提升。這里給出過(guò)程管理的定義:過(guò)程管理就是對(duì)過(guò)程進(jìn)行管理,目的是讓過(guò)程能夠被共享、復(fù)用,并得到持續(xù)的改進(jìn)。
軟件過(guò)程管理的過(guò)程組:初始、計(jì)劃、控制、執(zhí)行、結(jié)束
于是我們得到軟件項(xiàng)目管理的過(guò)程:初始、計(jì)劃、執(zhí)行控制、結(jié)束
從項(xiàng)目初始開始:包括項(xiàng)目確立和生存期
項(xiàng)目確立分成 項(xiàng)目立項(xiàng)、項(xiàng)目招投標(biāo)、項(xiàng)目授權(quán)
項(xiàng)目立項(xiàng):確定項(xiàng)目的目標(biāo)、時(shí)間、資源、資金,關(guān)鍵在于得到項(xiàng)目發(fā)起人的認(rèn)可 一個(gè)軟件項(xiàng)目的立項(xiàng)開始于軟件項(xiàng)目的啟動(dòng),只有立項(xiàng)了的需求才會(huì)得到滿足
項(xiàng)目招投標(biāo):在確認(rèn)決策為購(gòu)買時(shí),便要啟動(dòng)項(xiàng)目招投標(biāo),過(guò)程為甲方招標(biāo)書定義、乙方項(xiàng)目分析、招標(biāo)與競(jìng)爭(zhēng)、合同簽署
黑馬程序員成都中心 編著
項(xiàng)目授權(quán):項(xiàng)目章程(project charter)表示項(xiàng)目存在
項(xiàng)目授權(quán)后項(xiàng)目管理便要開始履行職責(zé) 包括:開發(fā)計(jì)劃、組織實(shí)施、項(xiàng)目控制
案例總結(jié):某公司發(fā)出甲方招標(biāo)書,然后一些科技公司開始對(duì)該招標(biāo)書進(jìn)行項(xiàng)目分析,然后向甲方公司發(fā)送投標(biāo)書,由甲方進(jìn)行選擇,擬定合同并簽訂,中標(biāo)后乙方收到項(xiàng)目授權(quán)書,項(xiàng)目便正式成立
項(xiàng)目成立后便要選擇相應(yīng)的完成項(xiàng)目的策略,即選擇項(xiàng)目生存期模型 軟件項(xiàng)目生存周期
定義:描述了開發(fā)的主要階段、定義每個(gè)階段完成的過(guò)程和活動(dòng)、確認(rèn)每個(gè)階段完成的輸入和輸出
傳統(tǒng)生存期模型:預(yù)期設(shè)計(jì)開發(fā)的過(guò)程
瀑布模型:?jiǎn)蜗?,?yán)格要求項(xiàng)目的步驟,即需求分析、設(shè)計(jì)、編碼實(shí)施、測(cè)試、維護(hù),管理方便但是不能滿足需求變更
V模型:瀑布模型的變種,仍舊為單向執(zhí)行,對(duì)項(xiàng)目需求、方案要求非常明確,以及對(duì)安全有特殊要求的項(xiàng)目。
原型:對(duì)變化的需求可以進(jìn)行相應(yīng)的應(yīng)對(duì),在需求分析后構(gòu)造原型,然后對(duì)原型進(jìn)行評(píng)估,再構(gòu)造原型再評(píng)估,直到確定項(xiàng)目需求,然后設(shè)計(jì)最終系統(tǒng),最后實(shí)現(xiàn)。增量模型:需求基本明確,可能發(fā)生變化,對(duì)于市場(chǎng)和用戶需要逐步了解,需要一步步實(shí)施。以增量的方式一步步完善系統(tǒng)功能。
漸進(jìn)式模型:漸進(jìn)式前進(jìn)、階段性提交,優(yōu)點(diǎn)是階段性提交一個(gè)可運(yùn)行的產(chǎn)品,關(guān)鍵的功能更早出現(xiàn),早起預(yù)警問(wèn)題,避免缺陷蔓延,階段性完成可以降低完成估計(jì)錯(cuò)誤。敏捷生存期模型(agile development):自適應(yīng)的過(guò)程 敏捷宣言:
個(gè)體和交互勝過(guò)過(guò)程和工具
可以工作的軟件勝過(guò)面面俱到的文檔 客戶合作勝過(guò)合同談判 響應(yīng)變化勝過(guò)遵循計(jì)劃
軟件需求管理
軟件需求定義:用戶對(duì)軟件功能和性能的要求
軟件需求管理過(guò)程:需求獲取、需求分析、需求規(guī)格編寫、需求驗(yàn)證、需求變更
變更管理:確定需求變更控制過(guò)程、確立變更控制委員會(huì)(SCCB)、進(jìn)行需求變更影響分析、跟蹤所有受需求變更影響的工作產(chǎn)品、建立需求基準(zhǔn)版本和需求控制版本文檔、維護(hù)需求變更的歷史記錄、跟蹤每項(xiàng)需求的狀態(tài)、衡量需求穩(wěn)定性 軟件建模的基本方法:
原型方法:需求分析、原型開發(fā)、原型評(píng)價(jià)
結(jié)構(gòu)化分析法 :面向數(shù)據(jù)流的方法、自頂向下的分析方法、根據(jù)軟件內(nèi)部數(shù)據(jù)傳遞、交換的關(guān)系進(jìn)行分析的,包括的技術(shù)有數(shù)據(jù)流圖、數(shù)據(jù)字典、系統(tǒng)流程圖
面向?qū)ο蟮挠美治觯夯诿嫦驅(qū)ο蟮那榫胺治龇椒?、從用戶角度出發(fā)考慮的功能需求、用例是系統(tǒng)向用戶提供一個(gè)有價(jià)值的結(jié)果的某項(xiàng)功能 uml需求視圖:用例視圖、順序圖、狀態(tài)圖、活動(dòng)圖
功能列表法:將需求各功能以列表的形式列出,可以配合用例分析方法,對(duì)用例進(jìn)行展開描述。
黑馬程序員成都中心 編著
敏捷方法:對(duì)需求采用漸進(jìn)明晰的方法進(jìn)行描述
在敏捷方法中,用戶需求被描述成一個(gè)個(gè)story card,有以下基本格式:as a ,i want ,so that 判斷一個(gè)user story 是否是一個(gè)好的story的標(biāo)準(zhǔn)
軟件項(xiàng)目任務(wù)分解
任務(wù)分解是項(xiàng)目管理的基礎(chǔ)
任務(wù)分解過(guò)程定義:將一個(gè)項(xiàng)目分解為更多的工作細(xì)目或子項(xiàng)目,使項(xiàng)目變得更小、更易管理、更易操作
WBS任務(wù)分解結(jié)構(gòu):wbs是對(duì)項(xiàng)目由粗到細(xì)的分解過(guò)程,面向交付成果的,wbs組織并定義了整個(gè)項(xiàng)目范圍
工作包是wbs最低層次的可交付成果 工作包應(yīng)當(dāng)由唯一主體負(fù)責(zé) 任務(wù)分解方法:
類比:有相同或相似的周期的項(xiàng)目,可采用類比的方法 模板參照:進(jìn)行項(xiàng)目分解的時(shí)候,有些項(xiàng)目可以參照模板 自上而下:對(duì)項(xiàng)目整體有比較詳細(xì)的了解
自下而上:任務(wù)沒有非常詳細(xì)的邏輯關(guān)系,想到什么寫什么,然后按一定邏輯生成 任務(wù)分解步驟:
確認(rèn)并分解項(xiàng)目的組成要素(WBS編號(hào))確定分解標(biāo)準(zhǔn) 確定分解是否詳細(xì)
確定項(xiàng)目交付成果(可以編制WBS字典)驗(yàn)證分解的正確性
檢驗(yàn)分解結(jié)果的標(biāo)準(zhǔn):
最底層的要素是否是實(shí)現(xiàn)目標(biāo)的充分必要條件 最底層要素是否有重復(fù)的 每個(gè)要素是否清晰完整定義
最底層要素是否有定義清晰的責(zé)任人 是否可以進(jìn)行成本估算和進(jìn)度安排
--暫時(shí)就說(shuō)到這里,這里的一切標(biāo)準(zhǔn)都是由各種辦法來(lái)進(jìn)行的。跟我們所接觸的其他工作都不一樣。希望對(duì)大家以后的工作有一定的幫助。
黑馬程序員成都中心 編著
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)介及常見adb指令
10、android項(xiàng)目的目錄結(jié)構(gòu)
11、android下apk安裝的過(guò)程
12、常見的adb指令介紹
13、創(chuàng)建模擬器遇到的常見錯(cuò)誤
14、電話撥號(hào)器
15、點(diǎn)擊事件的四種寫法
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下文件訪問(wèn)的權(quán)限
26、保存文件到SD卡中
27、分析setting源代碼獲取SD卡大小
28、_sharePreference入門
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入門
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ī)制入門
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&常見開源代碼 62、多線程下載的原理 63、多線程斷點(diǎn)下載的原理
64、多線程java代碼移植到android 65、多線程下載文本頁(yè)面的更新 66、顯示意圖激活另一個(gè)activity 67、隱式意圖激活另一個(gè)activity 68、隱式意圖的配置
69、隱式意圖和顯示意圖的使用場(chǎng)景 70、在不同activity之間數(shù)據(jù)傳遞 71、activity的聲明周期 72、activity的啟動(dòng)模式
73、activity橫豎屏切換的聲明周期 74、開啟新的activity獲取他的返回值 75、請(qǐng)求碼和結(jié)果碼的作用 76、利用廣播實(shí)現(xiàn)ip撥號(hào) 77、短信竊聽器
78、自定義廣播時(shí)間&發(fā)送自定義廣播&廣播接受者優(yōu)先級(jí) 79、采用服務(wù)執(zhí)行長(zhǎng)期后臺(tái)操作 80、采用服務(wù)竊聽電話&服務(wù)的聲明周期 81、android進(jìn)程優(yōu)先級(jí)&為什么使用服務(wù) 82、綁定方式開啟服務(wù)&調(diào)用服務(wù)的方法 83、服務(wù)的聲明周期(混合開啟 84、采用aidl綁定遠(yuǎn)程服務(wù)
85、代碼注冊(cè)廣播接受者&利用廣播調(diào)用服務(wù)的辦法 86、加載大圖片到內(nèi)存 87、獲取圖片exif信息 88、從gallery獲取圖片 89、圖片畫畫板 90、扒開美女衣服 91、圖片的縮放 92、圖片的旋轉(zhuǎn)
93、圖片的平移&鏡面&倒影效果 94、圖片的合成 95、圖片的顏色處理 96、多媒體播放api簡(jiǎn)介 97、人臉識(shí)別
98、mediaplayer的生命周期 99、soundpoo簡(jiǎn)介
100、sufaceview的生命周期 101、播放在線視頻
102、視頻播放器進(jìn)度的處理 103、調(diào)用系統(tǒng)照相機(jī)拍照和錄像 104、采用camera拍照 105、常見對(duì)話框 106、notification入門 107、菜單
108、android下的樣式 109、android下的主題
110、代碼編寫ui 111、html創(chuàng)建ui 112、幀動(dòng)畫
113、代碼創(chuàng)建創(chuàng)建的tween動(dòng)畫 114、xml文件定義動(dòng)畫 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直接訪問(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:開發(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:開發(fā)的工具
->support library:實(shí)現(xiàn)高版本的android向下的兼容->google Admed Ads SDK:gongle提供的廣告插件->Analyties App Irackiong SDK:應(yīng)用的用戶分析->cloud message:云消息
->gongle play service:收費(fèi)服務(wù)
->google USB Driver:真實(shí)的設(shè)備驅(qū)動(dòng)
開發(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)介及常見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(模擬器上面可以看見)的效果可以在sample中看見
相應(yīng)的代碼
->Source:jar包所有的sdk源代碼都在這個(gè)文件夾里->SystemImage:系統(tǒng)鏡像
->temp:下載更新臨時(shí)存儲(chǔ)的文件夾,一般是空的->tools:emulater.ext 不同版本的模擬器
二:New Android Application->theme:留給以后作為擴(kuò)展,現(xiàn)在并沒有太大的作用->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開發(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)部類->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è)文件夾,文件夾名稱當(dāng)前應(yīng)用程序的報(bào)名
012、常見adb指令
前提:
->設(shè)備連接上電腦而且驅(qū)動(dòng)安裝正常,如果安裝不正常的話,會(huì)有黃色的問(wèn)號(hào)顯示;
->設(shè)備上打開USB調(diào)試;
指令:
->adb device(如果啟動(dòng)發(fā)現(xiàn)這個(gè)程序沒有安裝會(huì)自動(dòng)安裝)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多個(gè)設(shè)備的話,如果不指定安裝的是哪個(gè)設(shè)備程序會(huì)報(bào)錯(cuò)->adb push haha.prop /sdcard/haha.txt 將文件移到
(360管家,豌豆莢之類的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話,會(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)建模擬器遇到的常見錯(cuò)誤
->路徑最好不要有中文:
->應(yīng)用安裝不上,或者安裝模擬器的時(shí)候開啟一個(gè)新的模擬器:
可能是模擬器的資源被占用,模擬器在運(yùn)行的時(shí)候其實(shí)占用著硬盤上面的一個(gè)文件,這個(gè)文件位于工作空間.android/avd/iphone.avd 里面會(huì)有鏡像文件,當(dāng)一個(gè)模擬器開啟起來(lái)了,就給你創(chuàng)建一個(gè)文件夾.knock的文件夾,代表著這個(gè)模擬器被鎖定了,如果把模擬器關(guān)掉,就沒有程序占據(jù)這幾個(gè)鏡像資源了,那么這幾個(gè)程序就會(huì)被自動(dòng)刪除。通常情況下不會(huì)出問(wèn)題,開啟時(shí)候創(chuàng)建文件,關(guān)閉時(shí)關(guān)閉文件,但是當(dāng)電腦出現(xiàn)不正常狀態(tài)時(shí):比如藍(lán)屏,停電關(guān)機(jī)時(shí)候這些資源還沒來(lái)得及刪除,模擬器就關(guān)閉了,因此開啟時(shí)這些資源仍在,程序默認(rèn)模擬器被占用,因此會(huì)重新開啟一個(gè)模擬器。
->模擬器沒有信號(hào):
模擬器用socket橋接在電腦上
終結(jié)解決方案是給電腦連上網(wǎng),分配一個(gè)IP->常見命令操作:
14、電話撥號(hào)器
->新建文件
->界面設(shè)置:文本框、點(diǎn)擊按鈕
-> :一旦獲得焦點(diǎn),會(huì)立刻彈出,輸入文本的軟鍵盤->ctrl+x刪除->ctrl+1提示
->設(shè)置點(diǎn)擊事件:找到空間,然后設(shè)置點(diǎn)擊事件,再點(diǎn)擊事件里面獲得了另外一
個(gè)空間的數(shù)據(jù),激活一個(gè)intent->獲得權(quán)限:清單文件中添加uses permision
15、點(diǎn)擊事件的四種寫法
->電話撥號(hào)器的優(yōu)化:
每次撥打電話都會(huì)執(zhí)行的操作是:查找控件,然后找到控件的文本,撥打電
話。其實(shí)每次撥打電話文本控件已經(jīng)創(chuàng)建好了沒有必要每次查找按鈕之后再 查詢控件。
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();//去除回車和空格
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)擊事件的四種寫法:
->給按鈕注冊(cè)點(diǎn)擊事件:創(chuàng)建一個(gè)內(nèi)部類定義點(diǎn)擊事件。具體代碼見上
button.setOnClickListener(new MyListener());
->
2、采用匿名內(nè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();//去除回車和空格
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,讓該類實(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();//去除回車和空格
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();//去除回車和空格
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ā)送沒有歷史記錄 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 contents = smsManager.divideMessage(content);
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è),不依賴像素
1.2.android:layout_height=”wrap_content“
3.android:text=”@string/clickme“
4.android:layout_marginTop=”20dp“ />
scaled pixels(刻度像素).主要用于定義字體的大小,而從來(lái)不再layout上使用
o
1.2.android:layout_height=”wrap_content“
3.android:textSize=”20sp“ />
px:pixels(像素).不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個(gè)用的比較多 總結(jié):dp也就是dip。這個(gè)和sp基本類似。如果設(shè)置表示長(zhǎng)度、高度等屬性時(shí)可以使用dp或sp。但如果設(shè)置字體,需要使用sp。dp是與密度無(wú)關(guān),sp除了與密度無(wú)關(guān)外,還與scale無(wú)關(guān)。如果屏幕密度為160,這時(shí)dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)還是3.2寸),而屏幕密度變成了320。那么原來(lái)TextView的寬度設(shè)成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或160sp的話。系統(tǒng)會(huì)自動(dòng)將width屬性值設(shè)置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說(shuō),如果使用dp和sp,系統(tǒng)會(huì)根據(jù)屏幕密度的變化自動(dòng)進(jìn)行轉(zhuǎn)換.附:px 和 dp 互轉(zhuǎn)換
1.package com.hujl.util;import android.content.Context;
public class DensityUtil {
/**
* 根據(jù)手機(jī)的分辨率從 dp 的單位轉(zhuǎn)成為 px(像素)
*/
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機(jī)的分辨率從 px(像素)的單位轉(zhuǎn)成為 dp
*/
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(pxValue / scale + 0.5f);
} }
18、線性布局&布局的組合
->線性布局:
->線:就是view對(duì)象
android:layout_height=”1px“
android:background=”#ff0000“ > />
通常采用相對(duì)布局和絕對(duì)布局聯(lián)合使用的方式。
19、表格布局&絕對(duì)布局
->表格布局:渲染權(quán)重
->絕對(duì)布局:對(duì)控件位置任意擺放,需要計(jì)算不同屏幕中的位置,因?yàn)閍ndroid
軟件的屏幕大小實(shí)在太多,所以并不方便,不推薦使用。
20、幀布局
>幀布局:
->類似于網(wǎng)頁(yè)布局中的div
android:visibility:”“ //顯示是否可見,播放器最喜歡使用幀布局,暫停播放的時(shí)候,會(huì)在上面顯示一個(gè)按鈕
21、測(cè)試相關(guān)概念
->根據(jù)測(cè)試測(cè)試是否知道程序的源代碼:
->黑盒測(cè)試:不知道源代碼,只關(guān)心程序執(zhí)行的過(guò)程和程序的結(jié)果,一個(gè)資
深的黑盒程序人員工資很高,因?yàn)樗麄兒驼S脩舻氖褂盟季S
不一樣
->白盒測(cè)試:根據(jù)源代碼寫測(cè)試方法或者測(cè)試用例->根據(jù)測(cè)試的粒子度:
->方法測(cè)試:function test->單元測(cè)試:unit test->集成測(cè)試:intergration test->根據(jù)測(cè)試的次數(shù):
->冒煙測(cè)試:smoke test 反復(fù)不停的執(zhí)行,反復(fù)不停的使用(android猴子
來(lái)測(cè)試)
->adb shell
->monkey
->monkey 5000(點(diǎn)擊五千次)
->壓力測(cè)試:pressure test同時(shí)抗住多人的請(qǐng)求->
22、android下junit測(cè)試框架配置
23、logcat簡(jiǎn)介
->日志信息級(jí)別:
Verbose:提醒 黑色
Debug: 調(diào)試 藍(lán)色
Info: 信息 綠色
Warn: 警告 橙色
Error: 錯(cuò)誤 紅色
24、保存文件到手機(jī)內(nèi)存
->數(shù)據(jù)存儲(chǔ)與訪問(wèn)
->文件
->SharePreferences(參數(shù))
->SQLite數(shù)據(jù)庫(kù)
->內(nèi)容提供者(Content Provide)
->網(wǎng)絡(luò)
->LinearLayout一定要設(shè)置水平還是垂直->文件保存:
->javase中通過(guò)創(chuàng)建文件對(duì)象,但是在androi中這種存放方式會(huì)失敗,因
為會(huì)默認(rèn)為存儲(chǔ)在當(dāng)前目錄文件下
->android中創(chuàng)建一個(gè)包:com.itheima.login.service
創(chuàng)建一個(gè)類:LoginService.java
異常的處理:如果是返回值是boolean,那么拋出處理都可以,但是如果返回值是void,那么只能拋出了
->context:上下文就是一個(gè)類,這個(gè)類提供了很多方便的API,可以得到應(yīng)用程
序的環(huán)境
環(huán)境包名 安裝路徑 文件的路徑 資源的路徑 資產(chǎn)的路徑
放到緩存文件夾里面:getCacheDir();->getAssest();->getResource();->getFilesDir();/data/data/包名
->getCacheDir();/data/data/包名/cache
->MainActivity.java package com.example.login;
import java.util.Map;
import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.service.LoginService;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁(yè)面加載進(jìn)來(lái)然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
Map map = LoginService.getSavaUserInfo(this);
if(map!= null){
et_number.setText((CharSequence)map.get(”username“));
et_passwd.setText((CharSequence)map.get(”passwd“));
} }
@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 login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶密碼,那么就保存用戶密碼
boolean results = LoginService.saveuserInfo(this,number, passwd);
if(results){
Toast.makeText(this, ”保存用戶信息成功“, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, ”保存用戶信息失敗“, Toast.LENGTH_SHORT).show();
}
}
//登陸發(fā)送消息到服務(wù)器,服務(wù)器驗(yàn)證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
->LoginService.java package com.example.login.service;
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;
import android.content.Context;/* * 保存用戶名密碼的的業(yè)務(wù)方法 */ public class LoginService { public static boolean saveuserInfo(Context context,String userName,String passWord){//沒有使用任何類的方法,推薦使用靜態(tài)方法
//File file = new File(”/data/data/com.example.login/info.txt“);
File file = new File(context.getFilesDir(),”info.txt“);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((userName+”##“+passWord).getBytes());
fos.close();
return true;
} catch(FileNotFoundException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return false;
} catch(IOException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return false;
}
} /* * 獲取保存到的數(shù)據(jù)
*/ public static Map getSavaUserInfo(Context context){
File file = new File(context.getFilesDir(),”info.txt“);
Map map = new HashMap();;
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
String str = bufferedReader.readLine();
String[] infos = str.split(”##“);
map.put(”username“, infos[0]);
map.put(”passwd“, infos[1]);
} catch(FileNotFoundException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return null;
} catch(IOException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return null;
}
return map;} }
->activity_main.xml
android:id=”@+id/bt_login“
android:onClick=”login“
android:layout_width=”100dp“
android:layout_height=”wrap_content“
android:layout_alignParentRight=”true“
android:text=”@string/bt_login“
/>
android:id=”@+id/cb_remPass“
android:layout_width=”wrap_content“
android:layout_height=”wrap_content“
android:layout_alignParentLeft=”true“
android:layout_alignParentTop=”true“
android:layout_alignBottom=”@id/bt_login“
android:text=”@string/remPass“
android:checked=”true“ />
25、android下文件訪問(wèn)的權(quán)限
->private、readable、writeable、public
26、保存文件到SD卡中
->存儲(chǔ)空間:
->手機(jī)的內(nèi)部存儲(chǔ)空間:小硬盤 /data/data->外部存儲(chǔ)空間:SD卡 路徑/mnt/sdcard 可以簡(jiǎn)寫成/sdcard/
需要權(quán)限WRITE_EXTER_STORAGE
操作SD卡必須要權(quán)限
->保存數(shù)據(jù)到SD卡只需要把路徑改為SD卡,讀不需要權(quán)限,否則需要權(quán)限
在4.0以前的版本讀SD卡不需要權(quán)限,但是在4.0以
后讀寫SD卡可以設(shè)置SD卡保護(hù),讀就需要權(quán)限 READ_EXTER_STORAGE->判斷是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
->為了保證程序的兼容性,有些SD卡可能路徑會(huì)改變,因此系統(tǒng)提供了獲取SD 卡的路徑的方法
Environment.getExternalStorageDirectory()
27、分析setting源代碼獲取SD卡大小
->source的源代碼是SDK的源代碼,是jar里面的源代碼->導(dǎo)入通用的文件項(xiàng)目eclipse要求必須要有setting文件->ctrl+h搜索文件夾
package com.example.sdsize;
import java.io.File;
import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.StatFs;import android.text.format.Formatter;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_SDsize;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_find);tv_SDsize =(TextView)findViewById(R.id.tv_SDSize);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動(dòng)生成的方法存根
StringBuilder memorySizeInfo = new StringBuilder();
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
memorySizeInfo.append(getExternalSize());
}else{
Toast.makeText(MainActivity.this,”無(wú)內(nèi)存卡“, Toast.LENGTH_SHORT).show();
}
memorySizeInfo.append(getRomSpaceInfo());
tv_SDsize.setText(memorySizeInfo.toString());
}
});} /* * 獲取SD卡的存儲(chǔ)信息 */ public String getExternalSize(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
long totalSize = blockSize*totalBlocks;
long availSize = blockSize*availableBlocks;
String totalStr = Formatter.formatFileSize(this, totalSize);
String availStr = Formatter.formatFileSize(this, availSize);
String ExternalSize = ”SD總存儲(chǔ)空間:“+ totalStr + ”可使用的空間:“ + availStr;
return ExternalSize;} /* * 獲取可用的內(nèi)部存儲(chǔ) */ public String getRomSpaceInfo(){
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long internalblockSize = stat.getBlockSize();
long internalblockcounts = stat.getBlockCount();
long internaltotalSize = internalblockSize*internalblockcounts;
String totalStr = Formatter.formatFileSize(this, internaltotalSize);
String RomSpaceInfo = ”可用的內(nèi)存“+ totalStr;
} return RomSpaceInfo;} @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;}
28、sharedPreferences入門
->數(shù)據(jù)存儲(chǔ)的API:用##分割用戶名和密碼的缺陷,真實(shí)存
儲(chǔ)的話必須要把##轉(zhuǎn)移成其他字符,sharePreferences
(共享參數(shù))提供了一種方便存儲(chǔ)數(shù)據(jù)的方式。
->在data目錄下創(chuàng)建了一個(gè)xml文件,根節(jié)點(diǎn)是map,其實(shí)是以map集合來(lái)存
儲(chǔ)的用戶名和密碼的對(duì)特殊字符進(jìn)行了轉(zhuǎn)義
package loginsharedPreference.service;
import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;
/* * 保存用戶名密碼的的業(yè)務(wù)方法 */ public class LoginService { public static void SavaUserInfo(Context context,String username,String passwd){
//拿到上下文之后,有個(gè)方法叫g(shù)etSharedPreferences
SharedPreferences sharedPreferences = context.getSharedPreferences(”config“, Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//得到sharedPreferences的編輯器
}
editor.putString(”username“,username);editor.putString(”passwd“,passwd);//類似于數(shù)據(jù)庫(kù)的事物
editor.commit();//當(dāng)前方法不會(huì)存在異常,所以設(shè)置為void } package loginsharedPreference;
import java.util.Map;
import loginsharedPreference.service.LoginService;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.R;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁(yè)面加載進(jìn)來(lái)然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
SharedPreferences sharedPreferences = getSharedPreferences(”config“,MODE_PRIVATE);
String username = sharedPreferences.getString(”username“, ”“);
String passwd = sharedPreferences.getString(”passwd“, ”“);
et_number.setText(username);
et_passwd.setText(passwd);
}
@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 login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶密碼,那么就保存用戶密碼
LoginService.SavaUserInfo(this,number, passwd);
Toast.makeText(this, ”保存用戶信息成功“, Toast.LENGTH_SHORT).show();
}
//登陸發(fā)送消息到服務(wù)器,服務(wù)器驗(yàn)證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
29、xml文件的序列化
->一個(gè)小異常:如果沒有識(shí)別這個(gè)設(shè)備,重啟的話要記得吧adb殺掉->自己手動(dòng)添加,這種方式效率低,容易出錯(cuò)->XmlSerializer:XML序列化生成器
30、采用pull解析xml文件
->用于對(duì)象的持久化,將對(duì)象寫到硬盤中,需要用的時(shí)候再反序列化取出來(lái)。
所謂序列化其實(shí)就是將程序中的數(shù)據(jù)(對(duì)象)通過(guò)某種方式,保存到本地中。然后可以在程序關(guān)閉之后還保存程序的某個(gè)執(zhí)行狀態(tài),方便在程序下次
執(zhí)行的時(shí)候通過(guò)”反序列化“讀取出來(lái),并且能夠還原數(shù)據(jù)的類型,從而延續(xù)程序退出時(shí)的狀態(tài)。
一般來(lái)說(shuō),我們會(huì)使用序列化保存一些需要持久化的數(shù)據(jù),當(dāng)然如果這個(gè)數(shù)據(jù)會(huì)比較龐大的話,我們就直接使用數(shù)據(jù)庫(kù)了!所以,序列化實(shí)際上目前很多領(lǐng)域用的已經(jīng)不多了,大部分使用 都已被數(shù)據(jù)庫(kù)替代了!
序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題。序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStrea
->xml文件的解析方式:
->DOM一次將XML文件加載進(jìn)內(nèi)存,生成樹狀結(jié)構(gòu),在內(nèi)存中對(duì)樹狀結(jié)構(gòu)進(jìn)
行操作,缺點(diǎn)是消耗內(nèi)存大,->SAX解析:基于事件的方式,自上而下,事件下去了就不能解析了,優(yōu)點(diǎn)
是速度快,效率高,缺點(diǎn)是不能倒退;
->android下增加了一種解析xml文件的方式,pull解析,類似于SAX解析,定義了一個(gè)指針,指向了文檔的開頭,得到指針,一個(gè)tag一個(gè)tag的解析下去
->利用類加載器走到文件->創(chuàng)建一個(gè)解析器:pullParse0
具體代碼:
(MainActivity.java)package com.example.xml;
import java.util.List;
import org.w3c.dom.Text;
import com.example.xml.domain.WeatherInfo;import com.example.xml.service.WeatherService;
import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import android.os.Build;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv =(TextView)findViewById(R.id.tv);
List weatherInfos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader().getResourceAsStream(”weather.xml“));
StringBuilder sb = new StringBuilder();
for(WeatherInfo info:weatherInfos){
sb.append(info.toString()+”n“);
}
tv.setText(sb.toString());}
@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;} }
(WeatherInfo.java)/** * */ package com.example.xml.domain;
import android.R.integer;/** * @author yonghen * */ public class WeatherInfo { private int id;private String name;private String wind;private String weather;private String temp;private String pm;/*(non-Javadoc)* @see java.lang.Object#toString()*/ @Override public String toString(){
return ”WeatherInfos [id=“ + id + ”, name=“ + name + ”, wind=“ + wind
+ ”, weather=“ + weather + ”, temp=“ + temp + ”, pm=“ + pm
+ ”]“;}
/** * @param id * @param name * @param wind * @param weather
* @param temp * @param pm */ public WeatherInfo(){ super();} public WeatherInfo(int id, String name, String wind, String weather,String temp, String pm){ super();this.id = id;this.name = name;this.wind = wind;this.weather = weather;this.temp = temp;this.pm = pm;} /** * @return the id */ public int getId(){ return id;} /** * @param id the id to set */ public void setId(int id){ this.id = id;} /** * @return the name */ public String getName(){ return name;} /** * @param name the name to set */ public void setName(String name){ this.name = name;} /** * @return the wind */
public String getWind(){ return wind;} /** * @param wind the wind to set */ public void setWind(String wind){ this.wind = wind;} /** * @return the weather */ public String getWeather(){ return weather;} /** * @param weather the weather to set */ public void setWeather(String weather){ this.weather = weather;} /** * @return the temp */ public String getTemp(){ return temp;} /** * @param temp the temp to set */ public void setTemp(String temp){ this.temp = temp;} /** * @return the pm */ public String getPm(){ return pm;} /** * @param pm the pm to set */ public void setPm(String pm){ this.pm = pm;
}
}
(WeatherService.java)/** * */ package com.example.xml.service;
import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;
import android.R.integer;import android.util.Xml;
import com.example.xml.domain.WeatherInfo;/** * @author yonghen * */ public class WeatherService { public static List getWeatherInfos(InputStream inputStream){
XmlPullParser xmlPullParser = Xml.newPullParser();
WeatherInfo weatherInfo = null;
List weatherInfos = null;
try {
xmlPullParser.setInput(inputStream, ”utf-8“);
int type = xmlPullParser.getEventType();//拿到的是當(dāng)前的事件類型:
while(type!= xmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_TAG:
if(”info“.equals(xmlPullParser.getName())){//解析到全局開始的標(biāo)簽
weatherInfos = new ArrayList();
}else if(”city“.equals(xmlPullParser.getName())){
weatherInfo = new WeatherInfo();
String idString = xmlPullParser.getAttributeName(0);
weatherInfo.setId(Integer.parseInt(idString));//字符串轉(zhuǎn)化成整型數(shù)據(jù)
}else if(”temp“.equals(xmlPullParser.getName())){
String temp = xmlPullParser.nextText();
weatherInfo.setTemp(temp);
}else if(”wind“.equals(xmlPullParser.getName())){
String wind = xmlPullParser.nextText();
weatherInfo.setWind(wind);
}else if(”name“.equals(xmlPullParser.getName())){
String name = xmlPullParser.nextText();
weatherInfo.setName(name);
}else if(”weather“.equals(xmlPullParser.getName())){
String weather = xmlPullParser.nextText();
weatherInfo.setName(weather);
}else if(”pm“.equals(xmlPullParser.getName())){
String pm = xmlPullParser.nextText();
weatherInfo.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if(”city“.equals(xmlPullParser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo=null;
}
break;
}
type = xmlPullParser.next();
}
} catch(XmlPullParserException e){
// TODO Auto-generated catch block
e.printStackTrace();
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return weatherInfos;} }(Weather.xml)
20/30
5月20日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月19日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月18日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月17日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
31、采用斷點(diǎn)調(diào)試的方法觀察pull解析的的流程
->現(xiàn)在代碼雙單擊添加斷點(diǎn)
->debug as Android Application->然后打開調(diào)試視圖
32、android下創(chuàng)建一個(gè)sqllite數(shù)據(jù)庫(kù)
->SQLiteOpenHelper(數(shù)據(jù)庫(kù)大概幫助類):數(shù)據(jù)庫(kù)創(chuàng)建和打開的幫助類->
->PersonSQLiteOpenHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/**
* @數(shù)據(jù)庫(kù)的構(gòu)造方法,用來(lái)定義數(shù)據(jù)庫(kù)的名稱,數(shù)據(jù)庫(kù)查詢的結(jié)果集,數(shù)據(jù)庫(kù)的版本 */ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫(kù)存放在什么位置,String name:數(shù)據(jù)庫(kù)名,factory一般為null,設(shè)置系統(tǒng)默認(rèn)的游標(biāo)工廠,super(context, ”Person.db“, null, 1);
} /* * 數(shù)據(jù)庫(kù)第一次被創(chuàng)建的時(shí)候調(diào)用的方法,db創(chuàng)建的數(shù)據(jù)庫(kù) */ @Override public void onCreate(SQLiteDatabase db){
db.execSQL(”create table person id integer primary antoincrement,name varchar(20),number varchar(20)");//底層存儲(chǔ)類型都是String,(20)都是給程序員看的,其實(shí)沒有影響
}
/*(non-Javadoc)* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ } }
->TestPersonDB.java /** * */ package com.example.sqlite;
import android.database.sqlite.SQLiteAbortException;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;/** * @author yonghen * */ public class TestPersonDB extends AndroidTestCase { public void testCreateDB(){ PersonSQLiteHelper personSQLiteHelper = new PersonSQLiteHelper(getContext());//new出來(lái)一個(gè)對(duì)象,實(shí)際上數(shù)據(jù)庫(kù)并未被真正的創(chuàng)建,測(cè)試框架提供了一個(gè)獲取Context的方法
personSQLiteHelper.getWritableDatabase();//數(shù)據(jù)庫(kù)才會(huì)被真正的創(chuàng)建出來(lái), } }
33、sql語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
->javaweb:
->加載到j(luò)dbc的驅(qū)動(dòng);//android已經(jīng)集成在framework->鏈接到數(shù)據(jù)庫(kù);//只要拿到數(shù)據(jù)庫(kù)的引用
->準(zhǔn)備sql語(yǔ)句 增刪改查
->增加:insert into person(name,number)values('zhang','110')->刪除:delete from person where name = 'zhangsan'->修改:update person set number = '119' where name = 'zhangsan'->查找:select * from person->查找具體:select * from person where name = 'zhangsan'
->PersonSQLiteHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/** * @數(shù)據(jù)庫(kù)的構(gòu)造方法,用來(lái)定義數(shù)據(jù)庫(kù)的名稱,數(shù)據(jù)庫(kù)查詢的結(jié)果集,數(shù)據(jù)庫(kù)的版本
*/ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫(kù)存放在什么位置,String name:數(shù)據(jù)庫(kù)名,factory一般為null,設(shè)置系統(tǒng)默認(rèn)的游標(biāo)工廠,
自薦信_(tái)XXX_151********
姓名:XXX
電話:151********
郵箱:********n2009@126.com
尊敬的老師:
你好,我叫XXX,今年24歲,就讀于XXXX,XXXX專業(yè),將于2012年畢業(yè)。性格稍內(nèi)向,善于交流,看待事情能夠理性認(rèn)識(shí),善于思考,有團(tuán)隊(duì)合作精神。在學(xué)校的這三年多的時(shí)間里,由于專業(yè)需要,對(duì)計(jì)算機(jī)接觸較多。在開設(shè)的課程中學(xué)過(guò)C語(yǔ)言、C#、java等編程語(yǔ)言,對(duì)編程語(yǔ)言有一定的了解。在接觸java程序語(yǔ)言和J2ME手機(jī)游戲開發(fā)的學(xué)習(xí)中,對(duì)java產(chǎn)生了強(qiáng)烈的興趣,并對(duì)java學(xué)習(xí)有了一定的基礎(chǔ)。通過(guò)“黑馬程序員訓(xùn)練營(yíng)”的官網(wǎng),我了解到了javaee+3G課程體系所包含的知識(shí)面廣,是經(jīng)過(guò)對(duì)java前景分析和現(xiàn)在就業(yè)所需技術(shù)要求而制定的,對(duì)我們這些即將參加就業(yè)、想?yún)⒓觠ava方面工作的人來(lái)說(shuō)是最好的強(qiáng)心劑。課程安排科學(xué)合理,有助于學(xué)員深化對(duì)java的學(xué)習(xí),使學(xué)員掌握到真正前沿的技術(shù)。我深信,“黑馬程序員訓(xùn)練營(yíng)”的講師是java培訓(xùn)和開發(fā)方面最棒的,這也是我鐘情于“黑馬程序訓(xùn)練營(yíng)”的原因之一。由于家里生活拮據(jù),不想讓父母操心、給家里增加經(jīng)濟(jì)負(fù)擔(dān),是“黑馬程序員”給了我一個(gè)機(jī)會(huì)、給了我一份保證。
作為一名理科生,我有著很強(qiáng)的求知欲,勤奮,有上進(jìn)心,對(duì)于堅(jiān)信的事情能夠堅(jiān)持到底。在平時(shí)學(xué)習(xí)過(guò)程中,善于獨(dú)立思考,遇到問(wèn)題會(huì)嘗試各種方法去解決(網(wǎng)絡(luò)、老師、同學(xué)都是我的獲得知識(shí)的途徑)。平時(shí)喜歡看一些和自己專業(yè)的書籍,樂(lè)于了解一些最前沿的科技和未來(lái)的發(fā)展趨勢(shì)。注重的基礎(chǔ)知識(shí)的同時(shí),喜歡探索新知識(shí),在收獲知識(shí)的同時(shí)也收獲著樂(lè)趣。學(xué)習(xí)是一輩子的事情,也是一件樂(lè)事,就算將來(lái)學(xué)校的生活結(jié)束了,學(xué)習(xí)也永遠(yuǎn)不會(huì)落下。
我非常期待能成為“黑馬程序員訓(xùn)練營(yíng)”的一員,如果這個(gè)愿望能實(shí)現(xiàn),我將以最大的熱情投入到“黑馬程序員訓(xùn)練營(yíng)”的學(xué)習(xí)中去,用自己的努力去實(shí)現(xiàn)的自身價(jià)值,用自己的成績(jī)回報(bào)“黑馬程序員訓(xùn)練營(yíng)”。我堅(jiān)定工作后的第一件事就是努力工作,用工資償還培訓(xùn)期間的費(fèi)用,絕不辜負(fù)“黑馬程序員訓(xùn)練營(yíng)”對(duì)我的信任和老師的培養(yǎng)!請(qǐng)給我一份信任,我將以自己的自己的行動(dòng)去回報(bào)。
擇是我的期望,給我一次機(jī)會(huì)還你一份驚喜。
非常感激你能在百忙之中翻閱我的自薦信。祝你工作順利,事業(yè)蒸蒸日上!
此致
敬禮
自薦人:XXX
2012年02月17號(hào)
黑馬程序員自薦信
在當(dāng)今社會(huì)中,需要使用自薦信的場(chǎng)合越來(lái)越多,自薦信可以幫助我們更好地提出請(qǐng)求。你還在為寫自薦信而苦惱嗎?以下是小編為大家整理的黑馬程序員自薦信,僅供參考,希望能夠幫助到大家。
尊敬的老師:
您好!
在閱讀過(guò)幾十份,甚至上百份的自薦信之后,或許,您已經(jīng)有了些許疲倦與困意,但還是感謝您打開了我的這封自薦信。對(duì)于您來(lái)說(shuō),或許只是打開了一封信,而對(duì)于我來(lái)說(shuō),您為我開啟了一扇窗,一扇可以看見未來(lái),追逐夢(mèng)想的的窗戶。
我是趙玉杰,現(xiàn)在就讀于沈陽(yáng)建筑大學(xué),理學(xué)院,信息與計(jì)算科學(xué)專業(yè),目前大三。說(shuō)起來(lái),我也和黑馬有點(diǎn)緣分,由于專業(yè)的.相近性,我在學(xué)校學(xué)習(xí)了c語(yǔ)言,c++語(yǔ)言,java語(yǔ)言,數(shù)據(jù)庫(kù)(sql),數(shù)據(jù)結(jié)構(gòu)(c語(yǔ)言版),計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng)等相關(guān)科目,算是有一點(diǎn)基礎(chǔ),但也僅僅只能是基礎(chǔ)。這個(gè)社會(huì)需要的不是基礎(chǔ),而是真才實(shí)干。
力,獲得足夠的項(xiàng)目經(jīng)驗(yàn),掌握得心應(yīng)手的實(shí)際操作……就是讓我從眾多畢業(yè)生里面脫穎而出的最佳選擇。為了這一目標(biāo),我發(fā)現(xiàn)了黑馬,一匹讓我很驚訝的黑馬??!
“黑馬程序員”成立于20xx年,20xx年正式上線運(yùn)營(yíng)。在短短的3年里,在it培訓(xùn)行業(yè),“黑馬程序員”不負(fù)眾望的成為了一匹業(yè)界高度認(rèn)可的黑馬。在短短的四年時(shí)間里,“黑馬程序員”為社會(huì)塑造了一大批it相關(guān)行業(yè)的精英。從黑馬畢業(yè)的學(xué)員,得到了公司與社會(huì)的認(rèn)可,實(shí)現(xiàn)了自己的社會(huì)價(jià)值,人生目標(biāo)。在中關(guān)村軟件園與csdn的大力支持下,在傳智播客的教學(xué)實(shí)施下,“黑馬程序員”已經(jīng)成為了程序員的一種標(biāo)榜,而能成為“黑馬程序員”的一員,是每一個(gè)程序員的愿望,更是一種榮耀。而我更是殷切的希望能夠成為黑馬的一員,讓我脫穎而出,讓我底氣十足。
關(guān)于黑馬的“0學(xué)費(fèi)入學(xué)”教學(xué)理念,也是特別吸引我的一大亮點(diǎn)。據(jù)我了解,每一位黑馬學(xué)員都必須通過(guò)長(zhǎng)達(dá)2個(gè)月的面試流程,在技術(shù),自學(xué)能力,性格,壓力,品德等等全方位測(cè)試。可以說(shuō),黑馬程序員訓(xùn)練營(yíng)的所有學(xué)員都是精挑細(xì)選出來(lái)的。我很期待能與這樣的精英一起努力。畢業(yè)之后,“工資低于4k,不收任何費(fèi)用,”只有真正有實(shí)力,有責(zé)任,有擔(dān)當(dāng)?shù)暮隈R才能說(shuō)的出口。而從黑馬走出的每一個(gè)學(xué)員,都有能力,有責(zé)任,有義務(wù)履行我們當(dāng)初的還款以及相關(guān)協(xié)議,關(guān)于這一點(diǎn),我堅(jiān)信不疑。
黑馬程序員基礎(chǔ)測(cè)試題
1、已知一個(gè)int數(shù)組, 編程從數(shù)組中獲取最大數(shù).2、編寫一個(gè)方法(名字自定,但要符合Java編碼規(guī)范),方法內(nèi)打印一字符串,并在main()方法內(nèi)調(diào)用它。
3、環(huán)境變量path和classpath的作用是什么?
系統(tǒng)環(huán)境 path 為了更方便應(yīng)用java 開發(fā)工具 將要執(zhí)行命令的所在路徑給系統(tǒng)、讓系統(tǒng)去尋找 方便執(zhí)行、必須是可執(zhí)行文件先找當(dāng)前路徑再找path 路徑 臨時(shí)配置方式 通過(guò)set 命令完成、設(shè)置查看環(huán)境變量的值 在path環(huán)境變量的基礎(chǔ)上添加新的目錄 在任意目錄下執(zhí)行java 執(zhí)行程序 專門給類文件設(shè)置路徑 將class 文件所在目錄 告訴系統(tǒng),讓系統(tǒng)去尋找 虛擬機(jī)先從classpath 尋找
4、UDP協(xié)議與TCP協(xié)議有什么不同?
5、編寫一個(gè)類Person,為Person類定義年齡、姓名兩個(gè)屬性,并且定義一個(gè)SayHello方法,方法執(zhí)行時(shí)輸出“我是***我的年齡是***”;定義一個(gè)Chinese類從Person類繼承。
6、創(chuàng)建一個(gè)包含有private的屬性和private方法的類。然后創(chuàng)建一個(gè)內(nèi)部類,它有一個(gè)方法可用來(lái)修改外部類的屬性,并調(diào)用外部類的方法。在外部類的另一個(gè)方法中,創(chuàng)建此內(nèi)部類的對(duì)象,并且調(diào)用它的方法。
7、用控制臺(tái)程序輸出九九乘法表;輸出結(jié)果按下圖所示:
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
.........8、編寫程序拷貝一個(gè)文件, 盡量使用效率高的方式.9、編寫HTML注冊(cè)表單, 需要字段: 用戶名, 密碼, 確認(rèn)密碼, 性別(單選), 城市(下拉列表), 興趣愛好(多選), 個(gè)人簡(jiǎn)介(文本域).10、定義一個(gè)學(xué)生類, 需要有姓名, 年齡, 考試成績(jī)?nèi)齻€(gè)成員屬性,創(chuàng)建5個(gè)對(duì)象, 屬性可為任意值.編程對(duì)這5個(gè)對(duì)象按成績(jī)排序,并將結(jié)果輸出。(提示,用TreeSet和Comparator實(shí)現(xiàn))