安卓之前學過一些,現在想要重新的系統學習一下。這幾天開始看《第一行代碼》,并詳細地敲了敲里面的相關代碼。已經看了前三章的內容,下面就對前三章的知識點進行一下梳理,使自己更加熟悉這些知識點,增強對其的掌握。
第一章
第一章對Android各個方面做了簡單的介紹。首先是安卓的系統架構。四層架構:linux內核層,為Android設備的個各種硬件提供了底層驅動;系統運行庫層,通過一些C/C++庫來為Android系統提供了主要的特性支持,在這一層的還有Android運行時庫,允許開發者用java語言編寫Android應用;應用框架層, 提供構建應用程序的各種API;應用層,手機上的應用程序。
并介紹了Android的四大組件:活動(Activity),服務(Service),廣播接收器(Broadcast Receiver)和內容提供器(Content PRovider)。
也傳授了我們如何搭建開發環境,Android SDK是Android開發工具包;ADT,即Android Development Tools,是高度集成的Android開發環境。
以及日志工具Log的使用,例如,Log.d方法有兩個參數,第一個參數是tag,用于對打印信息進行過濾,第二個參數是msg,即想要打印的具體內容。簡單介紹了過濾器,我們可以自己添加過濾器方便我們進行日志查看。LogCat的日志級別控制從低到高分別是verbose,debug,info,warn,error。
第二章
第二章對活動進行了詳細的介紹。活動(Activity)是一種包含用戶界面的組件,主要用于和用戶進行交互。
布局中一些元素的屬性:android:id 是給元素定義唯一標識符;android:layout_width指定當前元素的寬度;android:layout_height指定當前元素的高度。高度為wrap_content指高度剛好包含里面的內容,寬度為match_parent指當前元素和父元素一樣寬。
在Activity類的代碼中,setContentView()方法是給當前的活動加載一個布局,傳入的參數為布局文件的id。
所有活動需要在AndroidManifest文件中注冊。
可以用requestWindowFeature(Window.FEATURE_NO_TITLE)來隱藏標題欄,要注意它要在setContentView前執行。
活動中可以使用Toast,可以將短小的信息提示給用戶。例如Toast.makeText(FirstActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show(),通過makeText方法創建一個Toast對象,調用show()將Toast顯示出來。makeTest方法的三個參數分別為Context,即Toast要求的上下文;要顯示的文本內容和Toast的顯示時長。
findViewById()方法可以獲得在布局文件中定義的元素。
關于Menu的使用,先創建menu的xml文件,可以通過重寫onCreateOptionsMenu()方法,getMenuInflater().inflate(R.menu.main,menu) 來創建菜單,通過getMenuInflater()得到MenuInflater對象,再調用它的inflate()方法來給當前活動創建菜單,重寫onOptionsItemSelected()方法可以定義菜單響應事件。
銷毀活動可以Back鍵,或者在代碼中用finish()方法。
之后詳細介紹了使用Intent在活動中不斷地跳轉。Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);上述是一種顯式Intent的跳轉方式,構建出一個Intent,以FirstActivity.this作為啟動活動的上下文, 以SecondActivity.class作為想要啟動的目標活動,再通過startActivity()方法來啟動活動。隱式Intent指不明確指出想要啟動的活動,而是指定一系列更抽象的action和category等信息,由系統進行分析并找出合適的活動啟動。隱式Intent還可以啟動其他程序的活動,可以調用系統的瀏覽器、系統撥號界面等等。也可以利用Intent向下一個活動傳遞數據,通過putExtra()方法將想要傳遞的數據暫存在Intent,在另一個活動中用getStringExtra()等方法取出即可。并且可以通過startActivityForResult()來啟動活動,該方法接受兩個參數,第一個為Intent,第二個參數是請求碼,用于在回調中判斷數據來源,然后通過setResult()方法來向上一個活動返回數據,第一個參數用于向上一個活動返回處理結果,一般使用RESULT_OK和RESULT_CANCELED兩個值,第二個參數是把帶有數據的Intent傳遞回去,之后會調用上一個活動重寫的onActivityResult()方法,第一個參數為請求碼,第二個參數為處理結果,第三個參數為攜帶返回數據的Intent,先判斷數據來源,再判斷處理結果是否成功,再對返回的數據進行相關處理。可以通過重寫onBackPressed()方法來處理按Back鍵返回時要返回數據的情況。
之后介紹了活動的生命周期,Android是使用任務來管理活動的,一個任務即一組放在返回棧(Back Stack)的活動的集合,啟動新活動后新活動入棧頂,銷毀活動時棧頂活動出棧,系統顯示棧頂活動給用戶。活動在其生命周期中可能會有四種狀態:運行狀態,當一個活動位于返回棧棧頂時;暫停狀態,一個活動位于返回棧棧頂但仍然可見時;停止狀態,一個活動不再處于返回棧棧頂且完全不可見時;銷毀狀態,一個活動從返回棧移除后。Activity類定義了七個回調方法:onCreate(),活動第一次被創建時調用;onStart()活動由完全不可見變為可見時調用;onResume(),活動在棧頂準備好和用戶交互時調用;onPause(),系統準備去啟動或者回復另一個活動時調用;onStop(),活動完全不可見時調用;onDestroy(),活動被銷毀前調用;onRestart(),活動由停止狀態變為運行狀態前調用。活動分為三個生存期:完整生存期,onCreate()和onDestroy()之間;可見生存期,onStart()和onStop()之間;前臺生存期,onResume()和onPause()之間。
Activity中提供了onSaveInstanceState()方法,可以用來解決活動被回收時臨時數據得不到保存的問題。會攜帶一個Bundle類型的參數用于保存數據。通過putString()方法保存字符串,putInt()方法保存整型,每個保存方法兩個參數,第一個為鍵,第二個為真正保存的內容。通過在onCreate()方法中取出之前保存的數據。
活動有四種啟動模式,可以通過在AndroidManifest.xml中給<activity>標簽指定android:launchMode屬性來選擇啟動模式。standard是默認的啟動模式,每次啟動都會創建該活動的一個新的實例;singleTop在啟動時若返回棧棧頂已經是該活動,則不會再創建新的實例;singleTask是返回棧中若已經存在該活動的實例,則直接使用該實例,并把在這個活動之上的所有活動統統出棧;singleInstance是為了實現其他程序和我們的程序共享一個活動的實例,用一個單獨的返回棧來管理該活動。
可以通過自己新建BaseActivity,重寫onCreate方法,在其中通過getClass().getSimpleName()的方式打印當前活動類名,再讓所有現在的活動都繼承自BaseActivity,這樣就能通過程序當前界面就判斷出是哪個活動。
可以通過新建一個ActivityCollector類作為活動管理器,用List暫存活動,寫一個addActivity()方法添加活動,removeActivity()方法移除活動,finishAll()方法銷毀List中所有活動,再修改BaseActivity的onDestory()方法,讓其調用removeActivity()方法。這樣就實現了隨時隨地地可以退出程序,在想要退出的地方調用finishAll()方法即可。
可以在活動中添加actionStart()方法來獲得啟動時需要的數據,解決項目開發中的對接問題。
第三章
第三章對UI控件進行了介紹。
TextView使用android:id給控件指定唯一標識符,使用android:layout_width指定控件寬度,android:layout_height指定控件高度,可選值有match_parent、fill_parent和wrap_content,fill_parent和match_parent表示控件大小和父布局一樣,官方推薦用match_parent,wrap_content是控件內容決定當前控件大小,android:text指定TextView顯示的文本內容。TextView文本默認居左上角對齊,可以使用android:gravity來指定文字的對齊方式。通過android:textSize指定文字大小,android:textColor指定文字的顏色。
Button可以在活動中為其的點擊事件增加監聽器,即setOnClickListener,可以采用匿名類以及實現接口兩種方式。
EditText允許用戶在控件里輸入編輯內容,可以用android:hint來指定一段提示性內容,可以用android:maxLines指定EditText的最大行數,當輸入內容超過最大行數時文本會向上滾動,EditText不會繼續拉伸。
ImageView用于在界面上展示圖片,在xml布局文件中通過android:src指定圖片的路徑,也可以在程序中通過代碼動態更改圖片,即imageView.setImageResourse()方法。
ProgressBar用于在界面中顯示進度條。可以通過android:visibility指定控件是否可見,有三個可選值,visible表示可見,默認值即為visible,invisible表示控件不可見但仍然占據原來的位置和大小,gone表示不可見且不占據屏幕任何空間。也可以通過代碼setVisibility()方法來設置控件的可見性。可以用getVisibility()方法來判斷是否可見。通過style="?android:attr/progressBarStyleHorizontal"可以將原來的圓形進度條指定成水平進度條,android:max可以設置進度條的最大值,getProgess()能獲得當前的進度,setProgress()能動態地更改進度。
AlertDialog可以在當前界面彈出一個對話框,置頂于所有界面元素之上,屏蔽掉其他控件的交互能力,一般提示非常重要的內容或者警告信息。通過AlertDialog.Builder創建一個AlertDialog的實例,setTitle()設置標題,setMessage()設置內容,setCancelable()設置可否取消,setPositiveButton()設置確定按鈕的點擊事件,setNegativeButton()設置取消按鈕的點擊事件,用show()顯示出對話框。
ProgressDialog會在對話框顯示一個進度條,一般表示當前操作比較耗時,讓用戶耐心等待。
Android有四種最基本的布局:LinearLayout線性布局,即所有控件在線性方向上依次排列,通過android:orientation屬性指定排列方向,vertical為垂直,horizontal為水平,默認的排列方向為水平。如果排列方向為horizontal,則內部控件的寬度不能指定為match_parent,這樣會將整個水平方向占滿。排列方向為vertical時內部控件不能將高度指定為match_parent。android:layout_gravity用于指定控件在布局的對齊方式,之前的android:gravity是指定文字在控件中的對齊方式。當LinearLayout的排列方向是horizontal時,只有垂直方向上的對齊方式才會生效,同樣的,vertical時只有水平方向上的對齊方式才會生效。android:layout_weight允許我們使用比例的方式指定控件的大小。比如在使用了layout_weight后,規范的寫法是將不起作用的android:layout_width指定為0。
RelativeLayout是相對布局,可以通過android:layout_alignParentLeft、android:layout_alignParentTop、android:layout_alignParentRight、android:layout_alignParentBottom、android:layout_centerInParent來使控件相對于父布局進行定位。可以通過android:layout_above讓一個控件位于另一個控件的上方,一個控件引用另一個控件的id時,該控件需定義在引用控件的后面,android:layout_toLeftOf、android:layout_toRightOf、android:layout_below也是相對于另一個控件的左邊、右邊、下方。android:layout_alignLeft是讓一個控件的左邊緣和另一個控件的左邊緣對齊,layout_alignRight、layout_alignTop、layout_alignBottom分別是右邊緣,上邊緣,下邊緣對齊。
FrameLayout沒有任何定位方式,所有控件都擺放在布局的左上角。
TableLayout是使用表格的方式排列控件,每一個TabliRow就是在表格上添加一行,在TableRow中每添加一個控件就是在該行加了一列,android:layout_span可以指定控件占據的列數。android:stretchColunmns可以指定讓TableLayout的某一列進行拉伸,達到自動適應屏幕寬度的作用,0為第一列,1為第二列,以此類推。
所有控件直接或間接繼承自View,所有布局直接或間接繼承自ViewGroup。View是Android中最基本的UI控件,可以在屏幕上繪制一塊矩形區域,并響應這塊區域的各種事件。
很多個活動需要同一個布局時可以采用引用布局的方式,比如新建一個布局文件title.xml,在其他要引用該布局的布局中用include語句,<include layout = "@layout/title"/>即可引用。
android:layout_margin屬性可以指定控件在上下左右方向偏移的距離。也可以用android:layout_marginTop 或 android:layout_marginLeft單獨指定控件在某個方向上偏移的距離。
可以創建自定義控件來解決控件注冊事件需要重復注冊的問題。比如新建一個TitleLayout繼承自LinearLayout,重寫其帶兩個參數的構造函數TitleLayout(Context context,AtrributeSet attrs),在構造函數中借助LayoutInflater對布局進行動態加載。通過LayoutInflater的from()方法構建出一個LayoutInflater對象,然后調用inflate()方法動態加載一個布局文件,inflate()方法接收兩個參數,第一個參數是要加載的布局文件id,第二個參數是給加載好的布局再添加一個父布局。再在布局文件中添加這個自定義控件即可,添加時要指明控件的完整類名。并在TitleLayout中為控件注冊事件即可。
ListView用于展示大量的數據,允許用戶通過手指上下滑動的方式將屏幕外的數據滾動到屏幕內,同時屏幕上原有的數據則會滾動出屏幕。可以通過ArrayAdapter將適配的數據傳遞給ListView。向ArrayAdapter的構造函數中傳入當前上下文,ListView子布局的id以及適配的數據,再調用ListView的setAdapter()方法即可建立ListView和數據之間的關聯。
可以通過自己定義一個實體類作為ListView適配器的適配類型,再為ListView的子項指定一個自定義的布局。再創建一個自定義的適配器,繼承自ArrayAdapter,重寫父類的構造函數,并重寫getView()方法,這個方法在每個子項被滾動到屏幕內的時候被調用。在getView方法中通過getItem(position)得到當前項的實例,使用LayoutInflater為這個子項加載傳入的布局,并獲得布局中對應控件的實例,進行相應設置即完成了適配器。再在活動中創建該適配器傳遞給ListView即可。這樣做的運行效率比較低,英文getView()方法會每次將布局重新加載一遍,所以可以利用getView()方法中的convertView參數,用于將之前加載好的布局進行緩存,之后可以重用。并可以創建一個內部類ViewHolder來對布局中控件的實例進行緩存,將控件實例保存在ViewHolder中用View的setTag()方法將ViewHolder對象存儲在View中,當convertView不為空時,調用getTag()方法取出,這樣就不用每次都通過findViewById()方法來獲取控件實例了。ListView也可以通過setOnItemClickListener方法來注冊監聽器的點擊事件。
px是像素,即屏幕中顯示的最小元素單元。pt是磅數,用于作為字體的單位。但是手機的分辨率各不相同,就會導致同樣px的控件在不同屏幕上顯示的效果完全不同。所以Android引入了新的單元dp和sp。dp是密度無關像素,也被稱作dip,在不同密度的屏幕中顯示比例保持一致。sp是可伸縮像素,解決文字大小的適配問題。Android中的密度是屏幕每英寸包含的像素數,以dpi為單位,密度值越高屏幕顯示的效果就越精細。在160dpi的屏幕上,1dp為1px,在320dpi的屏幕上,1dp為2px。所以使用dp指定控件的寬和高可以保證控件在不同密度的屏幕中顯示比例保持一致。sp原理和dp一樣。
Nine-Patch圖片是被特殊處理過的png圖片,可以指定圖片在需要拉伸時只拉伸指定區域。
新聞熱點
疑難解答