Android 面試知識集2

繼續上一篇文章整理有關Android的基礎知識,爲面試作準備的能夠看看哪些知識是遺漏了。資料都是網上整理來,糾正了一些錯誤,有部分解析加入我的理解!感謝分享相關知識的開發者。這些知識日常開發的過程當中都常用到,溫故而知新~ android

 

16.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

 

17.請介紹下Android中經常使用的五種佈局

  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="" 。    

     每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。

 

18.如何啓用Service,如何停用Service 

  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);//解除綁定  }}); } }

複製代碼

 

19.ListView的優化方案

1,若是自定義適配器。那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中,儘量少建立view。
2,給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果
3,若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候,再去加載接下來的20條。
 

20廣播接收者生命週期

複製代碼

//廣播接收器只有一個回調方法: void onReceive(Context curContext, Intent broadcastMsg)

複製代碼
  當廣播消息抵達接收器時,Android調用它的onReceive()方法並將包含消息的Intent對象傳遞給它。廣播接收器僅在它執行這個方法時處於活躍狀態。當onReceive()返回後,它即爲失活狀態。
擁有一個活躍狀態的廣播接收器的進程被保護起來而不會被殺死。但僅擁有失活狀態組件的進程則會在其它進程須要它所佔有的內存的時候隨時被殺掉。
  這種方式引出了一個問題:若是響應一個廣播信息須要很長的一段時間,咱們通常會將其歸入一個衍生的線程中去完成,而不是在主線程內完成它,從而保證用戶交互過程的流暢。若是onReceive()衍生了一個線程而且返回,則包涵新線程在內的整個進程都被會判爲失活狀態(除非進程內的其它應用程序組件仍處於活躍狀態),因而它就有可能被殺掉。這個問題的解決方法是令onReceive()啓動一個新服務,並用其完成任務,因而系統就會知道進程中仍然在處理着工做。
 

21.設計模式和IoC(Inversion of Control 控制反轉)

  Android 框架魅力的源泉在於IoC,在開發Android 的過程當中你會時刻感覺到IoC 帶來的巨大方便,就拿Activity 來講,下面的函數是框架調用自動調用的:

複製代碼

protected void onCreate(Bundle savedInstanceState)

複製代碼

  不是程序編寫者主動去調用,反而是用戶寫的代碼被框架調用,這也就反轉了!固然IoC 自己的內涵遠遠不止這些,可是從這個例子中也能夠窺視出IoC帶來的巨大好處。此類的例子在Android 隨處可見,例如說數據庫的管理類,例如說Android 中SAX 的Handler 的調用等。有時候,您甚至須要本身編寫簡單的IoC 實現,上面展現的多線程如今就是一個說明。

 

22.Android中的長度單位詳解

  如今這裏介紹一下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 釐米。讀者能夠去量一量本身的手機屏幕,看和實際的尺寸是否一致。  

 

23. 4種activity的啓動模式

standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。 

singleTop: 若是已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。若是不位於棧頂,會產生一個新的實例。 

singleTask: 會在一個新的task中產生這個實例,之後每次調用都會使用這個,不會去產生新的實例了。 

singleInstance: 這個跟singleTask基本上是同樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其餘的實例。

 

24.什麼是ANR 如何避免它?

ANR:Application Not Responding。

  在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android就會顯示ANR對話框了: 

  • 用戶對應用程序的操做(如輸入事件,按鍵、觸摸屏事件)在5秒內無響應
  • 廣播接受器(BroadcastReceiver)在10秒內仍未執行完畢 

  Android應用程序徹底運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,須要消耗大量時間的操做都會引起ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 

避免方法:

  Activity應該在它的關鍵生命週期方法(如 onCreate()和onResume())裏儘量少的去作建立操做,潛在的耗時操做。例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程。

 

25.Android Intent的使用

  在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通信中,由Intent協助完成。正如網上一些人解析所說,Intent負責對應用中一次操做的動做、動做涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent在這裏起着實現調用者與被調用者之間的解耦做用。

  Intent傳遞過程當中,要找到目標消費者(另外一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:
1,顯示匹配(Explicit): 

複製代碼

public TestB extents Activity { ......... }; public class Test extends Activity { ...... public void switchActivity() { Intent i = new Intent(Test.this, TestB.class); this.startActivity(i); } }

複製代碼

代碼簡潔明瞭,執行了switchActivity()函數,就會立刻跳轉到名爲TestB的Activity中。 

2,隱式匹配(Implicit):
   
  隱式匹配,首先要匹配Intent的幾項值:Action, Category, Data/Type,Component 若是填寫了Componet就是上例中的Test.class)這就造成了顯示匹配。因此此部分只講前幾種匹配。匹配規則爲最大匹配規則,

  1,若是你填寫了Action,若是有一個程序的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,若是這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。可是若是手機中有兩個以上的程序匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有不少預約義,若是你想直接轉到你本身定義的Intent接收者,你能夠在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值爲"android.intent.category.DEFAULT"),在你的Intent中設定該值爲Intent的Action,就直接能跳轉到你本身的Intent接收者中。由於這個Action在系統中是惟一的。
  2,data/type,你能夠用Uri來作爲data,好比Uri uri = Uri.parse(http://www.google.com ); Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程當中,會根據http://www.google.com 的scheme判斷出數據類型type 手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能處理http:的type。

  3,至於分類Category,通常不要去在Intent中設置它,若是你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣全部不設置Category(Intent.addCategory(String c);)的Intent都會與這個Category匹配。

  4,extras(附加信息),是其它全部附加信息的集合。使用extras能夠爲組件提供擴展信息,好比,若是要執行「發送電子郵件」這個動做,能夠將電子郵件的標題、正文等保存在extras裏,傳給電子郵件發送組件。
 
 
上面是有關Android的相關知識,如發現哪裏寫錯了請留言指出。
相關文章
相關標籤/搜索