ANDROID面試題71道

1. 下列哪些語句關於內存回收的說明是正確的? (b )
 A、 程序員必須建立一個線程來釋放內存

  B、 內存回收程序負責釋放無用內存 


  C、 內存回收程序容許程序員直接釋放內存 


  D、 內存回收程序能夠在指定的時間釋放內存對象 


android內存回收機制


我想每一個人第一次用Android的時候,不可避免的會去裝 個任務管理器,而後對裏面時刻都停留着一大堆的程序表 示觸目驚心,而後會在桌面上創建一個快捷清空內存的按 鈕,時不時啪的按一下,看着內存剩餘數量從30多變成100 多而後頗有快感... 其實吧,Android是Linux的內核,每個程序都是一個獨立 的JAVA虛擬機,就和油湯裏的油花同樣互不干擾,這樣充分 保證了萬一某個程序的JAVA虛擬機崩潰,系統依舊穩定正 常運行. 而Android和傳統Linux不同的地方又在於,傳統Linux在 進程活動中止後就結束了,這就相似於咱們用S60和WM一 樣,關閉程序,內存釋放.而Android會把這些進程保留在內 存裏,幹嗎呢?爲了保證你再次激活這些進程時候啓動的更 快,好比說咱們掛在桌面的Widgets, 具體一點咱們拿新浪微博舉例吧.我剛看完,退出,忽然我想 我發一條微博吧, 那麼這個時候我能夠直接在桌面Widgets上操做----設想一 下若是我退出的時候這個進程就終止了,那麼我在桌面上 點擊Widgets的時候會不會卡頓一下甚至沒有響應? ----這就跟咱們把Widgets掛在桌面的行爲徹底背離了,放 在桌面上就是爲了能隨時觀察到程序運行的狀況, 以及隨時能夠快速調用程序.因此Android並無在進程活 動中止就釋放對應的內存.那麼也許你仍是會有疑問,那麼 內存夠不夠用呢? 
512的內存被我用的只剩56M是否是很恐怖?其實系統一 點也不卡的,蛋定蛋定 是的,我理解,由於你們這麼多年Windows都用習慣 了,Windows內存不足的時候機器卡的會讓你想砸掉機箱, 並且調用虛擬內存的時候硬盤喀喀喀想的讓你肉疼. 你確定也會怕你的手機明明512M內存結果就剩下30來M 把你卡到崩潰.事實上呢,Android會在系統須要更多內存 的時候,去釋放掉那些佔用內存的進程----這個活動是智能的.最先你們認爲是有個排序,好比最近使 用過哪些程序(LRU機制,Last Recently Used),然 後結束最先的進程.不過並不是如此,不然就變成咱們上小學 時候那樣,個子高的塊頭大的男生跟班長下去拔草扛新書, 女生們留在班裏繡花吧... 這樣很明顯不公平並且沒準會結束掉那些咱們並不想結束 掉的進程----譬如說這會兒我想切回到剛纔後臺的網頁繼 續瀏覽結果悲愴的發現它被系統給我強制關閉了...
Android把進程分紅了一些優先級,好比 前臺進程(Foreground),好比咱們正在看書,那麼看書 的程序就是前臺進程,這些進程是不會被系統優先結束的. 當我把它切到後臺的時候,它就變成後臺進程了. 還有可見進程(Visible),這個怎麼說呢,譬如輸入法程 序,你平時是看不見它的,可是在你打開輸入界面的時候,它 會很快的彈出來,而不是讓你等啊等啊等,看不到的緣由是 透明度的機制,咱就不要鑽牛角尖討論爲啥我看不見了... 還有桌面的Widgets,好比咱們的桌面時鐘,這個東西就是 可見的,若是它被系統終止了會有什麼樣的結果?這個 Widgets依然會顯示在桌面上,可是時針不走了... 主要服務,好比說,電話的撥號功能,你也不想正急着打 電話呢結果人家給你卡半天吧,尤爲像我這樣聯繫人上 2000的,載入一遍真的很慢啊...因此這些主要服務平時也 不會被系統自動結束,除非你非要關它,關了也會本身從新 加載的.這也是你徹底釋放內存之後過一會就看着內存可 用值又慢慢下降的緣由.
次要服務(secondary server),諸如谷歌企業套 件,Gmail,聯繫人,看着這些程序出如今任務管理器裏可能 你會很是的莫名其妙,丫的這都哪跟哪啊我沒開啊...其實 它們和一些系統功能也是息息相關的,好比Gmail的郵件推 送,咱們時常須要用到它們,因此係統也太會去終止它們.甚 至於HTC機器上著名的HTC Sense,這個也是次要服務,但 是其實它承接着整個系統界面的運行,因此,若是你強行關 閉全部進程的時候,你的屏幕會變成一片白...而後慢慢等 HTC Sense加載.
後臺進程(hidden),就是咱們一般意義上理解的啓動後 被切換到後臺的進程,好比如瀏覽器和閱讀器.後臺進程的 管理策略有多種,可是通常來說,系統都會視內存狀況,儘可 能多的保留後臺程序,這樣會影響到你啓動別的程序的運 行速度----我想這個很好理解,由於內存確實不夠了,並且你 還沒讓系統自動釋放內存.但好處是,你再次切換到這些已 啓動的程序時幾乎是無縫的,速度絕對比你從0開始啓動它 要快得多.因此,這種後臺進程在內存極度不夠的時候,確定 會被系統選擇性的幹掉的. 內容供應節點(content provider),沒有程序實體,僅提 供內容供別的程序去用的,好比日曆供應節點,郵件供應節 點等.在系統自動終止進程時,這類程序享有優先的被幹掉 權... 空進程(empty), 沒有任何東西在內運行的進程,有些程序在退出後,依然會 在進程中駐留一個空進程,這個進程裏沒有任何數據在運 行,做用每每是提升該程序下次的啓動速度或者記錄程序 的一些歷史信息.這部分進程無疑是系統最早終止的.
說了這麼多,其實仍是要結合實際的程序來看一下的,好比 Android這個頗有名的自動內存調配的軟件,Auto Memory Manager,它的設置和幫助界面就如上面所說的, 它自動提供了多種默認配置,例如極速模式,這個模式下,會 幫助你在設定好的臨界值區間上,結束空進程以及內容供 應節點等等低優先級保留權的進程,來給你騰出更多的內 存,加速新運行程序打開的速度,可是它也說明了這種模式 的弊端,就是一些可能你不想被關閉的進程會被過早的關 閉,好比說,鬧鐘----在G2 G3還很火爆的2009年,不少用戶 在買完手機後給我抱怨,哎呀這個機器鬧鐘怎麼老不響 啊...上班老遲到...其實這就是由於手動結束進程的時候結 果把鬧鐘也給幹掉了.系統的時間是會一直走的,這屬於主 要服務,而鬧鐘呢,只是主要服務的一個附屬品,因此被結束 後,是不會自動被啓動的,既然沒有啓動天然就不會響了.與 此相似的例子就是里程碑不充電的BUG,這是由於Moto的 機器裏有個USB的進程,若是你把它結束後,理論上會從新 啓動的可是也會不啓動,後面這種狀況出現的結果就是你 插充電器沒反應,插數據線連電腦沒反應...重啓手機就好 了. 固然我知道你們的潔癖不少,有的人就是見不得內存值太 小...好吧若是你不想一些被系統認爲不過重要而你又很需 要的進程被你本身親手扼殺的話,那麼我推薦你使用高級 任務管理器這個程序,你能夠把一些進程自動隱藏起來,也 就是說當你揮起狼牙棒橫掃一堆進程的時候,你設置好的 幾個進程是不會受任何影響的,好比桌面Launcher,好比鬧 鍾,好比USB,等等等等.但話說回來,我是不建議你們去手動 管理Android的內存,也許你會不習慣----我也沒啥好勸告 的,總之,不要把你的智能機想的那麼笨就好了. 剛纔全殺掉進程後,過了一會,個人DEFY又變成剩餘60M內 存,仍是沒啥鴨梨啊...若是你感興趣能夠作個試驗,內 存不多的時候,你打開一個大遊戲,而後退出,你會發現...


http://reedhistudy.diandian.com/post/2011-09-15/5045645 


2. 下面異常是屬於Runtime Exception 的是(abcd)(多選)
      A、ArithmeticException 


      B、IllegalArgumentException 


      C、NullPointerException 


      D、BufferUnderflowException 


  A、ArithmeticException     


   當出現異常的運算條件時,拋出此異常。例如,一個整數「除以零」時,拋出此類的一個實例。






      B、IllegalArgumentException 


  拋出的異常代表向方法傳遞了一個不合法或不正確的參數。






      C、NullPointerException 


      D、BufferUnderflowException (不明白,沒碰到過)


編碼問題致使java_BufferUnderflowException異常


公共類BufferUnderflowException的


延伸的RuntimeException


未經檢查的異常時,拋出一個相對get操做達到源緩衝區的限制。






 


3.  Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). 
A、11 ,-11   B、11 ,-12   C、12 ,-11   D、12 ,-12


四捨五入 四和五是指正的4,5
-11.5 這麼看 -11.5 = -12 +0.5   ,0.5按四捨五入爲1 ,-12+1 = -11,因此Math.round(-11.5)==-11
           -0.5 = -1 + 0.5   0.5按四捨五入爲1 ,-1+1 = 0,因此Math.round(-0.5)==0


            11.5 四捨五入 顯然 Math.round(11.5)==12


round方法返回與參數最接近的長整數,參數加0.5後求其floor(小於等於該數的最大整數)










4. 下列程序段的輸出結果是:(b)


     void complicatedexpression_r(){
     int x=20, y=30;
     boolean b;
     b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
     System.out.println(b);
     }
     A、true  B、false  C、1  D、011.activity
        &&(與)的優先級比||(或)高




5. 對一些資源以及狀態的操做保存,最好是保存在生命週期的哪一個函數中進行(d)
   A、onPause()  B、onCreate()   C、 onResume()   D、onStart()






Activity詳解(生命週期、以各類方式啓動Activity、狀態保存,徹底退出等)


http://blog.csdn.net/tangcheng_ok/article/details/6755194




6. Intent傳遞數據時,下列的數據類型哪些能夠被傳遞(abcd)(多選)
       A、Serializable  B、charsequence  C、Parcelable  D、Bundle








android 數據傳遞詳解(Serialization、Parcelable、Parcel、Intent、Bundle)


http://jojol-zhou.iteye.com/blog/1401905
Android中Intent傳遞對象的兩種方法(Serializable,Parcelable)


http://blog.csdn.net/xyz_lmn/article/details/5908355










7. android 中下列屬於Intent的做用的是(c)
  A、實現應用程序間的數據共享


  B、是一段長的生命週期,沒有用戶界面的程序,能夠保持應用在後臺運行,而不會由於切換頁面而消失


  C、能夠實現界面間的切換,能夠包含動做和動做數據,鏈接四大組件的紐帶


  D、處理一個應用程序總體性的工做






8. 下列屬於SAX解析xml文件的優勢的是(b)
      A、將整個文檔樹在內存中,便於操做,支持刪除,修改,從新排列等多種功能(dom解析優勢)


      B、不用事先調入整個文檔,佔用資源少(sax解析優勢)


      C、整個文檔調入內存,浪費時間和空間(dom解析缺點)


      D、不是長久駐留在內存,數據不是持久的,事件事後,若沒有保存數據,數據就會(sax解析缺點)


  消失








不須要像dom解析那樣在內存中創建一個dom對象,佔用內存,sax解析是逐行解析的,每次讀入內存的只是一行xml,因此速度快,效率高點。不過sax通常是處理固定格式的xml。






9.  下面的對自定style的方式正確的是(a)
    A、 <resources>


<style name="myStyle">


<item name="android:layout_width">fill_parent</item>


</style>


 </resources>


     B、 <style name="myStyle">


<item name="android:layout_width">fill_parent</item>(沒有<resources>)


   </style>


     C、 <resources>


<item name="android:layout_width">fill_parent</item>(沒有</style>)


  </resources>


     D、 <resources>


<style name="android:layout_width">fill_parent</style>(</style>應爲</item>)


  </resources>


10.   在android中使用Menu時可能須要重寫的方法有(ac)。(多選)
      A、onCreateOptionsMenu() 


  B、onCreateMenu()


  C、onOptionsItemSelected()


  D、onItemSelected()






 //當客戶點擊MENU按鈕的時候,調用該方法
    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 1, 1, R.string.exit);
    menu.add(0,2,2,R.string.about);
return super.onCreateOptionsMenu(menu);
}
    //當客戶點擊菜單當中的某一個選項時,會調用該方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 1){
finish();
}
return super.onOptionsItemSelected(item);
}


11.  在SQL Server Management Studio 中運行下列T-SQL語句,其輸出值(c)。
 SELECT @@IDENTITY  


     A、可能爲0.1


     B、可能爲3


     C、 不可能爲-100


     D、確定爲0




@@identity是表示的是最近一次向具備identity屬性(即自增列)的表插入數據時對應的自增列的值,是系統定義的全局變量。通常系統定義的全局變量都是以@@開頭,用戶自定義變量以@開頭。好比有個表A,它的自增列是id,當向A表插入一行數據後,若是插入數據後自增列的值自動增長至101,則經過select @@identity獲得的值就是101。使用@@identity的前提是在進行insert操做後,執行select @@identity的時候鏈接沒有關閉,不然獲得的將是NULL值。






12. 在SQL Server 2005中運行以下T-SQL語句,假定SALES表中有多行數據,執行查詢之 後的結果是(d)。
 BEGIN TRANSACTION A


  Update SALES Set qty=30 WHERE qty<30


 BEGIN TRANSACTION B


Update SALES Set qty=40 WHERE qty<40


Update SALES Set qty=50 WHERE qty<50


Update SALES Set qty=60 WHERE qty<60


 COMMITTRANSACTION B


 COMMIT TRANSACTION A


 A、SALES表中qty列最小值大於等於30


 B、SALES表中qty列最小值大於等於40


 C、SALES表中qty列的數據所有爲50


 D、SALES表中qty列最小值大於等於60






Update SALES Set qty=60 WHERE qty<60(關鍵在最後一句,執行完數據就都是大於等於60了)


13.  在android中使用SQLiteOpenHelper這個輔助類時,能夠生成一個數據庫,並能夠對數據庫版本進行管理的方法能夠是(ab)
     A、getWriteableDatabase()


 B、getReadableDatabase()


 C、getDatabase()


 D、getAbleDatabase()


14. android 關於service生命週期的onCreate()和onStart()說法正確的是(ad)(多選題)
     A、當第一次啓動的時候前後調用onCreate()和onStart()方法


     B、當第一次啓動的時候只會調用onCreate()方法


     C、若是service已經啓動,將前後調用onCreate()和onStart()方法


 D、若是service已經啓動,只會執行onStart()方法,不在執行onCreate()方法


15. 下面是屬於GLSurFaceView特性的是(abc)(多選)
 A、管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖


    view上。


 B、管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。


 C、讓渲染器在獨立的線程裏運做,和UI線程分離。


 D、能夠直接從內存或者DMA等硬件接口取得圖像數據






android.opengl.GLSurfaceView概述


http://blog.csdn.net/xqhrs232/article/details/6195824
 GLSurfaceView是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。


        GLSurfaceView提供了下列特性:
                1> 管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
                2> 管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
                3> 用戶自定義渲染器(render)。
                4> 讓渲染器在獨立的線程裏運做,和UI線程分離。
                5> 支持按需渲染(on-demand)和連續渲染(continuous)。
                6> 一些可選工具,如調試。




16. 下面在AndroidManifest.xml文件中註冊BroadcastReceiver方式正確的(a)
   A、<receiver android:name="NewBroad">


<intent-filter>


<action  


                   android:name="android.provider.action.NewBroad"/>


                <action>


</intent-filter>


</receiver>


     B、<receiver android:name="NewBroad">


<intent-filter>


                   android:name="android.provider.action.NewBroad"/>


</intent-filter>


</receiver>


     C、<receiver android:name="NewBroad">


<action  


                  android:name="android.provider.action.NewBroad"/>


             <action>


</receiver>


     D、<intent-filter>


         <receiver android:name="NewBroad">


 <action> 


                   android:name="android.provider.action.NewBroad"/>


              <action>


</receiver>


</intent-filter>


17. 關於ContenValues類說法正確的是(a)
      A、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的


         名是String類型,而值都是基本類型


      B、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的


         名是任意類型,而值都是基本類型


      C、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中的


         名,能夠爲空,而值都是String類型      


      D、他和Hashtable比較相似,也是負責存儲一些名值對,可是他存儲的名值對當中


         的名是String類型,而值也是String類型


18. 咱們都知道Hanlder是線程與Activity通訊的橋樑,若是線程處理不當,你的機器就會變得越慢,那麼線程銷燬的方法是(a)
       A、onDestroy() 


       B、onClear()


       C、onFinish() 


       D、onStop()


19. 下面退出Activity錯誤的方法是(c)
       A、finish()


    B、拋異常強制退出


       C、System.exit()  System.exit(0) 0是正常退出 
其餘數字是表示不正常退出


       D、onStop()


20. 下面屬於android的動畫分類的有(ab)(多項)
       A、Tween  B、Frame C、Draw D、Animation 








Android動畫模式


Animation主要有兩種動畫模式:
一種是tweened animation(漸變更畫) 
XML中 JavaCode
alpha AlphaAnimation
scale ScaleAnimation




一種是frame by frame(畫面轉換動畫) 
XML中 JavaCode
translate TranslateAnimation
rotate RotateAnimation
21. 下面關於Android dvm的進程和Linux的進程,應用程序的進程說法正確的是(d)
        A、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,不必定擁有一個獨立 的Dalvik虛擬機實例.而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念.


        B、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,不必定擁有一個獨立的Dalvik虛擬機實例.而每個DVM不必定都是在Linux 中的一個進程,因此說不是一個概念.


        C、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例.而每個DVM不必定都是在Linux 中的一個進程,因此說不是一個概念.


        D、DVM指dalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的 Dalvik虛擬機實例.而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念.


22.   Android項目工程下面的assets目錄的做用是什麼b
A、放置應用到的圖片資源。


B、主要放置多媒體等數據文件


C、放置字符串,顏色,數組等常量數據


D、放置一些與UI相應的佈局文件,都是xml文件


23.  關於res/raw目錄說法正確的是(a)
A、 這裏的文件是原封不動的存儲到設備上不會轉換爲二進制的格式


B、 這裏的文件是原封不動的存儲到設備上會轉換爲二進制的格式


C、 這裏的文件最終以二進制的格式存儲到指定的包中


D、 這裏的文件最終不會以二進制的格式存儲到指定的包中


24.  下列對android NDK的理解正確的是(abcd )
A、 NDK是一系列工具的集合


B、 NDK 提供了一份穩定、功能有限的 API 頭文件聲明。


C、 使 「Java+C」 的開發方式終於轉正,成爲官方支持的開發方式


D、 NDK 將是 Android 平臺支持 C 開發的開端






Windows平臺下如何使用Android NDK


http://yuchen.blog.51cto.com/2739238/623472/


二.填空題


25.  android中經常使用的四個佈局是LinearLayout(線性佈局)、FrameLayout(單幀佈局)、RelativeLayout(相對佈局)和TableLayout(表格佈局)
26.  android 的四大組件是activity,service,broadcast和Content Provider。
27.  java.io包中的objectinputstream和objectoutputstream類主要用於對對象(Object)的讀寫。
28.  android 中service的實現方法是:startservice和bindservice。
Service的生命週期方法比Activity少一些,只有onCreate, onStart, onDestroy 
咱們有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的。


1 經過startService 
Service會經歷 onCreate --> onStart 
stopService的時候直接onDestroy 


若是是 調用者 直接退出而沒有調用stopService的話,Service會一直在後臺運行。 
下次調用者再起來仍然能夠stopService。


2 經過bindService 
Service只會運行onCreate, 這個時候 調用者和Service綁定在一塊兒 


調用者退出了,Srevice就會調用onUnbind-->onDestroyed 
所謂綁定在一塊兒就共存亡了。 


1. Started Service中使用StartService()方法來進行方法的調用,調用者和服務之間沒有聯繫,即便調用者退出了,服務依然在進行【onCreate()-  >onStartCommand()->startService()->onDestroy()】,注意其中沒有onStart(),主要是被onStartCommand()方法給取代了,onStart方法不推薦使用了。
2. BindService中使用bindService()方法來綁定服務,調用者和綁定者綁在一塊兒,調用者一旦退出服務也就終止了【onCreate()->onBind()->onUnbind()->onDestroy()】。


29.  activity通常會重載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory()  外還有onrestart,onresume,onpause,onstop。
30.  android的數據存儲的方式sharedpreference,文件,SQlite,contentprovider,網絡。
 1. 使用SharedPreferences存儲數據;
  2. 文件存儲數據;
  3. SQLite數據庫存儲數據;
  4. 使用ContentProvider存儲數據;
  5. 網絡存儲數據;
31. 當啓動一個Activity而且新的Activity執行完後須要返回到啓動它的Activity來執行 的回調函數是
startActivityForResult
startActivityForResult(Intent,requestCode)//啓動一個activity包含參數請求碼和具體的intent數據,其中請求碼能夠用來識別子活動。
32. 請使用命令行的方式建立一個名字爲myAvd,sdk版本爲2.2,sd卡是在d盤的根目錄下,名字爲scard.img, 並指定屏幕大小HVGA.________________android create acd -n myAvd -t 8 -s HVDA – C d:\card.img____________________。
33.   程序運行的結果是:_____good and gbc__________。
    public class Example{ 


  String str=new String("good"); 


  char[]ch={'a','b','c'}; 


  public static void main(String args[]){ 


    Example ex=new Example(); 


    ex.change(ex.str,ex.ch); 


    System.out.print(ex.str+" and "); 


    Sytem.out.print(ex.ch); 


  } 


  public void change(String str,char ch[]){ 


    str="test ok"; 


    ch[0]='g'; 


  } 





34.  在android中,請簡述jni的調用過程。(8分)
1)安裝和下載Cygwin,下載 Android NDK


  2)在ndk項目中JNI接口的設計


  3)使用C/C++實現本地方法


  4)JNI生成動態連接庫.so文件


  5)將動態連接庫複製到java工程,在java工程中調用,運行java工程便可


35. 簡述Android應用程序結構是哪些?(7分)
Android應用程序結構是:


  Linux Kernel(Linux內核)、Libraries(系統運行庫或者是c/c++核心庫)、Application  


  Framework(開發框架包)、Applications(核心應用程序)


36. 請繼承SQLiteOpenHelper實現:(10分)
   1).建立一個版本爲1的「diaryOpenHelper.db」的數據庫,


   2).同時建立一個 「diary」 表(包含一個_id主鍵並自增加,topic字符型100


       長度, content字符型1000長度)


    3).在數據庫版本變化時請刪除diary表,並從新建立出diary表。


public class DBHelper  extends SQLiteOpenHelper {


public final static String DATABASENAME = "diaryOpenHelper.db";


public final static int DATABASEVERSION = 1;


//建立數據庫


public DBHelper(Context context,String name,CursorFactory factory,int version)


{


super(context, name, factory, version);


}


//建立表等機構性文件


public void onCreate(SQLiteDatabase db)


{


String sql ="create table diary"+


"("+


"_id integer primary key autoincrement,"+


"topic varchar(100),"+


"content varchar(1000)"+


")";


db.execSQL(sql);


}


//若數據庫版本有更新,則調用此方法


public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)


{


String sql = "drop table if exists diary";


db.execSQL(sql);


this.onCreate(db);


}


}


37. 頁面上現有ProgressBar控件progressBar,請用書寫線程以10秒的的時間完成其進度顯示工做。(10分)
答案


public class ProgressBarStu extends Activity {


private ProgressBar progressBar = null;


protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);


setContentView(R.layout.progressbar);


//從這到下是關鍵


progressBar = (ProgressBar)findViewById(R.id.progressBar);


Thread thread = new Thread(new Runnable() {


@Override


public void run() {


int progressBarMax = progressBar.getMax();


try {


while(progressBarMax!=progressBar.getProgress())


{


int stepProgress = progressBarMax/10;


int currentprogress = progressBar.getProgress();


progressBar.setProgress(currentprogress+stepProgress);


Thread.sleep(1000);


}


} catch (InterruptedException e) {


// TODO Auto-generated catch block


e.printStackTrace();


}


}


});


thread.start();


//關鍵結束


}


}


38.    請描述下Activity的生命週期。
      必調用的三個方法:onCreate() --> onStart() --> onResume(),用AAA表示


(1)父Activity啓動子Activity,子Actvity退出,父Activity調用順序以下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart() --> onStart(),onResume() …
(2)用戶點擊Home,Actvity調用順序以下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() – Maybe
(3)調用finish(), Activity調用順序以下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上顯示dialog, Activity調用順序以下
AAA
(5)在父Activity上顯示透明的或非全屏的activity,Activity調用順序以下
AAA --> onFreeze() --> onPause()
(6)設備進入睡眠狀態,Activity調用順序以下
AAA --> onFreeze() --> onPause()


39.   若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態?
      onSaveInstanceState()


      當你的程序中某一個Activity A在運行時,主動或被動地運行另外一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成之後又會來找A,這個時候就有兩種狀況:一是A被回收,二是A沒有被回收,被回收的A就要從新調用onCreate()方法,不一樣於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。 


40.    如何將一個Activity設置成窗口的樣式。
      在AndroidManifest.xml 中定義Activity的地方一句話android:theme=" @android :style/Theme.Dialog"或android:theme=" @android :style/Theme.Translucent"就變成半透明的 41. 如何退出Activity?如何安全退出已調用多個Activity的Application? 對於單一Activity的應用來講,退出很簡單,直接finish()便可。 固然,也能夠用killProcess()和System.exit()這樣的方法。 可是,對於多Activity的應用來講,在打開多個Activity後,若是想在最後打開的Activity直接退出,上邊的方法都是沒有用的,由於上邊的方法都是結束一個Activity而已。 固然,網上也有人說能夠。 就好像有人問,在應用裏如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME便可,而事實上若是不修改framework,根本不可能作到這一點同樣。 因此,最好仍是本身親自試一下。 那麼,有沒有辦法直接退出整個應用呢? 在2.1以前,能夠使用ActivityManager的restartPackage方法。 它能夠直接結束整個應用。在使用時須要權限android.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。 但是,在2.2,這個方法失效了。 在2.2添加了一個新的方法,killBackgroundProcesses(),須要權限 android.permission.KILL_BACKGROUND_PROCESSES。 惋惜的是,它和2.2的restartPackage同樣,根本起不到應有的效果。 另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序的方法,forceStopPackage()。 它須要權限android.permission.FORCE_STOP_PACKAGES。 而且須要添加android:sharedUserId="android.uid.system"屬性 一樣惋惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序沒法調用。 由於須要在Android.mk中添加LOCAL_CERTIFICATE := platform。 而Android.mk是用於在Android源碼下編譯程序用的。 從以上能夠看出,在2.2,沒有辦法直接結束一個應用,而只能用本身的辦法間接辦到。 現提供幾個方法,供參考: 一、拋異常強制退出: 該方法經過拋異常,使程序Force Close。 驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。 二、記錄打開的Activity: 每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。 三、發送特定廣播: 在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。 四、遞歸退出 在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。 除了第一個,都是想辦法把每個Activity都結束掉,間接達到目的。 可是這樣作一樣不完美。 你會發現,若是本身的應用程序對每個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。 但至少,咱們的目的達到了,並且沒有影響用戶使用。 爲了編程方便,最好定義一個Activity基類,處理這些共通問題。  42. 請介紹下Android中經常使用的五種佈局。 FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局) 43. 請介紹下Android的數據存儲方式。 一.SharedPreferences方式 二.文件存儲方式 三.SQLite數據庫方式 四.內容提供器(Content provider)方式 五. 網絡存儲方式 44.  請介紹下ContentProvider是如何實現數據共享的。 建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。 45. 如何啓用Service,如何停用Service。 Android中的service相似於windows中的service,service通常沒有用戶操做界面,它運行於系統中不容易被用戶發覺, 能夠使用它開發如監控之類的程序。 一。步驟 第一步:繼承Service類 public class SMSService extends Service { } 第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置: <service android:name=".DemoService" /> 二。Context.startService()和Context.bindService 服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可 以啓動Service,可是它們的使用場合有所不一樣。 1.使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了,服務仍然運行。 使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止。 2.採用Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法, 接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並 不會致使屢次建立服務,但會致使屢次調用onStart()方法。 採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用 onDestroy()方法。    3.採用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法, 接着調用onBind()方法。這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法, 。接着調用onDestroy()方法。若是調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會 致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。若是調用者但願與正在綁定的服務 解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。 三。Service的生命週期 1.Service經常使用生命週期回調方法以下: onCreate() 該方法在服務被建立時調用,該方法只會被調用一次,不管調用多少次startService()或bindService()方法, 服務也只被建立一次。 onDestroy()該方法在服務被終止時調用。    2. Context.startService()啓動Service有關的生命週期方法 onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。 屢次調用startService()方法儘管不會屢次建立服務,但onStart() 方法會被屢次調用。 3. Context.bindService()啓動Service有關的生命週期方法 onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用, 當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法被屢次調用。 onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用。 備註: 1. 採用startService()啓動服務      Intent intent = new Intent(DemoActivity.this, DemoService.class);      startService(intent); 2.Context.bindService()啓動     Intent intent = new Intent(DemoActivity.this, DemoService.class);     bindService(intent, conn, Context.BIND_AUTO_CREATE);    //unbindService(conn);//解除綁定 46. 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。   Android廣播機制(兩種註冊方法)  在android下,要想接受廣播信息,那麼這個廣播接收器就得咱們本身來實現了,咱們能夠繼承BroadcastReceiver,就能夠有一個廣播接受器了。有個接受器還不夠,咱們還得重寫BroadcastReceiver裏面的onReceiver方法,當來廣播的時候咱們要幹什麼,這就要咱們本身來實現,不過咱們能夠搞一個信息防火牆。具體的代碼: public class SmsBroadCastReceiver extends BroadcastReceiver     {           @Override       public void onReceive(Context context, Intent intent)        {            Bundle bundle = intent.getExtras();            Object[] object = (Object[])bundle.get("pdus");            SmsMessage sms[]=new SmsMessage[object.length];            for(int i=0;i<object.length;i++)            {                sms[0] = SmsMessage.createFromPdu((byte[])object[i]);                Toast.makeText(context, "來自"+sms[i].getDisplayOriginatingAddress()+" 的消息是:"+sms[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show();            }            //終止廣播,在這裏咱們能夠稍微處理,根據用戶輸入的號碼能夠實現短信防火牆。            abortBroadcast();        }            }     當實現了廣播接收器,還要設置廣播接收器接收廣播信息的類型,這裏是信息:android.provider.Telephony.SMS_RECEIVED    咱們就能夠把廣播接收器註冊到系統裏面,可讓系統知道咱們有個廣播接收器。這裏有兩種,一種是代碼動態註冊: //生成廣播處理    smsBroadCastReceiver = new SmsBroadCastReceiver();    //實例化過濾器並設置要過濾的廣播    IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");  //註冊廣播    BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter);   一種是在AndroidManifest.xml中配置廣播 <?xml version="1.0" encoding="utf-8"?>   <manifest xmlns:android="http://schemas.android.com/apk/res/android"         package="spl.broadCastReceiver"         android:versionCode="1"         android:versionName="1.0">       <application android:icon="@drawable/icon" android:label="@string/app_name">           <activity android:name=".BroadCastReceiverActivity"                     android:label="@string/app_name">               <intent-filter>                   <action android:name="android.intent.action.MAIN" />                   <category android:name="android.intent.category.LAUNCHER" />               </intent-filter>           </activity>                       <!--廣播註冊-->           <receiver android:name=".SmsBroadCastReceiver">               <intent-filter android:priority="20">                   <action android:name="android.provider.Telephony.SMS_RECEIVED"/>               </intent-filter>           </receiver>                   </application>               <uses-sdk android:minSdkVersion="7" />               <!-- 權限申請 -->       <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>           </manifest>      兩種註冊類型的區別是:      1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命週期。      2)第二種是常駐型,也就是說當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。 47. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。 Handler簡介: 一個Handler容許你發送和處理Message和Runable對象,這些對象和一個線程的MessageQueue相關聯。每個線程實例和一個單獨的線程以及該線程的MessageQueue相關聯。當你建立一個新的Handler時,它就和建立它的線程綁定在一塊兒了。這裏,線程咱們也能夠理解爲線程的MessageQueue。從這一點上來看,Handler把Message和Runable對象傳遞給MessageQueue,並且在這些對象離開MessageQueue時,Handler負責執行他們。 Handler有兩個主要的用途:(1)肯定在未來的某個時間點執行一個或者一些Message和Runnable對象。(2)在其餘線程(不是Handler綁定線程)中排入一些要執行的動做。 Scheduling Message,即(1),能夠經過如下方法完成: post(Runnable):Runnable在handler綁定的線程上執行,也就是說不建立新線程。 postAtTime(Runnable,long): postDelayed(Runnable,long): sendEmptyMessage(int): sendMessage(Message): sendMessageAtTime(Message,long): sendMessageDelayed(Message,long): post這個動做讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時候執行他們,固然以必定的排序。sendMessage這個動做容許你把Message對象排成隊列,這些Message對象包含一些信息,Handler的hanlerMessage(Message)會處理這些Message.固然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員須要做的事。 當posting或者sending到一個Hanler時,你能夠有三種行爲:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精確的時間去處理。後二者容許你實現timeout,tick,和基於時間的行爲。 當你的應用建立一個新的進程時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應用對象(像activities,broadcast receivers等)和主線程建立的窗體。你能夠建立本身的線程,並經過一個Handler和主線程進行通訊。這和以前同樣,經過post和sendmessage來完成,差異在於在哪個線程中執行這麼方法。在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。 Message簡介: Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可讓你在大多數狀況下不用做分配的動做。 儘管Message的構造函數是public的,可是獲取Message實例的最好方法是調用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個。 MessageQueue簡介: 這是一個包含message列表的底層類。Looper負責分發這些message。Messages並非直接加到一個MessageQueue中,而是經過MessageQueue.IdleHandler關聯到Looper。 你能夠經過Looper.myQueue()從當前線程中獲取MessageQueue。 Looper簡介: Looper類被用來執行一個線程中的message循環。默認狀況,沒有一個消息循環關聯到線程。在線程中調用prepare()建立一個Looper,而後用loop()來處理messages,直到循環終止。 大多數和message loop的交互是經過Handler。 下面是一個典型的帶有Looper的線程實現。   class LooperThread extends Thread {       public Handler mHandler;              public void run() {           Looper.prepare();                      mHandler = new Handler() {               public void handleMessage(Message msg) {                   // process incoming messages here               }           };                      Looper.loop();       }   } 48.    AIDL的全稱是什麼?如何工做?能處理哪些類型的數據? AIDL的英文全稱是Android Interface Define Language 當A進程要去調用B進程中的service時,並實現通訊,咱們一般都是經過AIDL來操做的 A工程: 首先咱們在net.blogjava.mobile.aidlservice包中建立一個RemoteService.aidl文件,在裏面咱們自定義一個接口,含有方法get。ADT插件會在gen目錄下自動生成一個RemoteService.java文件,該類中含有一個名爲RemoteService.stub的內部類,該內部類中含有aidl文件接口的get方法。 說明一:aidl文件的位置不固定,能夠任意 而後定義本身的MyService類,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的對象,系統會自動將這個對象封裝成IBinder對象,傳遞給他的調用者。 其次須要在AndroidManifest.xml文件中配置MyService類,代碼以下: <!-- 註冊服務 -->   <service android:name=".MyService">     <intent-filter>     <!--  指定調用AIDL服務的ID  -->         <action android:name="net.blogjava.mobile.aidlservice.RemoteService" />      </intent-filter>  </service> 爲何要指定調用AIDL服務的ID,就是要告訴外界MyService這個類可以被別的進程訪問,只要別的進程知道這個ID,正是有了這個ID,B工程才能找到A工程實現通訊。 說明:AIDL並不須要權限 B工程:       首先咱們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務       綁定AIDL服務就是將RemoteService的ID做爲intent的action參數。       說明:若是咱們單獨將RemoteService.aidl文件放在一個包裏,那個在咱們將gen目錄下的該包拷貝到B工程中。若是咱們將RemoteService.aidl文件和咱們的其餘類存放在一塊兒,那麼咱們在B工程中就要創建相應的包,以保證RmoteService.java文件的報名正確,咱們不能修改RemoteService.java文件            bindService(new Inten("net.blogjava.mobile.aidlservice.RemoteService"), serviceConnection, Context.BIND_AUTO_CREATE);         ServiceConnection的onServiceConnected(ComponentName name, IBinder service)方法中的service參數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的對象。 49. 請解釋下Android程序運行時權限與文件系統權限的區別。 運行時權限Dalvik( android受權)  文件系統 linux 內核受權 50.  系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?請說明起因。 經過直接發送Uri把參數帶過去,或者經過manifest裏的intentfilter裏的data屬性 51. 你如何評價Android系統?優缺點。 答:Android平臺手機 5大優點:  1、開放性  在優點方面,Android平臺首先就是其開發性,開發的平臺容許任何移動終端廠商加入到Android聯盟中來。顯著的開放性能夠使其擁有更多的開發者,隨着用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對於Android的發展而言,有利於積累人氣,這裏的人氣包括消費者和廠商,而對於消費者來說,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將能夠用更低的價位購得心儀的手機。 2、掙脫運營商的束縛  在過去很長的一段時間,特別是在歐美地區,手機應用每每受到運營商制約,使用什麼功能接入什麼網絡,幾乎都受到運營商的控制。從去年iPhone 上市 ,用戶能夠更加方便地鏈接網絡,運營商的制約減小。隨着EDGE、HSDPA這些2G至3G移動網絡的逐步過渡和提高,手機隨意接入網絡已不是運營商口中的笑談,當你能夠經過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是否是像噩夢同樣?互聯網巨頭Google推進的Android終端天生就有網絡特點,將讓用戶離互聯網更近。 3、豐富的硬件選擇  這一點仍是與Android平臺的開放性相關,因爲Android的開放性,衆多的廠商會推出千奇百怪,功能特點各具的多種產品。功能上的差別和特點,卻不會影響到數據同步、甚至軟件的兼容,比如你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯繫人等資料更是能夠方便地轉移,是否是很是方便呢? 4、不受任何限制的開發商  Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各類條條框框的阻擾,可想而知,會有多少新穎別緻的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和遊戲如可控制正是留給Android難題之一。 5、無縫結合的Google應用  現在叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成爲鏈接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。 再說Android的5大不足: 1、安全和隱私  因爲手機 與互聯網的緊密聯繫,我的隱私很可貴到保守。除了上網過程當中經意或不經意留下的我的足跡,Google這個巨人也時時站在你的身後,洞穿一切,所以,互聯網的深刻將會帶來新一輪的隱私危機。 2、首先開賣Android手機的不是最大運營商  衆所周知,T-Mobile在23日,於美國紐約發佈 了Android首款手機G1。可是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權的僅有 T-Mobile和Sprint,其中T-Mobile的3G網絡相對於其餘三家也要遜色很多,所以,用戶能夠買帳購買G1,可否體驗到最佳的3G網絡服務則要另當別論了! 3、運營商仍然可以影響到Android手機  在國內市場,很多用戶對購得移動定製機不滿,感受所購的手機被人塗畫了廣告通常。這樣的狀況在國外市場一樣出現。Android手機的另外一發售運營商Sprint就將在其機型中內置其手機商店程序。 4、同類機型用戶減小  在很多手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟件資源。而對於Android平臺手機,因爲廠商豐富,產品類型多樣,這樣使用同一款機型的用戶愈來愈少,缺乏統一機型的程序強化。舉個稍顯不當的例子,如今山寨機氾濫,品種各異,就不多有專門針對某個型號山寨機的討論和羣組,除了哪些功能異常搶眼、頗受追捧的機型之外。 5、過度依賴開發商缺乏標準配置  在使用PC端的Windows Xp系統的時候,都會內置微軟Windows Media Player這樣一個瀏覽器程序,用戶能夠選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用默認的程序一樣能夠應付多樣的須要。在 Android平臺中,因爲其開放性,軟件更多依賴第三方廠商,好比Android系統的SDK中就沒有內置音樂 播放器,所有依賴第三方開發,缺乏了產品的統一性。 52. 什麼是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。這種實踐須要應用到全部顯示用戶界面的線程,由於他們都面臨着一樣的超時問題。  53. 什麼狀況會致使Force Close ?如何避免?可否捕獲致使其的異常?    答:通常像空指針啊,能夠看起logcat,而後對應到程序中 來解決錯誤  54. Android自己的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會致使什麼問題?如何解決?  55. 簡要解釋一下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文件中聲明的。  56.  IntentService有何優勢?    答:IntentService 的好處    * Acitivity的進程,當處理Intent的時候,會產生一個對應的Service    * Android的進程處理器如今會盡量的不kill掉你    * 很是容易使用  57. 橫豎屏切換時候activity的生命週期?    一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次    二、設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次    三、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法  如何將SQLite數據庫(dictionary.db文件)與apk文件一塊兒發佈?    解答:能夠將dictionary.db文件複製到Eclipse Android工程中的res aw目錄中。全部在res aw目錄中的文件不會被壓縮,這樣能夠直接提取該目錄中的文件。能夠將dictionary.db文件複製到res aw目錄中  58. 如何將打開res aw目錄中的數據庫文件?    解答:在Android中不能直接打開res aw目錄中的數據庫文件,而須要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,而後再打開該數據庫文件。複製的基本方法是使用getResources().openRawResource方法得到res aw目錄中資源的 InputStream對象,而後將該InputStream對象中的數據寫入其餘的目錄中相應文件中。在Android SDK中能夠使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。  59. Android引入廣播機制的用意?    答:a:從MVC的角度考慮(應用程序內)   其實回答這個問題的時候還能夠這樣問,android爲何要有那4大組件,如今的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大組件本質上就是爲了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制能夠方便幾大組件的信息和數據交互。    b:程序間互通消息(例如在本身的應用程序內監聽系統來電)    c:效率上(參考UDP的廣播協議在局域網的方便性)    d:設計模式上(反轉控制的一種應用,相似監聽者模式) 60. Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念    DVM指dalivk的虛擬機。每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每個DVM都是在Linux 中的一個進程,因此說能夠認爲是同一個概念。  61. sim卡的EF 文件有何做用    sim卡的文件系統有本身規範,主要是爲了和手機通信,sim本 身能夠有本身的操做系統,EF就是做存儲並和手機通信用的  62. 嵌入式操做系統內存管理有哪幾種, 各有何特性    頁式,段式,段頁,用到了MMU,虛擬空間等技術  63.  什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎?    嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統。主要用於工業控制、 軍事設備、 航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時。  64. 一條最長的短信息約佔多少byte?    中文70(包括標點),英文160,160個字節。  65. android中的動畫有哪幾類,它們的特色和區別是什麼?    兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。  66. 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。  67. 說說mvc模式的原理,它在android中的運用   MVC(Model_view_contraller)」模型_視圖_控制器」。 MVC應用程序老是由這三個部分組成。Event(事件)致使Controller改變Model或View,或者同時改變二者。只要 Controller改變了Models的數據或者屬性,全部依賴的View都會自動更新。相似的,只要Contro  68. DDMS和TraceView的區別?  DDMS是一個程序執行查看器,在裏面能夠看見線程和堆棧等信息,TraceView是程序性能分析器 。 69. java中如何引用本地語言  能夠用JNI(java native interface  java 本地接口)接口 。 70. 談談Android的IPC(進程間通訊)機制  IPC是內部進程通訊的簡稱, 是共享"命名管道"的資源。Android中的IPC機制是爲了讓Activity和Service之間能夠隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通訊,相似於遠程方法調用,相似於C/S模式的訪問。經過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。 71. NDK是什麼 NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。 NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平臺等的差別,開發人員只需簡單的修改mk文件就能夠建立出so
相關文章
相關標籤/搜索