Android 面試知識集2


  繼續上一篇文章整理有關Android的基礎知識,為面試做准備的可以看看哪些知識是遺漏了。資料都是網上整理來,糾正了一些錯誤,有部分解析加入個人理解!感謝分享相關知識的開發者。這些知識平常開發的過程中都經常使用到,溫故而知新~

 

16.Android常用控件的信息

單選框(RadioButton與RadioGroup)

RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。

事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener實例作為參數傳入。

多選框(CheckBox)

每個多選框都是獨立的,可以通過迭代所有的多選框,然后根據其狀態是否被選中在獲取其值。

事件:setOnCheckedChangeListener(),處理多選框被選擇事件。把CheckBox.OnCheckedChangeListener()實例作為參數傳入。

下拉列表框(Spinner)

Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉列表框的值。

事件: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的相關知識,如發現哪里寫錯了請留言指出。
 

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3213369.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM