1. 程式人生 > >整理一些常見的java及android面試題(2)

整理一些常見的java及android面試題(2)

               

1. 什麼是Activity?

四大元件之一,一般的,一個使用者互動介面對應一個activity, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 可以處理與窗體使用者互動的事件. 我開發常用的的有ListActivity  , PreferenceActivity 等…如果介面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.

2. 請描述一下Activity生命週期。

生命週期描述的是一個類 從建立(new出來)到死亡(垃圾回收)的過程中會執行的方法..在這個過程中 會針對不同的生命階段會呼叫不同的方法

Activity從建立到銷燬有多種狀態,從一種狀態到另一種狀態時會激發相應的回撥方法,這些回撥方法包括:oncreateondestroy onstop onstart onresume onpause 其實這些方法都是兩兩對應的,

onCreate建立與onDestroy銷燬;

onStart可見與onStop不可見;

onResume可編輯(即焦點)與onPause;

6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在什麼時候呼叫呢?答案就是:在ActivityonStop後,但是沒有被onDestroy,在再次啟動此Activity時就呼叫onRestart(而不再呼叫

onCreate)方法;如果被onDestroy了,則是呼叫onCreate方法。

最後講自己專案中的經驗,比如說客戶端每次進入某個介面的時候要重新整理列表,這個重新整理列表的操作 就放在onStart()的方法裡面.這樣保證每次使用者看到的資料都是最新的.

多媒體播放, 播放來電話. onStop() 視訊, 視訊聲音設定為0 , 記錄視訊播放的位子onStart() 根據儲存的狀態恢復現場

3.兩個Activity之間跳轉時必然會執行的是哪幾個方法。

一般情況比如說有兩個activity,分別叫A,B ,當在A裡面啟用B元件的時候,A會呼叫 onPause()方法,然後B呼叫onCreate() ,onStart(),OnResume() ,這個時候

B覆蓋了窗體, A會呼叫onStop()方法.  如果B呢 是個透明的,或者是對話方塊的樣式,就不會呼叫onStop()方法

4.橫豎屏切換時候Activity的生命週期。

這個生命週期跟清單檔案裡的配置有關係

1、不設定Activityandroid:configChanges時,切屏會重新呼叫各個生命週期

預設首先銷燬當前activity,然後重新載入

2、設定Activityandroid:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

5.你後臺的Activity被系統 回收怎麼辦?如果後臺的Activity由於某原因被系統回收可了,如何在被系統回收之前儲存當前狀態?

除了在棧頂的activity,其他的activity都有可能在記憶體不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.

protected voidonSaveInstanceState(Bundle outState) {

      super.onSaveInstanceState(outState);

      outState.putLong("id", 1234567890);

}

public void onCreate(BundlesavedInstanceState) {

//判斷savedInstanceState是不是空.

//如果不為空就取出來

       super.onCreate(savedInstanceState);

}

1、拋異常強制退出:

該方法通過拋異常,使程式Force Close

驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。

2、記錄開啟的Activity

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

3、傳送特定廣播:

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

4、遞迴退出

在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。

上面是網上的一些做法.

其實 可以通過 intentflag來實現..intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)啟用一個新的activity,然後在新的activityoncreate方法裡面 finish掉。

6. Activity怎麼和service繫結,怎麼在activity中啟動自己對應的service

bindService().  讓activity能夠訪問到 service裡面的方法

  構建一個intent物件,

Intent service = new Intent(this,MyService.class);

  通過bindService的方法去啟動一個服務,

 ServiceConnection 物件(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE

Services

7 .什麼是Service以及描述下它的生命週期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?

Service的生命週期中,被回撥的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBindonUnbind

通常有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。

1 通過startService ,Service會經歷 onCreate 到onStart,然後處於執行狀態,stopService的時候呼叫onDestroy方法。如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。

2 通過bindService,Service會執行onCreate,然後是呼叫onBind, 這個時候呼叫者和Service繫結在一起。呼叫者退出了,Srevice就會呼叫onUnbind->onDestroyed方法。所謂繫結在一起就共存亡了。呼叫者也可以通過呼叫unbindService方法來停止服務,這時候Srevice就會呼叫onUnbind->onDestroyed方法。

需要注意的是如果這幾個方法交織在一起的話,會出現什麼情況呢?

一個原則是Service的onCreate的方法只會被呼叫一次,就是你無論多少次的startService又bindService,Service只被建立一次。如果先是bind了,那麼start的時候就直接執行Service的onStart方法,如果先是start,那麼bind的時候就直接執行onBind方法.如果service執行期間呼叫了bindService,這時候再呼叫stopService的話,service是不會呼叫onDestroy方法的,service就stop不掉了,只能先UnbindService,再StopService。如果一個service通過startService 被start之後,多次呼叫startService 的話,service會多次呼叫onStart方法。多次呼叫stopService的話,service只會呼叫一次onDestroyed方法。如果一個service通過bindService被start之後,多次呼叫bindService的話,service只會呼叫一次onBind方法。多次呼叫unbindService的話會丟擲異常。

8.什麼時候使用Service

擁有service的程序具有較高的優先順序,官方文件告訴我們,Android系統會盡量保持擁有service的程序執行,只要在該service已經被啟動(start)或者客戶端連線(bindService)到它。當記憶體不足時,需要保持,擁有service的程序具有較高的優先順序。

1.如果service正在呼叫onCreate,  onStartCommand或者onDestory方法,那麼用於當前service的程序相當於前臺程序以避免被killed。

2.如果當前service已經被啟動(start),擁有它的程序則比那些使用者可見的程序優先順序低一些,但是比那些不可見的程序更重要,這就意味著service一般不會被killed.

3.如果客戶端已經連線到service(bindService),那麼擁有Service的程序則擁有最高的優先順序,可以認為service是可見的。

4.如果service可以使用startForeground(int, Notification)方法來將service設定為前臺狀態,那麼系統就認為是對使用者可見的,並不會在記憶體不足時killed。

如果有其他的應用元件作為Service,Activity等執行在相同的程序中,那麼將會增加該程序的重要性。

 1.Service的特點可以讓他在後臺一直執行,可以在service裡面建立執行緒去完成耗時的操作.

 2.Broadcast receiver捕獲到一個事件之後,可以起一個service來完成一個耗時的操作.

 3.遠端的service如果被啟動起來,可以被多次bind, 但不會重新create. 索愛手機X10i的人臉識別的service可以被相簿使用,可以被攝像機,照相機等程式使用.

9. 請介紹下Android的資料儲存方式

android的資料儲存的方式sharedpreference,檔案,SQlite,contentprovider,網路。

10.為什麼要用ContentProvider?它和sql的實現上有什麼差別?

遮蔽資料儲存的細節,對使用者透明,使用者只需要關心操作資料的uri就可以了

       不同app之間共享,操作資料

       Sql也有增刪改查的方法.

      但是contentprovider 還可以去增刪改查本地檔案11.談談UI中, Padding和Margin有什麼區別?

Padding文字對邊框,margin是控制元件對父窗體.

12.請解釋下Android程式執行時許可權與檔案系統許可權的區別。

檔案系統的許可權是linux許可權. 比如說sharedpreference裡面的Context.Mode.private  Context.Mode.world_read_able  Context.Mode_world_writeable  

13.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?

找到對應的瀏覽器的意圖,傳遞資料URI ,啟用這個意圖

14.android主執行緒的運用和理解  ui執行緒不能執行耗時的操作,

15.當啟動一個Activity並且新的Activity執行完後需要返回到啟動它的Activity來執行  的回撥函式是startActivityResult()

16. GC記憶體洩露 出現情況: 1.資料庫的cursor沒有關閉 2.構造adapter時,沒有使用快取contentview    衍生listview的優化問題-----減少建立view的物件,充分使用contentview,可以使用一靜態類來優化處理getview的過程/ 3.Bitmap物件不使用時採用recycle()釋放記憶體 4.activity中的物件的生命週期大於activity 除錯方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size] 

17、什麼是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。這種實踐需要應用到所有顯示使用者介面的執行緒,因為他們都面臨著同樣的超時問題。