android面試題總結加強再加強版(二)

http://blog.csdn.net/superjunjin/article/details/7855995

16.Android常用控件的信息

單選框(RadioButtonRadioGroup)

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

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


多選框(CheckBox):

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

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


下拉列表框(Spinner)

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

事件:setOnItemSelectedListener(),處理下拉列表框被選擇事件把Spinner.OnItemSelectedListener()實例作爲參數傳入。


拖動條(SeekBar)

SeekBar.getProgress()獲取拖動條當前值

事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener實例作爲參數傳入。


菜單(Menu):

重寫ActivityonCreatOptionMenu(Menu menu)方法,該方法用於創建選項菜單,當用戶按下手機的"Menu"按鈕時就會顯示創建好的菜單,在onCreatOptionMenu(Menu Menu)方法內部可以調用Menu.add()方法實現菜單的添加。

重寫ActivityonMenuItemSelected()方法,該方法用於處理菜單被選擇事件。


進度對話框(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" 該元素在 idaaa的下面    

    android:layout_toLeftOf="@id/bbb" 該元素在 idbbb的左邊     

     相對於父元素的地方    

     android:layout_alignParentLeft="true"  與父元素左對齊    

     android:layout_alignParentRight="true" 與父元素右對齊    

     還可以指定邊距等,具體詳見API        

5.TableLayout    

     表格佈局類似Html裏面的Table。每一個TableLayout裏面有表格行TableRowTableRow裏面可以具體定義每一個元素,設定他的對齊方式 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()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用

[java] view plaincopy
  1. 採用Context. bindService()方法啓動服務的代碼如下:  
  2. public class HelloActivity extends Activity {  
  3.      ServiceConnection conn = new ServiceConnection() {  
  4.               public void onServiceConnected(ComponentName name, IBinder service) {  
  5.            }  
  6.            public void onServiceDisconnected(ComponentName name) {  
  7.            }  
  8.      };  
  9.     @Override   
  10. public void onCreate(Bundle savedInstanceState) {   
  11.         Button button =(Button) this.findViewById(R.id.button);  
  12.         button.setOnClickListener(new View.OnClickListener(){  
  13.                public void onClick(View v) {  
  14.                   Intent intent = new Intent(HelloActivity.this, SMSService.class);  
  15.                   bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  16.                   //unbindService(conn);//解除綁定  
  17.        }});         
  18.     }  
  19. }  

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 spdp 也就是dip。這個和sp 基本類似。如果設置表示長度、高度等屬性時可以使用dp sp。但如果設置字體,需要使用spdp 是與密度無關,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. 4activity的啓動模式

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

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

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

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

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


ANRApplication 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): 

[java] view plaincopy
  1. public TestB extents Activity  
  2. {  
  3.  .........  
  4. };  
  5.  public class Test extends Activity  
  6. {  
  7.      ......  
  8.      public void switchActivity()  
  9.      {  
  10.             Intent i = new Intent(Test.this, TestB.class);  
  11.             this.startActivity(i);  
  12.      }  
  13. }  


代碼簡潔明瞭,執行了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裏,傳給電子郵件發送組件。
發佈了0 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章