Xxxx
郵箱:手機:籍貫:年齡:
職位申請: Android軟件工程師
教育背景:
2011/12-2012/05oracle學(xué)習(xí)中心Android軟件開發(fā)培訓(xùn)
2009/09-2012/06大連職業(yè)技術(shù)學(xué)院網(wǎng)絡(luò)技術(shù)專業(yè)大專 專業(yè)技能:
? 熟悉JAVA編程語言,掌握面向?qū)ο缶幊趟枷?/p>
? 熟悉Android平臺開發(fā)環(huán)境,熟悉Android SDK開發(fā)工具
? 熟悉Android平臺的應(yīng)用開發(fā)
? 熟悉Linux環(huán)境,以及相關(guān)的Android開發(fā)環(huán)境.項目經(jīng)歷:
? 基于Android平臺的拼圖游戲時間:兩周指定任意一張圖片進行游戲,該程序把圖片切割成十六個亂序的小圖塊,然后讓用戶通過移動小圖塊來完成拼圖。在此項目中,本人負責(zé)了游戲界面的設(shè)計,在Eclipse和Android SDK的開發(fā)環(huán)境下。完成了該游戲圖片的切割、打亂、圖片移動算法的編碼,該游戲能成功并流暢地在Android設(shè)備上運行。? 智能課程表應(yīng)用程序(團隊合作)時間:四周該應(yīng)用程序基于在客戶端的數(shù)據(jù)庫存放學(xué)校、院系、專業(yè)、課程等數(shù)據(jù)從而進行大學(xué)課表的設(shè)置;通過專業(yè)定位到自己所修課程在上課時間的設(shè)置,手機自動靜音或震動;有顯示課表功能供;智能課表讓大學(xué)生可以不用再去記繁瑣的上課時間,設(shè)置完成后在上課之前自動提醒,課上自動調(diào)成靜音或者震動。本人參與了需求分析,整體功能,以及客戶端應(yīng)用程序UI模塊的設(shè)計。在項目中負責(zé)了一些界面的處理和功能的實現(xiàn),還有項目中數(shù)據(jù)庫的建立和數(shù)據(jù)庫與項目的連接。
? Android平臺的俄羅斯方塊時間:二周該項目是本人獨立在Android中實現(xiàn)的俄羅斯方塊程序,是一款相當(dāng)經(jīng)典的小游戲,游戲中沒有特別難的開發(fā)發(fā)面的東西,主要是在surfaceview中實現(xiàn)的,游戲主要是靠在畫布中進行一些判斷。最大的難點就是不同方塊的模型的建立,把模型建立好了以后,就可以利用這些模型在游戲中進行運算,從而實現(xiàn)俄羅斯方塊的功能。
實訓(xùn)經(jīng)歷:
? 北京市北郵3G培訓(xùn)機構(gòu)2011.09-2012.03實習(xí)培訓(xùn)
主要學(xué)習(xí)Android軟件應(yīng)用與開發(fā)理論,JAVA編程語言,以及其他軟件開發(fā)理論。在老師的指導(dǎo)下,通過不斷實踐訓(xùn)練,提高了軟件開發(fā)水平,為以后工作打下了扎實的基礎(chǔ)。
興趣愛好
看書、圍棋、籃球、旅游
培訓(xùn)課程
? Android布局的概念,Android菜單介紹,常用UI組件的使用和總結(jié)
? 了解Android3D動畫實現(xiàn)
? 對Android項目的開發(fā)與實踐
自我評價
本人熱愛學(xué)習(xí),對于軟件開發(fā)很感興趣,快速學(xué)習(xí)能力強。愛思考并喜歡創(chuàng)新。對工作認真負責(zé),善于團隊合作、有較強的團隊溝通能力、能吃苦耐勞。Android的巨大魅力吸引我愿意用巨大熱情投入到與之相關(guān)的開發(fā)工作中。而且我也相信,在我扎實的專業(yè)知識基礎(chǔ)上能給貴公司獻上我的一份薄力。
個人簡歷
個人信息
姓名:XXX
年齡:XX
學(xué)歷:本科
聯(lián)系電話:186XXXXXXX
個人技能
1.熟練掌握JAVA面向?qū)ο缶幊陶Z言,有良好的編碼習(xí)慣;
2.熟悉jsp、javascript、servlet、javaBean進行web應(yīng)用開發(fā),了解jQuery,ajax等技術(shù);
3.能使用Struts2、Hibernate、Spring等開源框架技術(shù);
4.熟練操作SQL sever、MySQL數(shù)據(jù)庫,熟悉SQL語句;
5.熟練掌握Android adt編程環(huán)境和調(diào)試流程;
6.熟練掌握Android的4大組件和5種常用布局;
7.熟練Sqlite、File、SharePreference等存儲方式;
8.熟練使用xml、json等解析技術(shù);
9.熟悉編程軟件環(huán)境配置,熟練運用Eclipse和MyEclipse等編程軟件。
教育培訓(xùn)
2009年9月——2013年6月
2012年2月——2012年5月
項目經(jīng)驗
1.Android選課系統(tǒng)
描述:一款基于Android平臺的選課軟件,通過軟件訪問WEB短的服務(wù)器進行操作,web端采用servlet實現(xiàn),能進行課程的查詢、添加、刪除。
2.基于SSH的論壇
描述:實現(xiàn)簡單的注冊登錄功能,用戶可創(chuàng)建自己的論壇并有管理權(quán)限,會員可發(fā)帖,帖子有回復(fù)功能,版主可管理自己的帖子。
自我評價
我有一顆積極向上的心,對于軟件開發(fā)有較大興趣。喜歡運動,熱愛生活,熱愛學(xué)習(xí)。誠實做人,踏實做事是我的做人原則。有較強的團隊意識,比較善于團隊合作。我堅信,努力不一定會成功,但肯定會有收獲。我期待這個收獲的過程。我將投入自己全部的激情,努力奮進。
XX大學(xué)軟件工程 XXXXXAndroid軟件開發(fā) 性別:X 籍貫: 山東XX 專業(yè): 軟件工程 E-mail:XXXXXXX@126.com
董XX性別:男
年齡:24
電話:
現(xiàn)住地址:北京 海淀區(qū)
郵箱:.com
教育經(jīng)歷2007.9-2011.6濰坊學(xué)院計算機網(wǎng)絡(luò)工程統(tǒng)招本科 求職意向Android軟件開發(fā)工程師
專業(yè)技能? 熟練掌握Core Java編程, 具有扎實的技術(shù)功底,有良好的Java編程習(xí)慣 ? 熟練掌握常用UI控件,熟練常用布局及資源文件的使用
? 熟練掌握Android SDK應(yīng)用程序開發(fā)(Activity、Service、Broadcast、WebView、SQLite、Location、Media、Camera、Sensor、SMS、Contacts)
? 熟練Android平臺下的Http通信、Socket通信、XML解析(DOM、SAX、PULL)、? 熟悉使用Oracle、MySql數(shù)據(jù)庫、熟練使用SQL語句
? 熟練使用Eclipse、MyEclipse、hierarchyviewer、draw9patch、apktool等工具 ? 熟悉Linux/Unix常用命令
? 了解Android NDK編程 ? 了解JSP、JavaScript、Servlet、JQuery、Ajax、Tomcat等相關(guān)WEB應(yīng)用開發(fā)技術(shù) 項目經(jīng)驗? 項 目 一:某航空公司手機訂票系統(tǒng)
開發(fā)工具:Eclipse + ADT + Android SDK+ MySql
開發(fā)平臺:Windows平臺
技術(shù)實現(xiàn):Android常用UI組件自定義Adapter撥打電話
SQLite的使用Socket通信JDBC的增刪改查
項目描述:該系統(tǒng)是一個航空手機訂票系統(tǒng),主要功能有用戶登錄、用戶注冊、預(yù)訂機
票、訂單管理、基本賬戶管理、乘機人管理、聯(lián)系人管理、查詢網(wǎng)點、查詢機型、訂閱管理等功能。
責(zé)任描述:擔(dān)任項目小組長,負責(zé)組員之間代碼的整合,主要每天將組員修改的代碼整
合在一起,讓整個程序能夠正常的運行,并且負責(zé)實現(xiàn)了修改用戶密碼、訂單管理的功能。
? 項 目 二:GoMarket 2.1(安智市場)
開發(fā)工具:Eclipse + ADT + Android SDK +PhotoShop
開發(fā)平臺:Windows平臺
技術(shù)實現(xiàn):ListView數(shù)據(jù)的分頁加載Nine-Patch圖像Style機制
XML的解析(XmlPullParser)HTTP數(shù)據(jù)通信文件的下載及保存 項目描述:GoMarket是一個可以下載Android手機應(yīng)用程序的軟件,主要功能有下載
軟件、文件管理等功能,該項目主要模仿原程序?qū)W習(xí)復(fù)雜界面的布局和綜
合運用UI組件,實現(xiàn)軟件的下載和保存,以及掌握HttpClient連接服務(wù)
器讀取模擬數(shù)據(jù)、NotificationManager、XmlPullParse的運用。
責(zé)任描述:獨立完成了從Tomcat后臺服務(wù)器讀取模擬數(shù)據(jù),通過Pull解析,實現(xiàn)了
ListView數(shù)據(jù)的分頁加載和軟件的下載及保存
? 項 目 三:植物大戰(zhàn)僵尸
開發(fā)工具:Eclipse + ADT + Android SDK
開發(fā)平臺:Windows平臺
技術(shù)實現(xiàn):Surface雙緩沖技術(shù) CallBack回調(diào)Graphics繪圖Animation動畫 項目描述:該項目的主要目的是模仿植物大戰(zhàn)僵尸,了解自定義GameView類,學(xué)習(xí)如
何開發(fā)簡單游戲和了解游戲引擎以及一些游戲框架設(shè)計模式。責(zé)任描述:獨立完成了植物在畫布上顯示并能夠發(fā)子彈,讓僵尸能夠在畫布上運動 培訓(xùn)經(jīng)歷
2011.3--2011.8北京達內(nèi)科技有限公司Android開發(fā)工程師 興趣愛好
喜歡跑步、乒乓球、旅游等
自我評價?
?
?
? 熱衷于移動互聯(lián),對手機開發(fā)有著濃厚的興趣 性格樂觀,做事穩(wěn)重、待人誠懇,樂于助人,平時能和周圍的同學(xué)打成一片 有良好的編程習(xí)慣,有責(zé)任心,勇于承擔(dān)壓力,對工作飽滿熱情 有良好的團隊精神和自學(xué)能力,善于接受新事物,能很快的適應(yīng)新的環(huán)境(培訓(xùn)期間曾
擔(dān)任組長一職,整合組員之間代碼)
01、什么是3G 02、android系統(tǒng)簡介 03、android背景介紹 04、android的framewor簡介 05、兩種虛擬機的比較 06、sdk的下載以及簡介 07、創(chuàng)建android模擬器 08、ddms簡介
09、platform-tools的簡介及常見adb指令
10、android項目的目錄結(jié)構(gòu)
11、android下apk安裝的過程
12、常見的adb指令介紹
13、創(chuàng)建模擬器遇到的常見錯誤
14、電話撥號器
15、點擊事件的四種寫法
16、短信發(fā)送器
17、相對布局&單位介紹
18、現(xiàn)形布局&布局的組合
19、表格布局&絕對布局 20、幀布局
21、測試相關(guān)概念
22、android下junit測試框架配置
23、logcat簡介
24、保存文件到手機內(nèi)存
25、android下文件訪問的權(quán)限
26、保存文件到SD卡中
27、分析setting源代碼獲取SD卡大小
28、_sharePreference入門
29、xml文件的序列化 30、采用pull解析xml文件
31、采用斷電調(diào)試的方法觀察pull解析的的流程
32、android下創(chuàng)建一個sqllite數(shù)據(jù)庫
33、sql語句實現(xiàn)數(shù)據(jù)庫的增刪改查
34、系統(tǒng)api實現(xiàn)數(shù)據(jù)庫的增刪改查&Sqlite3工具的使用
35、數(shù)據(jù)庫的事物
36、listView入門
37、采用layoutInflater打氣筒創(chuàng)建一個view對象
38、采用數(shù)據(jù)適配器ArryAdapter
39、常用數(shù)據(jù)適配器simpleAdapter 40、數(shù)據(jù)適配器總結(jié)
41、內(nèi)容提供者簡介
42、內(nèi)容提供者的實現(xiàn)
43、短信的備份
44、插入一條記錄到系統(tǒng)短信應(yīng)用
45、內(nèi)容觀察者
46、獲取系統(tǒng)的聯(lián)系人信息
47、保存聯(lián)系人到系統(tǒng)通訊錄
48、讀取聯(lián)系人的一個小細節(jié)
49、網(wǎng)絡(luò)圖片查看器
50、anr產(chǎn)生的原理&如何避免
51、android消息機制入門
52、網(wǎng)絡(luò)html查看器
53、字符亂碼問題的處理
54、采用get方式提交數(shù)據(jù)到服務(wù)器
55、采用post方式提交數(shù)據(jù)到服務(wù)器
56、提交數(shù)據(jù)到服務(wù)器中文亂碼問題的處理
57、采用httpclient提交數(shù)據(jù)到服務(wù)器
58、異步http框架簡介&實現(xiàn)原理
59、異步http框架提交數(shù)據(jù)到服務(wù)器 60、上傳文件到服務(wù)器
61、smartimageview&常見開源代碼 62、多線程下載的原理 63、多線程斷點下載的原理
64、多線程java代碼移植到android 65、多線程下載文本頁面的更新 66、顯示意圖激活另一個activity 67、隱式意圖激活另一個activity 68、隱式意圖的配置
69、隱式意圖和顯示意圖的使用場景 70、在不同activity之間數(shù)據(jù)傳遞 71、activity的聲明周期 72、activity的啟動模式
73、activity橫豎屏切換的聲明周期 74、開啟新的activity獲取他的返回值 75、請求碼和結(jié)果碼的作用 76、利用廣播實現(xiàn)ip撥號 77、短信竊聽器
78、自定義廣播時間&發(fā)送自定義廣播&廣播接受者優(yōu)先級 79、采用服務(wù)執(zhí)行長期后臺操作 80、采用服務(wù)竊聽電話&服務(wù)的聲明周期 81、android進程優(yōu)先級&為什么使用服務(wù) 82、綁定方式開啟服務(wù)&調(diào)用服務(wù)的方法 83、服務(wù)的聲明周期(混合開啟 84、采用aidl綁定遠程服務(wù)
85、代碼注冊廣播接受者&利用廣播調(diào)用服務(wù)的辦法 86、加載大圖片到內(nèi)存 87、獲取圖片exif信息 88、從gallery獲取圖片 89、圖片畫畫板 90、扒開美女衣服 91、圖片的縮放 92、圖片的旋轉(zhuǎn)
93、圖片的平移&鏡面&倒影效果 94、圖片的合成 95、圖片的顏色處理 96、多媒體播放api簡介 97、人臉識別
98、mediaplayer的生命周期 99、soundpoo簡介
100、sufaceview的生命周期 101、播放在線視頻
102、視頻播放器進度的處理 103、調(diào)用系統(tǒng)照相機拍照和錄像 104、采用camera拍照 105、常見對話框 106、notification入門 107、菜單
108、android下的樣式 109、android下的主題
110、代碼編寫ui 111、html創(chuàng)建ui 112、幀動畫
113、代碼創(chuàng)建創(chuàng)建的tween動畫 114、xml文件定義動畫 115、傳感器簡介 116、117、殺死進程 118、apk的安裝 119、應(yīng)用程序的反編譯 120、動態(tài)創(chuàng)建fragment 121、用fragment創(chuàng)建一個選項卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之間的通訊 125、應(yīng)用程序國際化
04、android的framewor簡介
Wap:wait and play Wireless Makeup Language(WML)精簡的html語言 Applications:android自帶的基本上層應(yīng)用 Aplication framework:應(yīng)用程序框架 Librarics: Linux lernel:
05、兩種虛擬機的比較
編譯后文件格式:
jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架構(gòu):
jvm:基于棧的架構(gòu)
dalvik vm:基于寄存器的架構(gòu)
Cpu直接訪問寄存器因此dalvik虛擬機的效率比jvm高
06、sdk的下載以及簡介
->獲取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,實際上是eclipse的插件)SDK具體內(nèi)容
Android 4.2.2(API16)
->SDK Plateform:開發(fā)時使用到的jar包->Samples for sdk:
->ARM EABI V7a System Image:模擬器運行時的鏡像->Intel n86 Aton System:模擬器運行時的鏡像->MIPS System Image:模擬器運行時的鏡像->google APIs:google提供的jar包,可以直接使用google提供的一些API->source for android SDK:SDK全部的源代碼 Extrals:
->tools:開發(fā)的工具
->support library:實現(xiàn)高版本的android向下的兼容->google Admed Ads SDK:gongle提供的廣告插件->Analyties App Irackiong SDK:應(yīng)用的用戶分析->cloud message:云消息
->gongle play service:收費服務(wù)
->google USB Driver:真實的設(shè)備驅(qū)動
開發(fā)時:基于4.0,兼容2.2、2.3.3
07、創(chuàng)建android模擬器
avd:android virture developer VGA:480*640(電視的標準分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更寬)
08、ddms簡介
ddms:模擬器不支持中文,因此發(fā)送中文會顯示不出來
09、platform-tools的簡介及常見adb指令
Android調(diào)試橋:內(nèi)部實現(xiàn)就是socket讓兩個系統(tǒng)之間實現(xiàn)數(shù)據(jù)交互
->reset adb:模擬器找不到時候可以重啟->adb device:列出所有的連接的設(shè)備->adb kill-server:殺死adb調(diào)試橋->adb start-server 啟動adb調(diào)試橋 dx.bat:將.class文件打包
10、android項目的目錄結(jié)構(gòu)
一:SDK的目錄結(jié)構(gòu)
->Samples->Api demo:根據(jù)API demo(模擬器上面可以看見)的效果可以在sample中看見
相應(yīng)的代碼
->Source:jar包所有的sdk源代碼都在這個文件夾里->SystemImage:系統(tǒng)鏡像
->temp:下載更新臨時存儲的文件夾,一般是空的->tools:emulater.ext 不同版本的模擬器
二:New Android Application->theme:留給以后作為擴展,現(xiàn)在并沒有太大的作用->target SDK:一般選擇高版本,因為高版本對下兼容
->mark project as a library:一般不選擇,意思是將這個項目提供一個
jar包供別人使用 三:文件夾目錄
.setting:設(shè)置目錄
assets:資產(chǎn)目錄,存放一些文件,這些文件會被原封不動打包到應(yīng)用程序的 apk中
bin:
gen:自動生成的目錄
->builderConfig.java:生成的配置信息->R.java: Android 4.1.2->android.jar開發(fā)環(huán)境,jar包
可以在properties中修改,jar包就是SDK
011、Android下apk的安裝過程
一、Android安裝過程分析:
->setContentView:甚至view的對象,把里面的xml文件加載到
->在project中選擇build automaticly會自動把文件生成字節(jié)碼文件,.class $代表的class文件生成的是內(nèi)部類->dex.bat文件會把.class文件生成.dex文件
->apk壓縮文件解壓內(nèi)部內(nèi)容
->META-INF: 應(yīng)用程序的簽名
eclipse的調(diào)試簽名文件
->res:資源文件
->classes.dex:class文件
->resources.arsc:資源ID映射
->android軟件安裝的過程:
->拷貝xxx.apk帶/data/app/xxx-1.apk->在/data/data目錄下創(chuàng)建一個文件夾,文件夾名稱當(dāng)前應(yīng)用程序的報名
012、常見adb指令
前提:
->設(shè)備連接上電腦而且驅(qū)動安裝正常,如果安裝不正常的話,會有黃色的問號顯示;
->設(shè)備上打開USB調(diào)試;
指令:
->adb device(如果啟動發(fā)現(xiàn)這個程序沒有安裝會自動安裝)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多個設(shè)備的話,如果不指定安裝的是哪個設(shè)備程序會報錯->adb push haha.prop /sdcard/haha.txt 將文件移到
(360管家,豌豆莢之類的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話,會因為兩個adb指令搶端口號而掛掉)(adb版本之間兼容不是很好,經(jīng)常報錯可以考慮下版本的問題)->adb shell:遠程連接到了android的linux終端
ls:顯示文件夾
ps:顯示正在運行的程序 ping:網(wǎng)絡(luò)連通性
013、創(chuàng)建模擬器遇到的常見錯誤
->路徑最好不要有中文:
->應(yīng)用安裝不上,或者安裝模擬器的時候開啟一個新的模擬器:
可能是模擬器的資源被占用,模擬器在運行的時候其實占用著硬盤上面的一個文件,這個文件位于工作空間.android/avd/iphone.avd 里面會有鏡像文件,當(dāng)一個模擬器開啟起來了,就給你創(chuàng)建一個文件夾.knock的文件夾,代表著這個模擬器被鎖定了,如果把模擬器關(guān)掉,就沒有程序占據(jù)這幾個鏡像資源了,那么這幾個程序就會被自動刪除。通常情況下不會出問題,開啟時候創(chuàng)建文件,關(guān)閉時關(guān)閉文件,但是當(dāng)電腦出現(xiàn)不正常狀態(tài)時:比如藍屏,停電關(guān)機時候這些資源還沒來得及刪除,模擬器就關(guān)閉了,因此開啟時這些資源仍在,程序默認模擬器被占用,因此會重新開啟一個模擬器。
->模擬器沒有信號:
模擬器用socket橋接在電腦上
終結(jié)解決方案是給電腦連上網(wǎng),分配一個IP->常見命令操作:
14、電話撥號器
->新建文件
->界面設(shè)置:文本框、點擊按鈕
-> :一旦獲得焦點,會立刻彈出,輸入文本的軟鍵盤->ctrl+x刪除->ctrl+1提示
->設(shè)置點擊事件:找到空間,然后設(shè)置點擊事件,再點擊事件里面獲得了另外一
個空間的數(shù)據(jù),激活一個intent->獲得權(quán)限:清單文件中添加uses permision
15、點擊事件的四種寫法
->電話撥號器的優(yōu)化:
每次撥打電話都會執(zhí)行的操作是:查找控件,然后找到控件的文本,撥打電
話。其實每次撥打電話文本控件已經(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, “號碼不能為空”, 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、點擊事件的四種寫法:
->給按鈕注冊點擊事件:創(chuàng)建一個內(nèi)部類定義點擊事件。具體代碼見上
button.setOnClickListener(new MyListener());
->
2、采用匿名內(nèi)部類創(chuàng)建點擊事件:
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 自動生成的方法存根
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, “號碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} } }
->
3、如果有很多的按鈕點擊事件,建議用這種方式:讓Activity實現(xiàn)點擊 事件的接口,每個按鈕點擊事件都設(shè)置成this,讓該類實現(xiàn) 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 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, “號碼不能為空”, 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 自動生成的方法存根
switch(v.getId()){
case R.id.bt_dial:
callPhone();
break;
} } }->
4、在布局文件中綁定一個點擊的方法,如果點擊按鈕就會調(diào)用這個方法,通
過反射技術(shù)試圖調(diào)用這個方法
布局文件中設(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, “號碼不能為空”, 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è)計:兩個large Text,一個Button
android:textColor 設(shè)置字體顏色
android:singleLine=“true” 設(shè)置是否是單行
android:lines=“5” 設(shè)置行數(shù)
windows下面的顏色是GBR,而android下需要輸入的格式確實
RGB,所以需要轉(zhuǎn)換
adb默認設(shè)置time out為5秒->內(nèi)容設(shè)計:按鈕-文本->判斷->發(fā)送
導(dǎo)包的時候千萬別導(dǎo)到gsm包,否則會顯示過時;
發(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 自動生成的方法存根
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, “號碼或者內(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、相對布局&單位介紹
->布局說明:
->同級控件:
android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“
->相對父控件:
android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->對齊方式:
->文本顏色:#00000000~#ff000000(argb)文字的透明度->單位介紹:
dp也就是dip:device independent pixels(設(shè)備獨立像素),是一種與密度無關(guān)的像素單位,在每英寸160點的屏幕上,1dp = 1px。不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個,不依賴像素
1.2.android:layout_height=”wrap_content“
3.android:text=”@string/clickme“
4.android:layout_marginTop=”20dp“ />
scaled pixels(刻度像素).主要用于定義字體的大小,而從來不再layout上使用
o
1.2.android:layout_height=”wrap_content“
3.android:textSize=”20sp“ />
px:pixels(像素).不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多 總結(jié):dp也就是dip。這個和sp基本類似。如果設(shè)置表示長度、高度等屬性時可以使用dp或sp。但如果設(shè)置字體,需要使用sp。dp是與密度無關(guān),sp除了與密度無關(guān)外,還與scale無關(guān)。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)還是3.2寸),而屏幕密度變成了320。那么原來TextView的寬度設(shè)成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或160sp的話。系統(tǒng)會自動將width屬性值設(shè)置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統(tǒng)會根據(jù)屏幕密度的變化自動進行轉(zhuǎn)換.附:px 和 dp 互轉(zhuǎn)換
1.package com.hujl.util;import android.content.Context;
public class DensityUtil {
/**
* 根據(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ù)手機的分辨率從 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對象
android:layout_height=”1px“
android:background=”#ff0000“ > />
通常采用相對布局和絕對布局聯(lián)合使用的方式。
19、表格布局&絕對布局
->表格布局:渲染權(quán)重
->絕對布局:對控件位置任意擺放,需要計算不同屏幕中的位置,因為android
軟件的屏幕大小實在太多,所以并不方便,不推薦使用。
20、幀布局
>幀布局:
->類似于網(wǎng)頁布局中的div
android:visibility:”“ //顯示是否可見,播放器最喜歡使用幀布局,暫停播放的時候,會在上面顯示一個按鈕
21、測試相關(guān)概念
->根據(jù)測試測試是否知道程序的源代碼:
->黑盒測試:不知道源代碼,只關(guān)心程序執(zhí)行的過程和程序的結(jié)果,一個資
深的黑盒程序人員工資很高,因為他們和正常用戶的使用思維
不一樣
->白盒測試:根據(jù)源代碼寫測試方法或者測試用例->根據(jù)測試的粒子度:
->方法測試:function test->單元測試:unit test->集成測試:intergration test->根據(jù)測試的次數(shù):
->冒煙測試:smoke test 反復(fù)不停的執(zhí)行,反復(fù)不停的使用(android猴子
來測試)
->adb shell
->monkey
->monkey 5000(點擊五千次)
->壓力測試:pressure test同時抗住多人的請求->
22、android下junit測試框架配置
23、logcat簡介
->日志信息級別:
Verbose:提醒 黑色
Debug: 調(diào)試 藍色
Info: 信息 綠色
Warn: 警告 橙色
Error: 錯誤 紅色
24、保存文件到手機內(nèi)存
->數(shù)據(jù)存儲與訪問
->文件
->SharePreferences(參數(shù))
->SQLite數(shù)據(jù)庫
->內(nèi)容提供者(Content Provide)
->網(wǎng)絡(luò)
->LinearLayout一定要設(shè)置水平還是垂直->文件保存:
->javase中通過創(chuàng)建文件對象,但是在androi中這種存放方式會失敗,因
為會默認為存儲在當(dāng)前目錄文件下
->android中創(chuàng)建一個包:com.itheima.login.service
創(chuàng)建一個類:LoginService.java
異常的處理:如果是返回值是boolean,那么拋出處理都可以,但是如果返回值是void,那么只能拋出了
->context:上下文就是一個類,這個類提供了很多方便的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);//首先要把頁面加載進來然后才有控件的獲取
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ù)器驗證是否正確
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 自動生成的 catch 塊
e.printStackTrace();
return false;
} catch(IOException e){
// TODO 自動生成的 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 自動生成的 catch 塊
e.printStackTrace();
return null;
} catch(IOException e){
// TODO 自動生成的 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下文件訪問的權(quán)限
->private、readable、writeable、public
26、保存文件到SD卡中
->存儲空間:
->手機的內(nèi)部存儲空間:小硬盤 /data/data->外部存儲空間:SD卡 路徑/mnt/sdcard 可以簡寫成/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卡保護,讀就需要權(quán)限 READ_EXTER_STORAGE->判斷是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
->為了保證程序的兼容性,有些SD卡可能路徑會改變,因此系統(tǒng)提供了獲取SD 卡的路徑的方法
Environment.getExternalStorageDirectory()
27、分析setting源代碼獲取SD卡大小
->source的源代碼是SDK的源代碼,是jar里面的源代碼->導(dǎo)入通用的文件項目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 自動生成的方法存根
StringBuilder memorySizeInfo = new StringBuilder();
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
memorySizeInfo.append(getExternalSize());
}else{
Toast.makeText(MainActivity.this,”無內(nèi)存卡“, Toast.LENGTH_SHORT).show();
}
memorySizeInfo.append(getRomSpaceInfo());
tv_SDsize.setText(memorySizeInfo.toString());
}
});} /* * 獲取SD卡的存儲信息 */ 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總存儲空間:“+ totalStr + ”可使用的空間:“ + availStr;
return ExternalSize;} /* * 獲取可用的內(nèi)部存儲 */ 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ù)存儲的API:用##分割用戶名和密碼的缺陷,真實存
儲的話必須要把##轉(zhuǎn)移成其他字符,sharePreferences
(共享參數(shù))提供了一種方便存儲數(shù)據(jù)的方式。
->在data目錄下創(chuàng)建了一個xml文件,根節(jié)點是map,其實是以map集合來存
儲的用戶名和密碼的對特殊字符進行了轉(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(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ù)庫的事物
editor.commit();//當(dāng)前方法不會存在異常,所以設(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);//首先要把頁面加載進來然后才有控件的獲取
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ù)器驗證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
29、xml文件的序列化
->一個小異常:如果沒有識別這個設(shè)備,重啟的話要記得吧adb殺掉->自己手動添加,這種方式效率低,容易出錯->XmlSerializer:XML序列化生成器
30、采用pull解析xml文件
->用于對象的持久化,將對象寫到硬盤中,需要用的時候再反序列化取出來。
所謂序列化其實就是將程序中的數(shù)據(jù)(對象)通過某種方式,保存到本地中。然后可以在程序關(guān)閉之后還保存程序的某個執(zhí)行狀態(tài),方便在程序下次
執(zhí)行的時候通過”反序列化“讀取出來,并且能夠還原數(shù)據(jù)的類型,從而延續(xù)程序退出時的狀態(tài)。
一般來說,我們會使用序列化保存一些需要持久化的數(shù)據(jù),當(dāng)然如果這個數(shù)據(jù)會比較龐大的話,我們就直接使用數(shù)據(jù)庫了!所以,序列化實際上目前很多領(lǐng)域用的已經(jīng)不多了,大部分使用 都已被數(shù)據(jù)庫替代了!
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化??梢詫α骰蟮膶ο筮M行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStrea
->xml文件的解析方式:
->DOM一次將XML文件加載進內(nèi)存,生成樹狀結(jié)構(gòu),在內(nèi)存中對樹狀結(jié)構(gòu)進
行操作,缺點是消耗內(nèi)存大,->SAX解析:基于事件的方式,自上而下,事件下去了就不能解析了,優(yōu)點
是速度快,效率高,缺點是不能倒退;
->android下增加了一種解析xml文件的方式,pull解析,類似于SAX解析,定義了一個指針,指向了文檔的開頭,得到指針,一個tag一個tag的解析下去
->利用類加載器走到文件->創(chuàng)建一個解析器: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())){//解析到全局開始的標簽
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ào)試的方法觀察pull解析的的流程
->現(xiàn)在代碼雙單擊添加斷點
->debug as Android Application->然后打開調(diào)試視圖
32、android下創(chuàng)建一個sqllite數(shù)據(jù)庫
->SQLiteOpenHelper(數(shù)據(jù)庫大概幫助類):數(shù)據(jù)庫創(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ù)庫的構(gòu)造方法,用來定義數(shù)據(jù)庫的名稱,數(shù)據(jù)庫查詢的結(jié)果集,數(shù)據(jù)庫的版本 */ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫存放在什么位置,String name:數(shù)據(jù)庫名,factory一般為null,設(shè)置系統(tǒng)默認的游標工廠,super(context, ”Person.db“, null, 1);
} /* * 數(shù)據(jù)庫第一次被創(chuàng)建的時候調(diào)用的方法,db創(chuàng)建的數(shù)據(jù)庫 */ @Override public void onCreate(SQLiteDatabase db){
db.execSQL(”create table person id integer primary antoincrement,name varchar(20),number varchar(20)");//底層存儲類型都是String,(20)都是給程序員看的,其實沒有影響
}
/*(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出來一個對象,實際上數(shù)據(jù)庫并未被真正的創(chuàng)建,測試框架提供了一個獲取Context的方法
personSQLiteHelper.getWritableDatabase();//數(shù)據(jù)庫才會被真正的創(chuàng)建出來, } }
33、sql語句實現(xiàn)數(shù)據(jù)庫的增刪改查
->javaweb:
->加載到j(luò)dbc的驅(qū)動;//android已經(jīng)集成在framework->鏈接到數(shù)據(jù)庫;//只要拿到數(shù)據(jù)庫的引用
->準備sql語句 增刪改查
->增加: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ù)庫的構(gòu)造方法,用來定義數(shù)據(jù)庫的名稱,數(shù)據(jù)庫查詢的結(jié)果集,數(shù)據(jù)庫的版本
*/ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫存放在什么位置,String name:數(shù)據(jù)庫名,factory一般為null,設(shè)置系統(tǒng)默認的游標工廠,
院系:美術(shù)學(xué)院班級:11級美術(shù)學(xué)國畫一班學(xué)號:111014021姓名:李星
自我介紹
我是一名應(yīng)屆畢業(yè)生,來自河南濟源的一個農(nóng)村家庭,農(nóng)村生活鑄就了我淳樸、誠實、善良的性格,培養(yǎng)了我不怕困難挫折,不服輸?shù)膴^斗精神。
在學(xué)習(xí)和生活中我總是嚴格要求自己,凡事沒有最好,只有更好。我深知學(xué)習(xí)機會來之不易,在校期間非常重視專業(yè)課的學(xué)習(xí),專業(yè)課成績總是名列前茅。同時,在文化課方面也取得了良好的成績。
專業(yè)課獲獎情況:
① 2013年版畫作品入選洛陽博物館,并被學(xué)校收藏
②2013年6月第六屆宿舍文化節(jié)”留住美好時光作品展”活動中,榮獲優(yōu)秀獎
③2013年山水作品入選學(xué)校展覽
文化課獲獎情況:
① 2011-2012學(xué)年榮獲“國家勵志獎學(xué)金”證書
② 2011-2012學(xué)年榮獲“三好學(xué)生”證書
③ 2012-2013學(xué)年榮獲“三好學(xué)生”證書
④ 2012-2013學(xué)年榮獲“優(yōu)秀團員”證書
⑤ 2012-2013學(xué)年榮獲“國家勵志獎學(xué)金”證書
而在學(xué)習(xí)專業(yè)知識和文化課的同時,還十分重視培養(yǎng)自己的實踐能力,利用暑假參加了暑期三下鄉(xiāng)(支教)活動,并在2013年獲得“暑期實踐先進個人”榮譽稱號。從這次活動中我也學(xué)到了書本上學(xué)不到的知識,更加鍛煉了我的能力,對我以后的從事教育工作,打下一個小小的基礎(chǔ),更加激勵我向前邁進。
做一名合格的老師是我一直以來努力的方向,所以我始終按一名老師的要求來約束自己,“沒有最好,只有更好”是我大學(xué)一直在做的。
在學(xué)習(xí)之余,我還不忘多卡一些課外書籍,豐富自己的知識,拓寬自己的知識面,而且堅持參加各種體育活動與社交活動。在學(xué)習(xí)方面,我學(xué)習(xí)認真、刻苦,具有較好的文字組織能力,有一定的英語聽說讀寫能力。在思想行為方面,我作風(fēng)優(yōu)良、待人誠懇,能較好處理人際關(guān)際,在學(xué)校和同學(xué)相處融洽;樂觀面對一些挫折,處事冷靜穩(wěn)健,能合理地統(tǒng)籌安排生活中的事務(wù)。
總之,在大學(xué)期間,我始終以提高自身的綜合素質(zhì)為目標,以自我的全面發(fā)展為努力方向,樹立正確的人生觀、價值觀和世界觀。為適應(yīng)社會發(fā)展的需求,我認真學(xué)習(xí)各種專業(yè)知識,發(fā)揮自己的特長;挖掘自身的潛力,結(jié)合每年的暑期社會實踐機會,從而逐步提高了自己的學(xué)習(xí)能力和分析處理問題的能力
院系:美術(shù)學(xué)院班級:11級美術(shù)學(xué)國畫一班學(xué)號:111014021姓名:李星 而教師是教育過程中的主導(dǎo)力量。教師道德品質(zhì)不僅是教師自身的行為規(guī)范,而且還是作用于學(xué)生的教育手段。其高尚與否,關(guān)系到到素質(zhì)教育能否得以正確順利地實施。
教師必須有高尚的品德。教師職業(yè)的最大特點是培養(yǎng)、塑造新一代,自己的道德品質(zhì)將直接影響下一代的成長。在教育活動過程中,教師既要把豐富的科學(xué)文化知識傳授給學(xué)生,又要用自己的高尚人格影響學(xué)生、感化學(xué)生,使學(xué)生的身心健康地成長發(fā)展。因而教師必須要有高尚的思想境界,純潔美好的心靈。在工作中,教師要安貧樂教,甘于奉獻。必須耐得住寂寞,受得住挫折,將自己的所有精力全身心地投入到教學(xué)實踐中去,正如著名教育家陶行知所說的“捧得一顆心來,不帶半根草去”。
教師對學(xué)生要有一顆慈母般的愛心。教師對學(xué)生慈母般的愛心應(yīng)來自對教育事業(yè)的無限忠誠,對教育事業(yè)的強烈事業(yè)心和高度責(zé)任感。教師的母愛精神具有巨大的感召作用和教化力量,她能徹底地化解學(xué)生的逆反心理和對抗情緒,最大限度地激發(fā)學(xué)生的學(xué)習(xí)主觀能動性。在日常教學(xué)中,教師如像母親一樣,無微不至地關(guān)心學(xué)生,幫助學(xué)生,對差生不嫌棄,不歧視,給他們多一點愛,就能極大地激發(fā)學(xué)生的積極性,使其在學(xué)習(xí)上有無窮的力量源泉。很多教師的成功經(jīng)驗都證明了母愛力量的神奇作用。
教師要不斷更新充實自己的學(xué)識。博學(xué)多才對一位教師來說當(dāng)然很重要。因作我們是直接面對學(xué)生的教育者,學(xué)生什么問題都會提出來,而且往往“打破沙鍋問到底”。沒有廣博的知識,就不能很好地解學(xué)生之“惑”,傳為人之“道”。但知識絕不是處于靜止的狀態(tài),它在不斷地豐富和發(fā)展,每時每刻都在日新月異地發(fā)生著量和質(zhì)的變化,特別是被稱作“知識爆炸時代”、“數(shù)字時代”、“互聯(lián)網(wǎng)時代”的今天。因而,我們這些為師者讓自己的知識處于不斷更新的狀態(tài),跟上時代發(fā)展趨勢,不斷更新教育觀念,改革教學(xué)內(nèi)容和方法,顯得更為重要。否則,不去更新,不去充實,你那點知識就是一桶死水,終會走向腐化。
通過學(xué)習(xí),我深知作為人類靈魂的工程師,必須具有高尚的道德品質(zhì),對學(xué)生要有慈母般的愛心,且不斷更新、充實自己的知識,做到與時代同步,才能培養(yǎng)出符合社會發(fā)展需要的人才,挑好肩上教書育人的重擔(dān)。
所以我會始終按一名老師的要求來約束自己,做好以上的幾點,為教師之路向前邁進。