編輯:高級開發
DVM指dalivk的虛擬機。每一個android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所以說可以認為是同一個概念。
2、sim卡的EF 文件有何作用
sim卡的文件系統有自己規范,主要是為了和手機通訊,sim本 身可以有自己的操作系統,EF就是作存儲並和手機通訊用的
3、嵌入式操作系統內存管理有哪幾種, 各有何特性
頁式,段式,段頁,用到了MMU,虛擬空間等技術
4、 什麼是嵌入式實時操作系統, android 操作系統屬於實時操作系統嗎?
嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。主要用於工業控制、 軍事設備、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於Linux內核的,因此屬於軟實時。
5、一條最長的短信息約占多少byte?
中文70(包括標點),英文160,160個字節。
6、 android中的動畫有哪幾類,它們的特點和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
7、handler機制的原理
andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的Message Queue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而android啟動程序時會替它建立一個Message Queue。
8、說說mvc模式的原理,它在android中的運用
接上頁
MVC(Model_view_contraller)”模型_視圖_控制器”。 MVC應用程序總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要 Controller改變了Models的數據或者屬性,所有依賴的VIEw都會自動更新。類似的,只要Contro
9、Activity的生命周期
和其他手機 平台 的應用 程序 一樣,android的應用程序 的生命周期是被統一掌控 的,也
就是說我們寫的應用程序命運掌握在別人(系統)的手裡,我們不能改變它,只能學習 並
適應它。
簡單地說一下為什麼是這樣:我們手機在運行 一個應用程序的時候,有可能打進來電話
發進來短信 ,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能 ,另
外系統也不允許你占用太多資源 ,至少要保證電話功能吧,所以資源不足的時候也就有可
能被干掉。
言歸正傳,Activity的基本生命周期如下代碼 所示:
Java代碼
1. public
2. class MyActivity extends Activity {
3. protected
4. void onCreate(Bundle savedInstanceState);
5.
6. protected
7. void onStart();
8.
9. protected
10. void onResume();
11.
12. protected
13. void onPause();
14.
15. protected
16. void onStop();
17.
18. protected
19. void onDestroy();
20. }
21.
22. public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
public
class MyActivity extends Activity {
protected
void onCreate(Bundle savedInstanceState);
protected
void onStart();
protected
void onResume();
protected
void onPause();
protected
void onStop();
接上頁
protected
void onDestroy();
}
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
你自己寫的Activity會按需要 重載這些方法,onCreate是免不了的,在一個Activity正常啟動的過程中,他們被調用的順序是 onCreate -> onStart -> onResume, 在Activity被干掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命周期,但是有人問了 ,程序正運行著呢來電話了,這個程序咋辦?中止了呗,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷 這個應用程序的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume 。
詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼:
onCreate: 在這裡創建界面 ,做一些數據 的初始化工作
onStart: 到這一步變成用戶可見不可交互 的
onResume: 變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個
Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互 的,系統會停止動畫 等消耗CPU 的事情
從上文的描述已經知道,應該在這裡保存你的一些數據,因為這個時候
你的程序的優先級降低,有可能被系統收回。在這裡保存的數據,應該在
onResume裡讀出來,注意:這個方法裡做的事情時間要短,因為下一
個activity不會等到這個方法完成才啟動
onstop: 變得不可見 ,被下一個activity覆蓋了
onDestroy: 這是activity被干掉前最後一個被調用方法了,可能是外面類調用finish方
法或者是系統為了節省空間將它暫時性的干掉,可以用isFinishing()來判
斷它,如果你有一個Progress Dialog在線程中轉動,請在onDestroy裡
把他cancel掉,不然等線程結束的時候,調用Dialog的cancel方法會拋
異常的。
onPause,onstop, onDestroy,三種狀態 下 activity都有可能被系統干掉
接上頁
為了保證程序的正確性,你要在onPause()裡寫上持久層操作的代碼,將用戶編輯的內容都保存到存儲介質上(一般都是數據庫 )。實際工作中因為生命周期的變化而帶來的問題也很多,比如你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停還是殺掉還是數據回滾,是吧?因為Activity可能被殺掉,所以線程中使用的變量和一些界面元素就千萬要注意了,一般我都是采用android的消息機制 [Handler,Message]來處理多線程和界面交互的問題。這個我後面會講一些,最近因為這些東西頭已經很大了,等我理清思緒再跟大家分享。 ller改變了View,VIEw會 從潛在的Model中獲取數據來刷新自己。
10、讓Activity變成一個窗口:Activity屬性設定
講點輕松的吧,可能有人希望做出來的應用程序是一個漂浮在手機主界面的東西,那麼很
簡單你只需要設置 一下Activity的主題就可以了在androidManifest.XML 中定義 Activity的
地方一句話:
XML代碼
1. android :theme="@android:style/Theme.Dialog"
2.
3. android:theme="@android:style/Theme.Dialog"
android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
這就使你的應用程序變成對話框的形式彈出來了,或者
XML代碼
1. android:theme="@android:style/Theme.Translucent"
2.
3. android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就變成半透明的,[友情提示-.-]類似的這種activity的屬性可以在android.R.styleable 類的AndroidManifestActivity 方法中看到,androidManifest.XML中所有元素的屬性的介紹都可以參考這個類android.R.styleable
上面說的是屬性名稱,具體有什麼值是在android.R.style中 可以看到,比如這個"@android:style/Theme.Dialog" 就對應於android.R.style.Theme_Dialog ,('_'換成'.' < --注意:這個是文章內容不是笑臉)就可以用在描述文件 中了,找找類定義和描述文件中的對應關系就都明白了。
11、 你後台的Activity被系統回收怎麼辦:onSaveInstanceState
接上頁
當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B
這個時候A會執行
Java代碼
1. public
2. void onSaveInstanceState(Bundle outState) {
3. super.onSaveInstanceState(outState);
4. outState.putLong("id", 1234567890);
5. }
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回
收的A就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上參數
savedInstanceState,沒被收回的就還是onResume就好了。
savedInstanceState是一個Bundle對象,你基本上可以把他理解為系統幫你維護的一個Map對象。在onCreate()裡你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。
Java代碼
1. if(savedInstanceState != null){
2. long id = savedInstanceState.getLong("id");
3. }
if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}
就像官方的Notepad教程 裡的情況,你正在編輯某一個note,突然被中斷,那麼就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不需要保存什麼,比如你的界面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒准你需要記住滾動條的位置...
12、 調用與被調用:我們的通信使者Intent
要說Intent了,Intent就是這個這個意圖 ,應用程序間Intent進行交流,打個電話啦,來個
電話啦都會發Intent, 這個是android架構的松耦合的精髓部分,大大提高了組件的復用性,比如你要在你的應用程序中點擊按鈕,給某人打電話,很簡單啊,看下代碼先:
Java代碼
1. Intent intent = new Intent();
2. intent.setAction(Intent.ACTION_CALL);
3. intent.setData(Uri.parse("tel:" + number));
接上頁
4. startActivity(intent);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。什麼讀聯系人,發短信啊,郵件啊,統統只需要扔出intent就好了,這個部分設計 地確實很好啊。
那Intent通過什麼來告訴系統需要誰來接受他呢?
通常使用Intent有兩種方法,第一種是直接說明需要哪一個類來接收代碼如下:
Java代碼
1. Intent intent = new Intent(this, MyActivity.class);
2. intent.getExtras().putString("id", "1");
3. tartActivity(intent);
Intent intent = new Intent(this, MyActivity.class);
intent.getExtras().putString("id", "1");
tartActivity(intent);
第一種方式很明顯,直接指定了MyActivity為接受者,並且傳了一些數據給MyActivity,在MyActivity裡可以用getIntent()來的到這個intent和數據。
第二種就需要先看一下androidMenifest中的intentfilter的配置了
XML代碼
< intent-filter>
< action
android:name="android.intent.action.VIEW"
/>
< action
android:value="android.intent.action.EDIT"
/>
< action
android:value="android.intent.action.PICK"
/>
< category
android:name="android.intent.category.DEFAULT"
/>
< data
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
< /intent-filter>
這裡面配置用到了action, data, category這些東西,那麼聰明的你一定想到intent裡也會有這些東西,然後一匹配不就找到接收者了嗎?
action其實就是一個意圖的字符串名稱。
上面這段intent-filter的配置文件說明了這個Activity可以接受不同的Action,當然相應的程序邏輯也不一樣咯,提一下那個 mimeType,他是在ContentProvider裡定義的,你要是自己實現一個ContentProvider就知道了,必須指定
接上頁
mimeType才能讓數據被別人使用。不知道原理說明白沒,總結一句,就是你調用別的界面不是直接new那個界面,而是通過扔出一個intent,讓系統幫你去調用那個界面,這樣就多麼松藕合啊,而且符合了生命周期被系統管理的原則。
想知道category都有啥,android為你預先定制好的action都有啥等等,請親自訪問官方鏈接Intent
ps:想知道怎麼調用系統應用程序的同學,可以仔細看一下你的logcat,每次運行一個程序的時候是不是有一些信息比如:
Starting activity: Intent { action=android.intent.action.MAINcategorIEs={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再對照一下Intent的一些set方法,就知道怎麼調用咯,希望你喜歡:)
android面試題
1. 請描述下Activity的生命周期。
2. 如果後台的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
3. 如何將一個Activity設置成窗口的樣式。(Edited by Sodino)
4. 如何退出Activity?如何安全退出已調用多個Activity的Application?
5. 請介紹下android中常用的五種布局。
6. 請介紹下android的數據存儲方式。(Edited by Sodino)
7. 請介紹下ContentProvider是如何實現數據共享的。(Edited by Sodino)
8. 如何啟用Service,如何停用Service。(Edited by Sodino)
9. 注冊廣播有幾種方式,這些方式有何優缺點?請談談android引入廣播機制的用意。
10. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系。
11. AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?
12. 請解釋下android程序運行時權限與文件系統權限的區別。(Edited by Sodino)
13. 系統上安裝了多種浏覽器,能否指定某浏覽器訪問指定頁面?請說明原由。
14. 有一個一維整型數組int[]data保存的是一張寬為width,高為height的圖片像素值信息。請寫一個算法,將該圖片所有的白色不透明(0xffffffff)像素點的透明度調整為50%。
15. 你如何評價android系統?優缺點。
1、什麼是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。這種實踐需要應用到所有顯示用戶界面的線程,因為他們都面臨著同樣的超時問題。
2、什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常?
答:一般像空指針啊,可以看起logcat,然後對應到程序中 來解決錯誤
3、android本身的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決?
4、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver
答:一個activity呈現了一個用戶可以操作的可視化用戶界面
一個service不包含可見的用戶界面,而是在後台無限地運行
可以連接到一個正在運行的服務中,連接後,可以通過服務中暴露出來的借口與其進行通信
一個broadcast receiver是一個接收廣播消息並作出回應的component,broadcast receiver沒有界面
intent:content provider在接收到ContentResolver的請求時被激活。
activity, service和broadcast receiver是被稱為intents的異步消息激活的。
接上頁
一個intent是一個Intent對象,它保存了消息的內容。對於activity和service來說,它指定了請求的操作名稱和待操作數據的URI
Intent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。
它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。
5、IntentService有何優點?
答:IntentService 的好處
* Acitivity的進程,當處理Intent的時候,會產生一個對應的Service
* android的進程處理器現在會盡可能的不kill掉你
* 非常容易使用
6、橫豎屏切換時候activity的生命周期?
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orIEntation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orIEntation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
1. 如何將SQLite數據庫(dictionary.db文件)與apk文件一起發布?
解答:可以將dictionary.db文件復制到Eclipse android工程中的resaw目錄中。所有在resaw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復制到resaw目錄中
2. 如何將打開resaw目錄中的數據庫文件?
解答:在Android中不能直接打開resaw目錄中的數據庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然後再打開該數據庫文件。復制的基本方法是使用getResources().openRawResource方法獲得resaw目錄中資源的 InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。
3. android引入廣播機制的用意?
答:a:從MVC的角度考慮(應用程序內)
接上頁
其實回答這個問題的時候還可以這樣問,android為什麼要有那4大組件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大組件本質上就是為了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關系,有時候又是一種補充關系,引入廣播機制可以方便幾大組件的信息和數據交互。
b:程序間互通消息(例如在自己的應用程序內監聽系統來電)
c:效率上(參考UDP的廣播協議在局域網的方便性)
d:設計模式上(反轉控制的一種應用,類似監聽者模式)
t frameworks,將會把android.git.kernel.org站點上的base文件夾下的所有文件和文件夾下載本地的frameworks文件夾中; 4、在
我們曾在《android 2.2開發初學者快速入門十一大秘技》一文中介紹過一些android的控件,本文從一個示例:“當點擊模擬器右側的Menu按鈕,在輸入界面中顯示一
android開發采用了軟件堆層(software stack,又名軟件疊層)的架構,主要分為三部分,下面就對這三個部分做一下自己的見解和看法,希望能夠給大家帶來相關的
有以下兩種方式來使用 Android 設備發送短信:使用 SmsManager 發送短信使用內置 Intent 發送短信使用SmsManager 發送短信Sms