Android面試題積累三

1.什麼是ANR,如何避免它?

ANR:Application Not Responding

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

對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒;意向接收器(IntentReceiver)超過10秒仍未執行完畢。

Android應用程序完全運行在一個獨立的線程中。這就意味着,任何在主線程中運行的,需要消耗大量事件的操作都會引發ANR。

因此,任何運行在主線程中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法,如onCreate()和onResume()。潛在的比較耗時的操作,如訪問網絡和數據庫,或者是開銷很大的計算,比如改變位圖的大小,需要在一個單獨的工作線程中完成(或者是使用異步請求,如數據庫操作)。但這並不意味着你的主線程需要進入阻塞狀態已等待子線程結束。取而代之的是,主線程爲工作線程提供了一個句柄(Handler),讓子線程在即將結束的時候調用它。使用這種方法設計你的應用程序,能夠保證你的程序對輸入保持良好的響應,從而避免因爲輸入時間超過5秒鐘不被處理而產生ANR。這種實踐需要應用到所有顯示用戶界面的線程,因爲他們都面臨着同樣的超時問題。

2.橫豎屏切換時候activity的生命週期

不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次(但是親自試驗只有一次。。。還求大神解答)

設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個聲明週期,切橫,豎屏時只會執行一次。

設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個聲明週期,只會執行onConfigurationChanged方法。

3.AsyncTask使用在哪些場景?它的缺陷是什麼?如何解決?

AsyncTask<String, Integer, Bitmap>

第一個泛型決定了execute方法和doInBackground方法的參數

第二個泛型決定了onProgressUpdate方法的參數

第三個泛型決定了doInBackground方法的返回值

AsyncTask運行的場景就是我們需要進行一些耗時的操作,耗時操作完成後更新主線程,或者在操作過程中對主線程的UI進行更新。

缺陷:AsyncTask維護着一個長度爲128的線程池,同時可以執行5個工作線程,還有一個緩衝隊列,當線程池中已有128個線程,緩衝隊列已滿時,如果此時向線程提交任務,將會拋出RejectedExecutionException.

解決:由一個控制線程來處理AsyncTask的調用判斷線程池是否滿了,如果滿了則線程睡眠,否則請求AsyncTask繼續處理。

4.Intent詳解

四大組件:Activity,Service,Content Provider,BroadcastReceiver

Intent就是連接四大組件的橋樑。

Intent不僅可以用於應用程序之間,也可以用於應用程序內部的activity,service,BroadcastReceiver之間的交互。

向Activity,Service,BroadcastReceiver發送intent有什麼不同的機制:

A.使用Context.startActivity()或Activity.startActivityForResult(),傳入一個intent來啓動一個activity。使用Activity.setResult(),傳入一個intent來從activity中返回結果。

B.將intent對象傳給Context.startService()來啓動一個service或者傳消息給一個運行的service。將intent對象傳給Context.bindService來綁定一個Service

C.將intent對象傳給Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則他們被傳給BroadcastReceiver。

 

Intent的相關屬性:

component(組件):目的組件

action(動作):用來表現意圖的行動

category(類別):用來表現動作的類別

data(數據):表示動作要操作的數據

type(數據類型):對於data範例的描寫

extras(擴展信息):擴展信息

5.如何退出Activity

A.拋異常強制退出:該方法通過拋出異常,使程序Force Close。驗證可以,但是,需要解決的問題時,如何使程序結束掉,而不彈出Force Close窗口。

B.記錄打開的Activity:每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。

C.發送特定廣播:在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後,關閉即可。

D.遞歸退出,在打開新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞歸關閉。除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。但是這樣做同樣不完美。你會發現,如果自己的應用程序對每一個Activity都設置了nonsensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,我們的目的達到了,沒有影響到用戶使用。爲了編程方便,最好定義一個Activity基類,處理這些共通問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章