佳都新太Android筆試題
1. 請描述下Activity的生命週期
答:創建 onCreate - 啓動onStart – 開始 onResume – 暫停 onPause – 結束 onStop – 銷燬onDestroy
2. 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
答:onSaveInstanceState()
當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onRestart()->onStart()->onResume(),跳過onCreate()了。
3. 如何將一個Activity設置成窗口的樣式。
答:兩種方法:
l 在AndroidManifest.xml設置當前Activity的一個主題屬性
android :theme="@android:style/Theme.Dialog"
或者android:theme="@android:style/Theme.Translucent"
l 通過修改Theme.Dialog主題的android:windowBackground屬性值可以改變Activity的背景圖像
style.xml下增加以下內容
<style name= “MyTheme” parent= “@android:style/Theme.Dialog>
<item name= “android:windowBackground”>@drawable/msg_background</item>
</style>
在manifest.xml中直接指定Activity的theme就行了
<activity android:name= “.MainActivity” android:label= “@string/app_name” android:theme= “@style/MyTheme”>
<intent-filter>
<action android:name= “android.intent.action.MAIN”/>
<category android:name= “android.intent.category.LAUNCHER”/>
</intent-filter>
</activity>
4. 按下返回鍵與Home鍵的區別。
答:back鍵默認行爲是finish處於前臺的Activity的,即Activity的狀態爲Destroy狀態爲止,再次啓動該Activity是從onCreate開始的(不會調用onSaveInstanceState()方法)。Home鍵默認是stop前臺的Activity即狀態爲onStop爲止,而不是Destroy,若再次啓動它,會調用onSaveInstanceState() 方法,保持上次Activity的狀態則是從OnRestart開始的---->onStart()--->onResume()。
5. 請介紹下Android中常用的幾種佈局。
答:
1、 LinearLayout – 線性佈局。
orientation – 容器內元素的排列方式。vertical: 子元素們垂直排列;horizontal: 子元素們水平排列
gravity – 內容的排列形式。常用的有 top, bottom, left, right, center 等
2、 AbsoluteLayout – 絕對佈局。
layout_x – x 座標。以左上角爲頂點
layout_y – y 座標。以左上角爲頂點
3、 TableLayout – 表格式佈局
表格佈局主要以行列的形式來管理子控件,其中每一行即一個TableRow對象,每個TableRow對象可以添加子控件,並且每加入一個空間即相當於添加了一列
4、 RelativeLayout – 相對佈局。
layout_centerInParent – 將當前元素放置到其容器內的水平方向和垂直方向的中央位置(類似的屬性有:layout_centerHorizontal, layout_alignParentLeft 等)
layout_marginLeft – 設置當前元素相對於其容器的左側邊緣的距離
layout_below – 放置當前元素到指定的元素的下面
layout_alignRight – 當前元素與指定的元素右對齊
5、 FrameLayout – 層疊佈局。以左上角爲起點,將 FrameLayout 內的元素一層覆蓋一層地顯示,在幀佈局中,先添加的圖片會被後添加的圖片覆蓋。
6. 請介紹下Android的數據存儲方式,以及優缺點。
Ø SharedPreferences方式
用來存儲”key-value paires”格式的數據,它是一個輕量級的鍵值存儲機制,只可以存儲基本數據類型,可以通過它保存一些上次用戶所做的修改操作
Ø 文件存儲方式
它通過FileInputStream和FileOutputStream對文件進行操作。但是在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件,如果要共享數據就用Content Providers
Ø SQLite數據庫方式
Android提供的一個標準的數據庫,支持SQL語句
Ø 內容提供器(Content provider)方式
是所有應用程序之間數據存儲和檢索的橋樑,它的作用是使得各個應用程序之間實現數據共享
Ø 網絡存儲方式
通過網絡來存儲和獲取數據
7. 請介紹下ContentProvider是如何實現數據共享的。
答:一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限。
8. 如何啓用Service,如何停用Service.
答:
1.第一種是通過調用Context.startService()啓動,調用Context.stopService()結束,startService()可以傳遞參數給Service
2.第二種方式是通過調用Context.bindService()啓動,調用Context.unbindservice()結束,還可以通過ServiceConnection訪問Service。
在Service每一次的開啓關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。
9. 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。
答:註冊廣播有兩種方式:
1、在應用程序的代碼中註冊
註冊BroadcastReceiver:
registerReceiver(receiver,filter);
取消註冊BroadcastReceiver:
unregisterReceiver(receiver);
當BroadcastReceiver更新UI,通常會使用這樣的方法註冊。啓動Activity時候註冊BroadcastReceiver,Activity不可見時候,取消註冊。
2、在androidmanifest.xml當中註冊
<receiver>
<intent-filter>
<action android:name ="android.intent.action.PICK"/>
</intent-filter>
</receiver>
使用這樣的方法註冊弊端:它會始終處於活動狀態,畢竟是手機開發,cpu和電源資源比較少,一直處於活動耗費大,不利。
引入廣播機制的用意:
a:引入廣播機制可以方便幾大組件的信息和數據交互。
b:程序間互通消息(例如在自己的應用程序內監聽系統來電)
c:效率上(參考UDP的廣播協議在局域網的方便性) d:設計模式上(反轉控制的一種應用,類似監聽者模式
10. Android如何進行進程間通信,怎麼實現?
答:Android提供了AIDL來實現進程間通信(IPC),AIDL全稱爲Android Interface Definition Language。
簡歷裏AIDL服務的具體步驟如下:
1. 在Eclipse Android工程中的Java源文件目錄中建立一個擴展名爲aidl的文件。該文件的語法類似於Java代碼,但會稍有不同。
2. 如果aidl文件的內容正確的話,ADT會自動生成一個Java接口文件(*.java).
3. 建立一個服務類(Service的子類)
4. 實現由aidl文件生成的Java接口。
5. 在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標籤中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類構造方法的參數值。
11. Android提供給第三方調用的方式有哪幾種,優缺點分別是什麼?
答:第三方調用的方式?不理解是什麼!
12. 什麼是ANR,如何避免ANR?
答:
ANR:Application Not Responding,五秒在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列情況時,Android就會顯示ANR對話框了:
對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒
意向接受器(intentReceiver)超過10秒鐘仍未執行完畢
Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。因爲此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。
因此,任何運行在主線程中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操作,如訪問網絡和數據庫;或者是開銷很大的計算,比如改變位圖的大小,需要在一個單獨的子線程中完成 (或者是使用異步請求,如數據庫操作)。但這並不意味着你的主線程需要進入阻塞狀態已等待子線程結束 — 也不需要調用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程爲子線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應用程序,能夠保證你的程序對輸入保持良好的響應,從而避免因爲輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐需要應用到所有顯示用戶界面的線程,因爲他們都面臨着同樣的超時問題。
13. 如果實現一個web app來調用本地的通訊錄功能?
答: 沒有使用web app來調用本地的通訊錄功能,不知道如何解答。