繼續上一篇文章整理有關Android的基礎知識,爲面試作準備的能夠看看哪些知識是遺漏了。資料都是網上整理來,糾正了一些錯誤,有部分解析加入我的理解!感謝分享相關知識的開發者。這些知識日常開發的過程當中都常用到,溫故而知新~ android
單選框(RadioButton與RadioGroup) 面試
RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。 數據庫
事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener實例做爲參數傳入。 windows
多選框(CheckBox) 設計模式
每一個多選框都是獨立的,能夠經過迭代全部的多選框,而後根據其狀態是否被選中在獲取其值。 緩存
事件:setOnCheckedChangeListener(),處理多選框被選擇事件。把CheckBox.OnCheckedChangeListener()實例做爲參數傳入。 網絡
下拉列表框(Spinner) 多線程
Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉列表框的值。 app
事件:setOnItemSelectedListener(),處理下拉列表框被選擇事件把Spinner.OnItemSelectedListener()實例做爲參數傳入。 框架
拖動條(SeekBar)
SeekBar.getProgress()獲取拖動條當前值
事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener實例做爲參數傳入。
菜單(Menu)
重寫Activity的onCreatOptionMenu(Menu menu)方法,該方法用於建立選項菜單,當用戶按下手機的"Menu"按鈕時就會顯示建立好的菜單,在onCreatOptionMenu(Menu Menu)方法內部能夠調用Menu.add()方法實現菜單的添加。
重寫Activity的onMenuItemSelected()方法,該方法用於處理菜單被選擇事件。
進度對話框(ProgressDialog)
建立並顯示一個進度對話框:ProgressDialog.show(ProgressDialogActivity.this,"請稍等","數據正在加載中....",true);
設置對話框的風格:setProgressStyle()
ProgressDialog.STYLE_SPINNER 旋轉進度條風格(爲默認風格)
ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格
下面是各類經常使用控件的事件監聽的使用
①EditText(編輯框)的事件監聽---OnKeyListener
②RadioGroup、RadioButton(單選按鈕)的事件監聽---OnCheckedChangeListener
③CheckBox(多選按鈕)的事件監聽---OnCheckedChangeListener
④Spinner(下拉列表)的事件監聽---OnItemSelectedListener
⑤Menu(菜單)的事件處理---onMenuItemSelected
⑥Dialog(對話框)的事件監聽---DialogInterface.OnClickListener()
http://www.iteye.com/topic/1060815
Android佈局是應用界面開發的重要一環,在Android中,共有五種佈局方式,分別是:FrameLayout(幀佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。
1.FrameLayout
這個佈局能夠當作是牆腳堆東西,有一個四方的矩形的左上角牆腳,咱們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個佈局比較簡單,也只能放一點比較簡單的東西。
2.LinearLayout
線性佈局,這個東西,從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每個LinearLayout裏面又可分爲垂直佈局 (android:orientation="vertical")和水平佈局(android:orientation="horizontal" )。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。
LinearLayout中有一個重要的屬性 android:layout_weight="1",設置weight的時候,會根據設置weight的值,分配剩餘的空間用於拉伸空間,把父控件的位置所有佔用。
3.AbsoluteLayout
絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x="20px" android:layout_y="12px" 這種佈局方式也比較簡單,可是在垂直隨便切換時,每每會出問題,並且多個元素的時候,計算比較麻煩。
4.RelativeLayout
相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:
相對於某一個元素
android:layout_below="@id/aaa" 該元素在 id爲aaa的下面
android:layout_toLeftOf="@id/bbb" 該元素在 id爲bbb的左邊
相對於父元素的地方
android:layout_alignParentLeft="true" 與父元素左對齊
android:layout_alignParentRight="true" 與父元素右對齊
還能夠指定邊距等,具體詳見API
5.TableLayout
表格佈局相似Html裏面的Table。每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity="" 。
每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。
Android中的服務和windows中的服務是相似的東西,服務通常沒有用戶操做界面,它運行於系統中不容易被用戶發覺,可使用它開發如監控之類的程序。服務的開發比較簡單,以下:
//第一步:繼承Service類 public class SMSService extends Service { } //第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置: <service android:name=".SMSService" />
服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可以啓動Service,可是它們的使用場合有所不一樣。使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了,服務仍然運行。使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。
若是打算採用Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
若是打算採用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。若是調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。若是調用者但願與正在綁定的服務解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。
服務經常使用生命週期回調方法以下:
onCreate() 該方法在服務被建立時調用,該方法只會被調用一次,不管調用多少次startService()或bindService()方法,服務也只被建立一次。
onDestroy()該方法在服務被終止時調用。
與採用Context.startService()方法啓動服務有關的生命週期方法
onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。屢次調用startService()方法儘管不會屢次建立服務,但onStart() 方法會被屢次調用。
與採用Context.bindService()方法啓動服務有關的生命週期方法
onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法onBind()被屢次調用。
onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用
//採用Context. bindService()方法啓動服務的代碼以下: public class HelloActivity extends Activity { ServiceConnection conn = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { } public void onServiceDisconnected(ComponentName name) { } }; @Override public void onCreate(Bundle savedInstanceState) { Button button =(Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(HelloActivity.this, SMSService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); //unbindService(conn);//解除綁定 }}); } }
Android 框架魅力的源泉在於IoC,在開發Android 的過程當中你會時刻感覺到IoC 帶來的巨大方便,就拿Activity 來講,下面的函數是框架調用自動調用的:
不是程序編寫者主動去調用,反而是用戶寫的代碼被框架調用,這也就反轉了!固然IoC 自己的內涵遠遠不止這些,可是從這個例子中也能夠窺視出IoC帶來的巨大好處。此類的例子在Android 隨處可見,例如說數據庫的管理類,例如說Android 中SAX 的Handler 的調用等。有時候,您甚至須要本身編寫簡單的IoC 實現,上面展現的多線程如今就是一個說明。
如今這裏介紹一下dp 和sp。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:表示屏幕實際的象素。例如,320*480 的屏幕在橫向有320個象素,在縱向有480 個象素。
in:表示英寸,是屏幕的物理尺寸。每英寸等於2.54 釐米。例如,形容手機屏幕大小,常常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這些尺寸是屏幕的對角線長度。若是手機的屏幕是3.2 英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 = 8.128 釐米。讀者能夠去量一量本身的手機屏幕,看和實際的尺寸是否一致。
standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。
singleTop: 若是已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。若是不位於棧頂,會產生一個新的實例。
singleTask: 會在一個新的task中產生這個實例,之後每次調用都會使用這個,不會去產生新的實例了。
singleInstance: 這個跟singleTask基本上是同樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其餘的實例。
ANR:Application Not Responding。
在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android就會顯示ANR對話框了:
Android應用程序徹底運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,須要消耗大量時間的操做都會引起ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。
避免方法:
Activity應該在它的關鍵生命週期方法(如 onCreate()和onResume())裏儘量少的去作建立操做,潛在的耗時操做。例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程。
在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通信中,由Intent協助完成。正如網上一些人解析所說,Intent負責對應用中一次操做的動做、動做涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent在這裏起着實現調用者與被調用者之間的解耦做用。
Intent傳遞過程當中,要找到目標消費者(另外一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:
1,顯示匹配(Explicit):