黑馬程序員android開發筆記(一)_第1頁
黑馬程序員android開發筆記(一)_第2頁
黑馬程序員android開發筆記(一)_第3頁
黑馬程序員android開發筆記(一)_第4頁
黑馬程序員android開發筆記(一)_第5頁
已閱讀5頁,還剩135頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

01、什么是3G02、android系統簡介03、android背景介紹04、android的framewor簡介05、兩種虛擬機的比較06、sdk的下載以及簡介07、創建android模擬器08、ddms簡介09、platform-tools的簡介及常見adb指令10、android項目的目錄結構11、android下apk安裝的過程12、常見的adb指令介紹13、創建模擬器遇到的常見錯誤14、電話撥號器15、點擊事件的四種寫法16、短信發送器17、相對布局&單位介紹18、現形布局&布局的組合19、表格布局&絕對布局20、幀布局21、測試相關概念22、android下junit測試框架配置23、logcat簡介24、保存文件到手機內存25、android下文件訪問的權限26、保存文件到SD卡中27、分析setting源代碼獲取SD卡大小28、_sharePreference入門29、xml文件的序列化30、采用pull解析xml文件31、采用斷電調試的方法觀察pull解析的的流程32、android下創建一個sqllite數據庫33、sql語句實現數據庫的增刪改查34、系統api實現數據庫的增刪改查&Sqlite3工具的使用35、數據庫的事物36、listView入門37、采用layoutInflater打氣筒創建一個view對象38、采用數據適配器ArryAdapter39、常用數據適配器simpleAdapter40、數據適配器總結41、內容提供者簡介42、內容提供者的實現43、短信的備份44、插入一條記錄到系統短信應用45、內容觀察者46、獲取系統的聯系人信息47、保存聯系人到系統通訊錄48、讀取聯系人的一個小細節49、網絡圖片查看器50、anr產生的原理&如何避免51、android消息機制入門52、網絡html查看器53、字符亂碼問題的處理54、采用get方式提交數據到服務器55、采用post方式提交數據到服務器56、提交數據到服務器中文亂碼問題的處理57、采用httpclient提交數據到服務器58、異步http框架簡介&實現原理59、異步http框架提交數據到服務器60、上傳文件到服務器61、smartimageview&常見開源代碼62、多線程下載的原理63、多線程斷點下載的原理64、多線程java代碼移植到android65、多線程下載文本頁面的更新66、顯示意圖激活另一個activity67、隱式意圖激活另一個activity68、隱式意圖的配置69、隱式意圖和顯示意圖的使用場景70、在不同activity之間數據傳遞71、activity的聲明周期72、activity的啟動模式73、activity橫豎屏切換的聲明周期74、開啟新的activity獲取他的返回值75、請求碼和結果碼的作用76、利用廣播實現ip撥號77、短信竊聽器78、自定義廣播時間&發送自定義廣播&廣播接受者優先級79、采用服務執行長期后臺操作80、采用服務竊聽電話&服務的聲明周期81、android進程優先級&為什么使用服務82、綁定方式開啟服務&調用服務的方法83、服務的聲明周期(混合開啟84、采用aidl綁定遠程服務85、代碼注冊廣播接受者&利用廣播調用服務的辦法86、加載大圖片到內存87、獲取圖片exif信息88、從gallery獲取圖片89、圖片畫畫板90、扒開美女衣服91、圖片的縮放92、圖片的旋轉93、圖片的平移&鏡面&倒影效果94、圖片的合成95、圖片的顏色處理96、多媒體播放api簡介97、人臉識別98、mediaplayer的生命周期99、soundpoo簡介100、sufaceview的生命周期101、播放在線視頻102、視頻播放器進度的處理103、調用系統照相機拍照和錄像104、采用camera拍照105、常見對話框106、notification入門107、菜單108、android下的樣式109、android下的主題110、代碼編寫ui111、html創建ui112、幀動畫113、代碼創建創建的tween動畫114、xml文件定義動畫115、傳感器簡介116、117、殺死進程118、apk的安裝119、應用程序的反編譯120、動態創建fragment121、用fragment創建一個選項卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之間的通訊125、應用程序國際化04、android的framewor簡介Wap:waitandplayWirelessMakeupLanguage(WML)精簡的html語言Applications:android自帶的基本上層應用Aplicationframework:應用程序框架Librarics:Linuxlernel:

05、兩種虛擬機的比較編譯后文件格式:jvm:.java->.class->.jardalvikvm:.java->.dex->.odex基于的架構:jvm:基于棧的架構dalvikvm:基于寄存器的架構Cpu直接訪問寄存器因此dalvik虛擬機的效率比jvm高06、sdk的下載以及簡介->獲取sdk工具包(sdk:standarddevelopekits)->ADT(androiddeveloptools,實際上是eclipse的插件)SDK具體內容Android4.2.2(API16)->SDKPlateform:開發時使用到的jar包->Samplesforsdk:->ARMEABIV7aSystemImage:模擬器運行時的鏡像->Inteln86AtonSystem:模擬器運行時的鏡像->MIPSSystemImage:模擬器運行時的鏡像->googleAPIs:google提供的jar包,可以直接使用google提供的一些API->sourceforandroidSDK:SDK全部的源代碼Extrals:->tools:開發的工具->supportlibrary:實現高版本的android向下的兼容->googleAdmedAdsSDK:gongle提供的廣告插件->AnalytiesAppIrackiongSDK:應用的用戶分析->cloudmessage:云消息->gongleplayservice:收費服務->googleUSBDriver:真實的設備驅動開發時:基于4.0,兼容2.2、2.3.307、創建android模擬器avd:androidvirturedeveloperVGA:480*640(電視的標準分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更寬)08、ddms簡介ddms:模擬器不支持中文,因此發送中文會顯示不出來09、platform-tools的簡介及常見adb指令Android調試橋:內部實現就是socket讓兩個系統之間實現數據交互->resetadb:模擬器找不到時候可以重啟->adbdevice:列出所有的連接的設備->adbkill-server:殺死adb調試橋->adbstart-server啟動adb調試橋dx.bat:將.class文件打包android項目的目錄結構一:SDK的目錄結構->Samples->Apidemo:根據APIdemo(模擬器上面可以看見)的效果可以在sample中看見 相應的代碼->Source:jar包所有的sdk源代碼都在這個文件夾里->SystemImage:系統鏡像->temp:下載更新臨時存儲的文件夾,一般是空的->tools:emulater.ext不同版本的模擬器二:NewAndroidApplication->theme:留給以后作為擴展,現在并沒有太大的作用->targetSDK:一般選擇高版本,因為高版本對下兼容->markprojectasalibrary:一般不選擇,意思是將這個項目提供一個 jar包供別人使用三:文件夾目錄.setting:設置目錄assets:資產目錄,存放一些文件,這些文件會被原封不動打包到應用程序的 apk中bin:gen:自動生成的目錄->builderConfig.java:生成的配置信息->R.java:Android4.1.2->android.jar開發環境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安裝過程一、Android安裝過程分析:->setContentView:甚至view的對象,把里面的xml文件加載到->在project中選擇buildautomaticly會自動把文件生成字節碼文件,.class$代表的class文件生成的是內部類->dex.bat文件會把.class文件生成.dex文件->apk壓縮文件解壓內部內容->META-INF:應用程序的簽名eclipse的調試簽名文件->res:資源文件->classes.dex:class文件->resources.arsc:資源ID映射->android軟件安裝的過程: ->拷貝xxx.apk帶/data/app/xxx-1.apk->在/data/data目錄下創建一個文件夾,文件夾名稱當前應用程序的報名012、常見adb指令前提:->設備連接上電腦而且驅動安裝正常,如果安裝不正常的話,會有黃色的問號顯示;->設備上打開USB調試;指令:->adbdevice(如果啟動發現這個程序沒有安裝會自動安裝)->adbkill-server->adbstart-server->adbuninstall<包名>->adb-semulator-5554installc:\\users\\administrator\\hello.apk如果有多個設備的話,如果不指定安裝的是哪個設備程序會報錯->adbpushp/sdcard/haha.txt將文件移到(360管家,豌豆莢之類的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話,會因為兩個adb指令搶端口號而掛掉)(adb版本之間兼容不是很好,經常報錯可以考慮下版本的問題)->adbshell:遠程連接到了android的linux終端 ls:顯示文件夾ps:顯示正在運行的程序ping:網絡連通性013、創建模擬器遇到的常見錯誤->路徑最好不要有中文:->應用安裝不上,或者安裝模擬器的時候開啟一個新的模擬器:可能是模擬器的資源被占用,模擬器在運行的時候其實占用著硬盤上面的一個文件,這個文件位于工作空間.android/avd/iphone.avd里面會有鏡像文件,當一個模擬器開啟起來了,就給你創建一個文件夾.knock的文件夾,代表著這個模擬器被鎖定了,如果把模擬器關掉,就沒有程序占據這幾個鏡像資源了,那么這幾個程序就會被自動刪除。通常情況下不會出問題,開啟時候創建文件,關閉時關閉文件,但是當電腦出現不正常狀態時:比如藍屏,停電關機時候這些資源還沒來得及刪除,模擬器就關閉了,因此開啟時這些資源仍在,程序默認模擬器被占用,因此會重新開啟一個模擬器。->模擬器沒有信號:模擬器用socket橋接在電腦上終結解決方案是給電腦連上網,分配一個IP->常見命令操作:14、電話撥號器->新建文件->界面設置:文本框、點擊按鈕-><requestFocus/>:一旦獲得焦點,會立刻彈出,輸入文本的軟鍵盤->ctrl+x刪除->ctrl+1提示->設置點擊事件:找到空間,然后設置點擊事件,再點擊事件里面獲得了另外一 個空間的數據,激活一個intent->獲得權限:清單文件中添加usespermision15、點擊事件的四種寫法->電話撥號器的優化: 每次撥打電話都會執行的操作是:查找控件,然后找到控件的文本,撥打電話。其實每次撥打電話文本控件已經創建好了沒有必要每次查找按鈕之后再 查詢控件。packagecn.wqrt.mobile;importandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassMainActivityextendsActivity{ privateEditTextet_number;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbutton=(Button)findViewById(R.id.bt_dial);et_number=(EditText)findViewById(R.id.et_number);button.setOnClickListener(newMyListener());}privateclassMyListenerimplementsandroid.view.View.OnClickListener{ @Override publicvoidonClick(Viewarg0){ Stringnumber=et_number.getText().toString().trim();//去除回車和空格 if(TextUtils.isEmpty(number)){ Toast.makeText(MainActivity.this,"號碼不能為空",Toast.LENGTH_SHORT).show(); return; } Intentintent=newIntent(); intent.setAction(intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); }}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;}}->1、點擊事件的四種寫法: ->給按鈕注冊點擊事件:創建一個內部類定義點擊事件。具體代碼見上 button.setOnClickListener(newMyListener()); ->2、采用匿名內部類創建點擊事件: button.setOnClickListener(newOnClickListener()){\ packagecn.wqrt.mobile;importandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassMainActivityextendsActivity{ privateEditTextet_number;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbutton=(Button)findViewById(R.id.bt_dial);et_number=(EditText)findViewById(R.id.et_number);button.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewarg0){ //TODO自動生成的方法存根 callPhone(); }});}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;} privatevoidcallPhone(){ Stringnumber=et_number.getText().toString().trim();//去除回車和空格 if(TextUtils.isEmpty(number)){ Toast.makeText(MainActivity.this,"號碼不能為空",Toast.LENGTH_SHORT).show(); return; } Intentintent=newIntent(); intent.setAction(intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); }}} ->3、如果有很多的按鈕點擊事件,建議用這種方式:讓Activity實現點擊事件的接口,每個按鈕點擊事件都設置成this,讓該類實現OnClickListener然后進行判斷。packagecn.wqrt.mobile;importandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassMainActivityextendsActivityimplementsOnClickListener{ privateEditTextet_number;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbutton=(Button)findViewById(R.id.bt_dial);et_number=(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;} privatevoidcallPhone(){ Stringnumber=et_number.getText().toString().trim();//去除回車和空格 if(TextUtils.isEmpty(number)){ Toast.makeText(MainActivity.this,"號碼不能為空",Toast.LENGTH_SHORT).show(); return; } Intentintent=newIntent(); intent.setAction(intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); } @Override publicvoidonClick(Viewv){ //TODO自動生成的方法存根 switch(v.getId()){ caseR.id.bt_dial: callPhone(); break; } }}->4、在布局文件中綁定一個點擊的方法,如果點擊按鈕就會調用這個方法,通過反射技術試圖調用這個方法 布局文件中設置: packagecn.wqrt.mobile;importandroid.app.Activity;importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassMainActivityextendsActivity{ privateEditTextet_number;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbutton=(Button)findViewById(R.id.bt_dial);et_number=(EditText)findViewById(R.id.et_number);}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;} publicvoiddialButtonClick(Viewv){ callPhone();} privatevoidcallPhone(){ Stringnumber=et_number.getText().toString().trim();//去除回車和空格 if(TextUtils.isEmpty(number)){ Toast.makeText(MainActivity.this,"號碼不能為空",Toast.LENGTH_SHORT).show(); return; } Intentintent=newIntent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); }}16、短信發送器->界面的設計:兩個largeText,一個Button android:textColor設置字體顏色 android:singleLine="true"設置是否是單行 android:lines="5"設置行數 windows下面的顏色是GBR,而android下需要輸入的格式確實 RGB,所以需要轉換 adb默認設置timeout為5秒->內容設計:按鈕-文本->判斷->發送 導包的時候千萬別導到gsm包,否則會顯示過時; 發送沒有歷史記錄packagecom.example.sms;importjava.util.ArrayList;importandroid.app.Activity;importandroid.os.Bundle;importandroid.telephony.SmsManager;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassMainActivityextendsActivityimplementsOnClickListener{ privateEditTextet_number; privateEditTextet_content; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Buttonbutton=(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 publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } @Override publicvoidonClick(Viewv){ //TODO自動生成的方法存根 switch(v.getId()){ caseR.id.bt_send: Stringnumber=et_number.getText().toString().trim(); Stringcontent=et_content.getText().toString().trim(); if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){ Toast.makeText(this,"號碼或者內容不能為空",Toast.LENGTH_SHORT).show(); return; }else{ SmsManagersmsManager=SmsManager.getDefault(); ArrayList<String>contents=smsManager.divideMessage(content); for(Stringstr: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:deviceindependentpixels(設備獨立像素),是一種與密度無關的像素單位,在每英寸160點的屏幕上,1dp=1px。不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA推薦使用這個,不依賴像素<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/clickme"

android:layout_marginTop="20dp"

/>

scaledpixels(刻度像素).主要用于定義字體的大小,而從來不再layout上使用<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:textSize="20sp"

/>

px:pixels(像素).不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多總結:dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp或sp。但如果設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。那么原來TextView的寬度設成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。系統會自動將width屬性值設置成320px的。也就是160*320/160。其中320/160可稱為密度比例因子。也就是說,如果使用dp和sp,系統會根據屏幕密度的變化自動進行轉換.附:px和dp互轉換packagecom.hujl.util;

importandroid.content.Context;

publicclassDensityUtil{

/**

*根據手機的分辨率從dp的單位轉成為px(像素)

*/

publicstaticintdip2px(Contextcontext,floatdpValue){

finalfloatscale=context.getResources().getDisplayMetrics().density;

return(int)(dpValue*scale+0.5f);

}

/**

*根據手機的分辨率從px(像素)的單位轉成為dp

*/

publicstaticintpx2dip(Contextcontext,floatpxValue){

finalfloatscale=context.getResources().getDisplayMetrics().density;

return(int)(pxValue/scale+0.5f);

}

}

18、線性布局&布局的組合->線性布局: ->線:就是view對象 <Viewandroid:layout_width="fill_parent"android:layout_height="1px"android:background="#ff0000"

>/>通常采用相對布局和絕對布局聯合使用的方式。19、表格布局&絕對布局->表格布局:渲染權重->絕對布局:對控件位置任意擺放,需要計算不同屏幕中的位置,因為android 軟件的屏幕大小實在太多,所以并不方便,不推薦使用。20、幀布局>幀布局: ->類似于網頁布局中的div android:visibility:""http://顯示是否可見,播放器最喜歡使用幀布局, 暫停播放的時候,會在上面顯示一個按鈕21、測試相關概念->根據測試測試是否知道程序的源代碼: ->黑盒測試:不知道源代碼,只關心程序執行的過程和程序的結果,一個資 深的黑盒程序人員工資很高,因為他們和正常用戶的使用思維 不一樣 ->白盒測試:根據源代碼寫測試方法或者測試用例->根據測試的粒子度: ->方法測試:functiontest ->單元測試:unittest ->集成測試:intergrationtest->根據測試的次數: ->冒煙測試:smoketest反復不停的執行,反復不停的使用(android猴子 來測試) ->adbshell ->monkey ->monkey5000(點擊五千次) ->壓力測試:pressuretest同時抗住多人的請求->22、android下junit測試框架配置23、logcat簡介->日志信息級別: Verbose:提醒黑色 Debug:調試藍色 Info: 信息綠色 Warn: 警告橙色 Error:錯誤紅色24、保存文件到手機內存->數據存儲與訪問 ->文件 ->SharePreferences(參數) ->SQLite數據庫 ->內容提供者(ContentProvide) ->網絡->LinearLayout一定要設置水平還是垂直->文件保存: ->javase中通過創建文件對象,但是在androi中這種存放方式會失敗,因 為會默認為存儲在當前目錄文件下->android中創建一個包:com.itheima.login.service 創建一個類:LoginService.java 異常的處理:如果是返回值是boolean,那么拋出處理都可以, 但是如果返回值是void,那么只能拋出了->context:上下文就是一個類,這個類提供了很多方便的API,可以得到應用程 序的環境

環境包名安裝路徑文件的路徑資源的路徑資產的路徑 放到緩存文件夾里面:getCacheDir(); ->getAssest();

->getResource(); ->getFilesDir();/data/data/包名 ->getCacheDir();/data/data/包名/cache->MainActivity.javapackagecom.example.login;importjava.util.Map;importandroid.app.Activity;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.widget.CheckBox;importandroid.widget.EditText;importandroid.widget.Toast;importcom.example.login.service.LoginService;publicclassMainActivityextendsActivity{ privateEditTextet_number; privateEditTextet_passwd; privateCheckBoxcb_remPass; protectedvoidonCreate(BundlesavedInstanceState){ 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); Mapmap=LoginService.getSavaUserInfo(this); if(map!=null){ et_number.setText((CharSequence)map.get("username")); et_passwd.setText((CharSequence)map.get("passwd")); } } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } publicvoidlogin(Viewv){ Stringnumber=et_number.getText().toString().trim(); Stringpasswd=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()){ //如果選擇了保存用戶密碼,那么就保存用戶密碼 booleanresults=LoginService.saveuserInfo(this,number,passwd); if(results){ Toast.makeText(this,"保存用戶信息成功",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"保存用戶信息失敗",Toast.LENGTH_SHORT).show(); } } //登陸發送消息到服務器,服務器驗證是否正確 if("zhangsan".equals(number)&&"123456".equals(passwd)){ Toast.makeText(this,"登陸成功",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this,"登錄失敗,用戶名或者密碼不正確",Toast.LENGTH_LONG).show(); } } }}->LoginService.javapackagecom.example.login.service;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.Map;importandroid.content.Context;/**保存用戶名密碼的的業務方法*/publicclassLoginService{ publicstaticbooleansaveuserInfo(Contextcontext,StringuserName,StringpassWord){//沒有使用任何類的方法,推薦使用靜態方法 //Filefile=newFile("/data/data/com.example.login/info.txt"); Filefile=newFile(context.getFilesDir(),"info.txt"); try{ FileOutputStreamfos=newFileOutputStream(file); fos.write((userName+"##"+passWord).getBytes()); fos.close(); returntrue; }catch(FileNotFoundExceptione){ //TODO自動生成的catch塊 e.printStackTrace(); returnfalse; }catch(IOExceptione){ //TODO自動生成的catch塊 e.printStackTrace(); returnfalse; } } /* *獲取保存到的數據 */ publicstaticMap<String,String>getSavaUserInfo(Contextcontext){ Filefile=newFile(context.getFilesDir(),"info.txt"); Map<String,String>map=newHashMap<String,String>();; try{ FileInputStreamfis=newFileInputStream(file); BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(fis)); Stringstr=bufferedReader.readLine(); String[]infos=str.split("##"); map.put("username",infos[0]); map.put("passwd",infos[1]); }catch(FileNotFoundExceptione){ //TODO自動生成的catch塊 e.printStackTrace(); returnnull; }catch(IOExceptione){ //TODO自動生成的catch塊 e.printStackTrace(); returnnull; } returnmap; }}->activity_main.xml<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/please_input_userName"/> <EditTextandroid:id="@+id/et_number"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="number"/> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/please_input_passwd"/> <EditTextandroid:id="@+id/et_passwd"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="textPassword"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button 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" /> <CheckBox 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"/> </RelativeLayout> </LinearLayout>25、android下文件訪問的權限->private、readable、writeable、public26、保存文件到SD卡中->存儲空間: ->手機的內部存儲空間:小硬盤/data/data ->外部存儲空間:SD卡路徑/mnt/sdcard可以簡寫成/sdcard/ 需要權限WRITE_EXTER_STORAGE 操作SD卡必須要權限->保存數據到SD卡只需要把路徑改為SD卡,讀不需要權限,否則需要權限 在4.0以前的版本讀SD卡不需要權限,但是在4.0以后讀寫SD卡可以設置SD卡保護,讀就需要權限READ_EXTER_STORAGE->判斷是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());->為了保證程序的兼容性,有些SD卡可能路徑會改變,因此系統提供了獲取SD卡的路徑的方法Environment.getExternalStorageDirectory()27、分析setting源代碼獲取SD卡大小->source的源代碼是SDK的源代碼,是jar里面的源代碼->導入通用的文件項目eclipse要求必須要有setting文件->ctrl+h搜索文件夾packagecom.example.sdsize;importjava.io.File;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.StatFs;importandroid.text.format.Formatter;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;publicclassMainActivityextendsActivity{ privateTextViewtv_SDsize; protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Buttonbutton=(Button)findViewById(R.id.bt_find); tv_SDsize=(TextView)findViewById(R.id.tv_SDSize); button.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewarg0){ //TODO自動生成的方法存根 StringBuildermemorySizeInfo=newStringBuilder(); if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ memorySizeInfo.append(getExternalSize()); }else{ Toast.makeText(MainActivity.this,"無內存卡",Toast.LENGTH_SHORT).show(); } memorySizeInfo.append(getRomSpaceInfo()); tv_SDsize.setText(memorySizeInfo.toString()); } }); } /* *獲取SD卡的存儲信息 */ publicStringgetExternalSize(){ Filepath=Environment.getExternalStorageDirectory(); StatFsstat=newStatFs(path.getPath()); longblockSize=stat.getBlockSize(); longtotalBlocks=stat.getBlockCount(); longavailableBlocks=stat.getAvailableBlocks(); longtotalSize=blockSize*totalBlocks; longavailSize=blockSize*availableBlocks; StringtotalStr=Formatter.formatFileSize(this,totalSize); StringavailStr=Formatter.formatFileSize(this,availSize); StringExternalSize="SD總存儲空間:"+totalStr+"可使用的空間:"+availStr; returnExternalSize; } /* *獲取可用的內部存儲 */ publicStringgetRomSpaceInfo(){ Filepath=Environment.getDataDirectory(); StatFsstat=newStatFs(path.getPath()); longinternalblockSize=stat.getBlockSize(); longinternalblockcounts=stat.getBlockCount(); longinternaltotalSize=internalblockSize*internalblockcounts; StringtotalStr=Formatter.formatFileSize(this,internaltotalSize); StringRomSpaceInfo="可用的內存"+totalStr; returnRomSpaceInfo; } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; }}28、sharedPreferences入門->數據存儲的API:用##分割用戶名和密碼的缺陷,真實存 儲的話必須要把##轉移成其他字符,sharePreferences (共享參數)提供了一種方便存儲數據的方式。->在data目錄下創建了一個xml文件,根節點是map,其實是以map集合來存 儲的用戶名和密碼的 對特殊字符進行了轉義packageloginsharedPreference.service;importandroid.content.Context;importandroid.content.SharedPreferences;importandroid.content.SharedPreferences.Editor;/**保存用戶名密碼的的業務方法*/publicclassLoginService{ publicstaticvoidSavaUserInfo(Contextcontext,Stringusername,Stringpasswd){ //拿到上下文之后,有個方法叫getSharedPreferences SharedPreferencessharedPreferences=context.getSharedPreferences("config",Context.MODE_PRIVATE); Editoreditor=sharedPreferences.edit();//得到sharedPreferences的編輯器 editor.putString("username",username); editor.putString("passwd",passwd); //類似于數據庫的事物 mit(); //當前方法不會存在異常,所以設置為void }}packageloginsharedPreference;importjava.util.Map;importloginsharedPreference.service.LoginService;importandroid.app.Activity;importandroid.content.SharedPreferences;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importandroid.view.View;importandroid.widget.CheckBox;importandroid.widget.EditText;importandroid.widget.Toast;importcom.example.login.R;publicclassMainActivityextendsActivity{ privateEditTextet_number; privateEditTextet_passwd; privateCheckBoxcb_remPass; protectedvoidonCreate(BundlesavedInstanceState){ 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); SharedPreferencessharedPreferences=getSharedPreferences("config",MODE_PRIVATE); Stringusername=sharedPreferences.getString("username",""); Stringpasswd=sharedPreferences.getString("passwd",""); et_number.setText(username); et_passwd.setText(passwd); } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論