android最全面試題71道題 詳解

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

Android面試題

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(多選)

      AArithmeticException 

      BIllegalArgumentException 

      CNullPointerException 

      DBufferUnderflowException 

  AArithmeticException     

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


      BIllegalArgumentException 

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


      CNullPointerException 

      DBufferUnderflowException (不明白,沒碰到過)

編碼問題導致java_BufferUnderflowException異常

公共類BufferUnderflowException的

延伸的RuntimeException

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



 

3.  Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). 

A11 ,-11   B11 ,-12   C12 ,-11   D12 ,-12

四捨五入 四和五是指正的45
-11.5 這麼看 -11.5 = -12 +0.5   ,0.5按四捨五入爲-12+1 = -11,所以Math.round(-11.5)==-11
           -0.5 = -1 + 0.5   0.5按四捨五入爲-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);
     }
     Atrue  Bfalse  C1  D011.activity

        &&(與)的優先級比||(或)高



5. 對一些資源以及狀態的操作保存,最好是保存在生命週期的哪個函數中進行(d)

   AonPause()  BonCreate()   C、 onResume()   DonStart()


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

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


6. Intent傳遞數據時,下列的數據類型哪些可以被傳遞(abcd(多選)

       ASerializable  Bcharsequence  CParcelable  DBundle


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)。(多選)

      AonCreateOptionsMenu() 

  BonCreateMenu()

  ConOptionsItemSelected()

  DonItemSelected()


 //當客戶點擊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

 ASALES表中qty列最小值大於等於30

 BSALES表中qty列最小值大於等於40

 CSALES表中qty列的數據全部爲50

 DSALES表中qty列最小值大於等於60


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

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

     AgetWriteableDatabase()

 BgetReadableDatabase()

 CgetDatabase()

 DgetAbleDatabase()

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)

       AonDestroy() 

       BonClear()

       ConFinish() 

       DonStop()

19. 下面退出Activity錯誤的方法是(c

       Afinish()

    B、拋異常強制退出

       CSystem.exit()  System.exit(0) 0是正常退出 
其他數字是表示不正常退出

       DonStop()

20. 下面屬於android的動畫分類的有(ab)(多項)

       ATween  BFrame CDraw DAnimation 


Android動畫模式

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


一種是frame by frame(畫面轉換動畫) 
XML中 JavaCode
translate TranslateAnimation
rotate RotateAnimation

21. 下面關於Android dvm的進程和Linux的進程,應用程序的進程說法正確的是(d)

        ADVMdalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,不一定擁有一個獨立 Dalvik虛擬機實例.而每一個DVM都是在Linux 中的一個進程,所以說可以認爲是同一個概念.

        BDVMdalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,不一定擁有一個獨立的Dalvik虛擬機實例.而每一個DVM不一定都是在Linux 中的一個進程,所以說不是一個概念.

        CDVMdalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立Dalvik虛擬機實例.而每一個DVM不一定都是在Linux 中的一個進程,所以說不是一個概念.

        DDVMdalivk的虛擬機.每一個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 平臺支持 開發的開端


Windows平臺下如何使用Android NDK

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

二.填空題

25.  android中常用的四個佈局是LinearLayout(線性佈局)、FrameLayout(單幀佈局)、RelativeLayout(相對佈局)和TableLayout(表格佈局)

26.  android 的四大組件是activityservicebroadcastContent Provider

27.  java.io包中的objectinputstreamobjectoutputstream類主要用於對對象(Object)的讀寫

28.  android service的實現方法是startservicebindservice

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)用戶點擊HomeActvity調用順序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() – Maybe
3)調用finish(), Activity調用順序如下
AAA --> onPause() --> onStop() --> onDestroy()
4)在Activity上顯示dialog, Activity調用順序如下
AAA
5)在父Activity上顯示透明的或非全屏的activityActivity調用順序如下
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?如何安全退出已調用多個ActivityApplication

對於單一Activity的應用來說,退出很簡單,直接finish()即可。
當然,也可以用killProcess()System.exit()這樣的方法。

但是,對於多Activity的應用來說,在打開多個Activity後,如果想在最後打開的Activity直接退出,上邊的方法都是沒有用的,因爲上邊的方法都是結束一個Activity而已。
當然,網上也有人說可以。
就好像有人問,在應用裏如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME即可,而事實上如果不修改framework,根本不可能做到這一點一樣。
所以,最好還是自己親自試一下。

那麼,有沒有辦法直接退出整個應用呢?
2.1之前,可以使用ActivityManagerrestartPackage方法。
它可以直接結束整個應用。在使用時需要權限android.permission.RESTART_PACKAGES
注意不要被它的名字迷惑。

可是,在2.2,這個方法失效了。
2.2添加了一個新的方法,killBackgroundProcesses(),需要權限 android.permission.KILL_BACKGROUND_PROCESSES
可惜的是,它和2.2restartPackage一樣,根本起不到應有的效果。

另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序的方法,forceStopPackage()
它需要權限android.permission.FORCE_STOP_PACKAGES
並且需要添加android:sharedUserId="android.uid.system"屬性
同樣可惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序無法調用。
因爲需要在Android.mk中添加LOCAL_CERTIFICATE := platform
Android.mk是用於在Android源碼下編譯程序用的。

從以上可以看出,在2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。

現提供幾個方法,供參考:

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

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

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

4、遞歸退出
在打開新的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中的serviceservice一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,

可以使用它開發如監控之類的程序。

一。步驟

第一步:繼承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. 請解釋下在單線程模型中MessageHandlerMessage QueueLooper之間的關係。

Handler簡介:
一個Handler允許你發送和處理MessageRunable對象,這些對象和一個線程的MessageQueue相關聯。每一個線程實例和一個單獨的線程以及該線程的MessageQueue相關聯。當你創建一個新的Handler時,它就和創建它的線程綁定在一起了。這裏,線程我們也可以理解爲線程的MessageQueue。從這一點上來看,HandlerMessageRunable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負責執行他們。

Handler有兩個主要的用途:(1)確定在將來的某個時間點執行一個或者一些MessageRunnable對象。(2)在其他線程(不是Handler綁定線程)中排入一些要執行的動作。

Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnablehandler綁定的線程上執行,也就是說不創建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動作讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時候執行他們,當然以一定的排序。sendMessage這個動作允許你把Message對象排成隊列,這些Message對象包含一些信息,HandlerhanlerMessage(Message)會處理這些Message.當然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。

posting或者sending到一個Hanler時,你可以有三種行爲:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精確的時間去處理。後兩者允許你實現timeout,tick,和基於時間的行爲。

當你的應用創建一個新的進程時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應用對象(像activities,broadcast receivers等)和主線程創建的窗體。你可以創建自己的線程,並通過一個Handler和主線程進行通信。這和之前一樣,通過postsendmessage來完成,差別在於在哪一個線程中執行這麼方法。在恰當的時候,給定的RunnableMessage將在HandlerMessageQueue中被Scheduled


Message簡介:
Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可以讓你在大多數情況下不用作分配的動作。
儘管Message的構造函數是public的,但是獲取Message實例的最好方法是調用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個。


MessageQueue簡介:
這是一個包含message列表的底層類。Looper負責分發這些messageMessages並不是直接加到一個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文件,在裏面我們自定義一個接口,含有方法getADT插件會在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服務就是將RemoteServiceID作爲intentaction參數。

      說明:如果我們單獨將RemoteService.aidl文件放在一個包裏,那個在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl文件和我們的其他類存放在一起,那麼我們在B工程中就要建立相應的包,以保證RmoteService.java文件的報名正確,我們不能修改RemoteService.java文件

           bindService(new Inten("net.blogjava.mobile.aidlservice.RemoteService"), serviceConnection, Context.BIND_AUTO_CREATE); 

       ServiceConnectiononServiceConnected(ComponentName name, IBinder service)方法中的service參數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的對象。

49. 請解釋下Android程序運行時權限與文件系統權限的區別。

運行時權限Dalvik( android授權

文件系統 linux 內核授權

50.  系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。

通過直接發送Uri把參數帶過去,或者通過manifest裏的intentfilter裏的data屬性

51. 你如何評價Android系統?優缺點。

答:Android平臺手機 5大優勢: 

一、開放性 

在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨着用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對於Android的發展而言,有利於積累人氣,這裏的人氣包括消費者和廠商,而對於消費者來講,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。

二、掙脫運營商的束縛 

在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什麼功能接入什麼網絡,幾乎都受到運營商的控制。從去年iPhone 上市 ,用戶可以更加方便地連接網絡,運營商的制約減少。隨着EDGEHSDPA這些2G3G移動網絡的逐步過渡和提升,手機隨意接入網絡已不是運營商口中的笑談,當你可以通過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?互聯網巨頭Google推動的Android終端天生就有網絡特色,將讓用戶離互聯網更近。

三、豐富的硬件選擇 

這一點還是與Android平臺的開放性相關,由於Android的開放性,衆多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,好比你從諾基亞 Symbian風格手機 一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯繫人等資料更是可以方便地轉移,是不是非常方便呢?

四、不受任何限制的開發商 

Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別緻的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和遊戲如可控制正是留給Android難題之一。

五、無縫結合的Google應用 

如今叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成爲連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

再說Android5大不足:

一、安全和隱私 

由於手機 與互聯網的緊密聯繫,個人隱私很難得到保守。除了上網過程中經意或不經意留下的個人足跡,Google這個巨人也時時站在你的身後,洞穿一切,因此,互聯網的深入將會帶來新一輪的隱私危機。

二、首先開賣Android手機的不是最大運營商 

衆所周知,T-Mobile23日,於美國紐約發佈 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&TVerizon,而目前所知取得Android手機銷售權的僅有 T-MobileSprint,其中T-Mobile3G網絡相對於其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗到最佳的3G網絡服務則要另當別論了!

三、運營商仍然能夠影響到Android手機 

在國內市場,不少用戶對購得移動定製機不滿,感覺所購的手機被人塗畫了廣告一般。這樣的情況在國外市場同樣出現。Android手機的另一發售運營商Sprint就將在其機型中內置其手機商店程序。

四、同類機型用戶減少 

在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟件資源。而對於Android平臺手機,由於廠商豐富,產品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統一機型的程序強化。舉個稍顯不當的例子,現在山寨機氾濫,品種各異,就很少有專門針對某個型號山寨機的討論和羣組,除了哪些功能異常搶眼、頗受追捧的機型以外。

五、過分依賴開發商缺少標準配置 

在使用PC端的Windows Xp系統的時候,都會內置微軟Windows Media Player這樣一個瀏覽器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用默認的程序同樣可以應付多樣的需要。在 Android平臺中,由於其開放性,軟件更多依賴第三方廠商,比如Android系統的SDK中就沒有內置音樂 播放器,全部依賴第三方開發,缺少了產品的統一性。

52. 什麼是ANR 如何避免它

  答:ANRApplication 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 filterserviceBroadcaseBroadcaseReceiver 

  答:一個activity呈現了一個用戶可以操作的可視化用戶界面 

  一個service不包含可見的用戶界面,而是在後臺無限地運行 

  可以連接到一個正在運行的服務中,連接後,可以通過服務中暴露出來的藉口與其進行通信 

  一個broadcast receiver是一個接收廣播消息並作出迴應的componentbroadcast receiver沒有界面 

  intent:content provider在接收到ContentResolver的請求時被激活。 

  activity, servicebroadcast receiver是被稱爲intents的異步消息激活的。 

一個intent是一個Intent對象,它保存了消息的內容。對於activityservice來說,它指定了請求的操作名稱和待操作數據的URI 

  Intent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。 

  它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個componentintent filter告訴androidcomponent能處理的intentintent filter也是在manifest文件中聲明的。 

56.  IntentService有何優點

  答:IntentService 的好處 

  * Acitivity的進程,當處理Intent的時候,會產生一個對應的Service 

  * Android的進程處理器現在會儘可能的不kill掉你 

  非常容易使用 

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

  1、不設置Activityandroid:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次 

  2、設置Activityandroid:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次 

  3、設置Activityandroid: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的進程應用程序的進程是否爲同一個概念 

  DVMdalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所以說可以認爲是同一個概念。 

61. sim卡的EF 文件有何作用 

  sim卡的文件系統有自己規範,主要是爲了和手機通訊,sim本 身可以有自己的操作系統,EF就是作存儲並和手機通訊用的 

62. 嵌入式操作系統內存管理有哪幾種, 各有何特性 

  頁式,段式,段頁,用到了MMU,虛擬空間等技術 

63.  什麼是嵌入式實時操作系統, Android 操作系統屬於實時操作系統嗎

  嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。主要用於工業控制、 軍事設備、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分爲軟實時和硬實時兩種,而android是基於linux內核的,因此屬於軟實時。 

64. 一條最長的短信息約佔多少byte? 

  中文70(包括標點),英文160160個字節。 

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;或者接收LooperMessage Queue取出)所送來的消息。 

  3) Message Queue(消息隊列):用來存放線程放入的消息。 

  4)線程:UI thread 通常就是main thread,而Android啓動程序時會替它建立一個Message Queue。 

67. 說說mvc模式的原理,它在android中的運用 

 MVC(Model_view_contraller)”模型_視圖_控制器。 MVC應用程序總是由這三個部分組成。Event(事件)導致Controller改變ModelView,或者同時改變兩者。只要 Controller改變了Models的數據或者屬性,所有依賴的View都會自動更新。類似的,只要Contro 

68. DDMSTraceView的區別? 

DDMS是一個程序執行查看器,在裏面可以看見線程和堆棧等信息,TraceView是程序性能分析器 。

69. java中如何引用本地語言 

可以用JNIjava native interface  java 本地接口)接口 。

70. 談談AndroidIPC(進程間通信)機制 

IPC是內部進程通信的簡稱, 是共享"命名管道"的資源。Android中的IPC機制是爲了讓ActivityService之間可以隨時的進行交互,故在Android中該機制,只適用於ActivityService之間的通信,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。

71. NDK是什麼

NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將sojava 應用打成apk包。

NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平臺等的差異,開發人員只需簡單的修改mk文件就可以創建出so

發佈了0 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章