java與Android知識點

Java基礎java

  1. 什麼是重載,什麼是重寫?有什麼區別? 重載(Overload): (1)Overloading是一個類中多態性的一種表現,讓類以統一的方式處理不一樣類型數據的一種手段。多個同名函數同時存在,具備不一樣的參數個數/類型。 (2)重載的時候,方法名要同樣,可是參數類型和個數不同,返回值類型能夠相同,也能夠不相同。沒法以返回型別做爲重載函數的區分標準。 重寫(Override): (1) 父類與子類之間的多態性,對父類的函數進行從新定義。即在子類中定義某方法與其父類有相同的名稱和參數。 (2)若子類中的方法與父類中的某一方法具備相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可以使用super關鍵字,該關鍵字引用了當前類的父類。
  2. 泛型T和?有什麼區別? a)先看個方法的代碼 public T getT(T arg){ return arg; } public List getT(List arg){ return new ArrayList(); } b) 經過兩個方法能夠看到,T和?均可以用於聲明泛型, 可是T能夠用來約束函數的返回值類型,而?不會約束返回值類型。在工做裏面使用T是更安全的。
  3. 使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變? 使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的。 例如,對於以下語句: final StringBuffer a=new StringBuffer("immutable"); 執行以下語句將報告編譯期錯誤: a=new StringBuffer(""); 可是,執行以下語句則能夠經過編譯: a.append(" broken!");
  4. String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有? 沒有。 由於String被設計成不可變(immutable)類,因此它的全部對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內容是 "Hello",而後咱們對s進行了+操做,那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"Hello world!",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。
  5. "=="和equals方法究竟有什麼區別? ==:操做符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操做符。 equals:方法是用於比較兩個獨立對象的內容是否相同,就比如去比較兩我的的長相是否相同,它比較的兩個對象是獨立的。 例如,對於下面的代碼: String a=new String("foo"); String b=new String("foo"); 兩條new語句建立了兩個對象,而後用a/b這兩個變量分別指向了其中一個對象,這是兩個不一樣的對象,它們的首地址是不一樣的,即a和b中存儲的數值是不相同的,因此,表達式a==b將返回false,而這兩個對象中的內容是相同的,因此,表達式a.equals(b)將返回true。 在實際開發中,咱們常常要比較傳遞進行來的字符串內容是否等,字符串的比較基本上都是使用equals方法。
  6. 什麼是Activity? 四大組件之一,用於顯示和用戶交互的界面 setContentView() ,// 要顯示的佈局 findViewById(R.id.textview);// 查找界面上的控件 button.setOnclickLinstener{ }

我開發經常使用的的有 FragmentActivitiy,ListActivity , PreferenceActivity 等… 若是多個界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity. 7. 請描述一下Activity 生命週期。 a、生命週期描述的是一個類 從建立(new出來)到死亡(垃圾回收)的過程當中會執行的方法.在這個過程當中 會針對不一樣的生命階段會調用不一樣的方法 b、Activity從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法,這些回調方法包括:onCreate onDestroy onStart onStop onResume onPause c、其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬; onStart可見與onStop不可見;onResume可編輯(即獲取焦點)與onPause; d、另外還有一個onRestart方法,在Activity被onStop後,可是沒有被onDestroy,在再次啓動此Activity時就調用onRestart(而再也不調用onCreate)方法; e、最後講在項目中的使用。好比說每次進入某個界面的時候都要看到最新的數據,這個刷新列表的操做 就放在onStart()的方法裏面.這樣保證每次用戶看到的數據都是最新的. 多媒體播放, 播放的時候來電話.在 onStop() 時中止視頻, 將視頻聲音設置爲0 , 記錄視頻播放的位置;在 onStart() 時根據保存的狀態恢復現場. 8. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。 a、通常狀況好比說有兩個activity,分別叫A,B ,當在A裏面激活B組件的時候, A 會調用 onPause()方法,而後B 調用onCreate() ,onStart(), OnResume() ,這個時候B覆蓋了窗體, A會調用onStop()方法.
b、若是B是個透明的界面,或者是對話框的樣式, 就不會調用onStop()方法。 9. 橫豎屏切換時候Activity的生命週期。 這個生命週期跟清單文件裏的配置有關係 不設置Activity的android:configChanges時,切屏會銷燬當前Activity,而後從新加載,從新調用各個生命週期。 設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行 onConfigurationChanged 方法linux

(橫豎屏切換的時候,若是有彈窗會被銷燬。-- 若是要在旋轉屏幕後保留對話框應該怎麼辦?) 10. 如何將一個Activity設置成窗口的樣式。 能夠設置activity的樣式爲對話框 android:theme="@android:style/Theme.Dialog" 11. 若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態?android

除了在棧頂的activity,其餘的activity都有可能在內存不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大. protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890); } public void onCreate(Bundle savedInstanceState) { // 判斷 savedInstanceState是否是空. // 若是不爲空就取出來 super.onCreate(savedInstanceState); } protected void onRestoreInstanceState(Bundle savedInstanceState) { }git

備用方案:切換到後臺的時候就先把數據保存,在切換到前臺的時候從新獲取數據恢復界面 12. 兩個Activity之間傳遞數據,除了intent,廣播接收者,content provider還有啥? 1)利用static靜態數據,public static成員變量 2)利用外部存儲的傳輸, 例如 File 文件存儲
SharedPreferences首選項
Sqlite 數據庫 (Activity間哪些方式傳遞數據?) 13. 如何退出Activity?如何安全退出已調用多個Activity的Application a、一般狀況用戶退出一個Activity只需按返回鍵,咱們寫代碼想退出activity直接調用finish()方法就行。 b、記錄打開的Activity: 每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。程序員

c、發送特定廣播: 在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。 d、遞歸退出 在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。 e、經過 intent的flag 來實現intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity。此時若是該任務棧中已經有該Activity,那麼系統會把這個Activity上面的全部Activity幹掉。其實至關於給Activity配置的啓動模式爲SingleTop。 14. service是否在main thread中執行, service裏面是否能執行耗時的操做? a、默認狀況, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面,service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 ) . 若是要執行耗時操做,須要開啓子線程執行 Thread.currentThread().getName(); b、特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,讓service在另外的進程中執行。獨立進程和當前應用主線程無關,能夠作任意的耗時操做。github

  1. 怎麼在啓動一個Activity時就啓動一個service? 在activity的onCreate()方法裏面 startService();
  2. 同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中? a、Singleinstance 運行在另外的單獨的任務棧裏面 b、在激活一個新的activity時候, 給Intent的flag添加FLAG_ACTIVITY_NEW_TASK,這個被激活的activity就會在新的task棧裏面 Intent intent = new Intent(A.this,B.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
  3. 怎麼在activity中啓動service? 啓動service有兩種方式 a、startService() 一旦被建立 調用着無關 無法使用service裏面的方法 b、bindService () 把service 與調用者綁定 ,若是調用者被銷燬, service會銷燬。bindService()方式啓動服務讓activity可以訪問到 service裏面的方法
  4. 描述下Service的生命週期。 Service有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不一樣的使用方法生命週期方法也不一樣。 a、非綁定模式:當第一次調用startService的時候執行的方法依次爲onCreate()、onStartCommand(),當Service關閉的時候調用onDestory方法。 b、綁定模式:第一次bindService()的時候,執行的方法爲onCreate()、onBind()解除綁定的時候會執行onUnbind()、onDestory()。 上面的兩種生命週期是在相對單純的模式下的情形。咱們在開發的過程當中還必須注意Service實例只會有一個,也就是說若是當前要啓動的Service已經存在了那麼就不會再次建立該Service,固然也不會調用onCreate()方法。 c、一個Service能夠被多個客戶進行綁定,只有全部的綁定對象都執行了onBind()方法後該Service纔會銷燬,不過若是有一個客戶執行了onStart()方法,那麼這個時候若是全部的bind客戶都執行了unBind()該Service也不會銷燬。(播放音樂時,播放界面要控制Service的音樂播放--bindService特性,退出音樂界面後音樂還要繼續播放--startService特性)
  5. 子線程不能代替service嗎? a、不能替代 b、 首先要確認一件事,Service做爲四大組件之一,是運行在主線程的,能夠直接顯示吐司,修改View等。若是要運行耗時操做,服務須要本身開啓子線程。 c、 只做爲後臺來理解的話,相比於線程,服務具有完善的生命週期,更方便隨時釋放資源。 d、 服務本身就有上下文(Context)對象,能夠保證上下文是正常可用的。線程須要從外部獲取上下文對象,在運行時沒法保證該對象沒有被系統銷燬。 e、在沒有界面存在的時候;只有子線程運行的進程是空進程,隨時可能被回收;只有服務運行的進程是服務進程,比較難被回收。
  6. 什麼是IntentService?有何優勢? a、普通的service,默認運行在ui main 主線程 b、IntentService是Sdk給咱們提供的方便的,帶有異步處理的service類, 它的OnHandleIntent() 方法在子線程運行,方便處理耗時的操做
  7. 何時使用Service? a、Service的特色可讓他在後臺一直運行,能夠建立線程去完成耗時的操做. b、Broadcast receiver生命週期較短,捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做. c、Service若是被啓動起來,能夠被屢次bind, 但不會從新create.在多個應用間共用一段代碼,節約系統資源。好比索愛手機X10i的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用. d、全部界面都已經關閉,須要在後臺監控數據的時候。 e、擁有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等運行在相同的進程中,那麼將會增長該進程的重要性。
  8. 請描述一下Intent 和 Intent Filter。 Android 中經過Intent 和IntentFilter能夠實現四大組件的調用與激活。 Intent能夠比做一封郵件,包含收件地址和具體的內容。其中消息「目的地」是必須的,而內容則是可選項。 Intent filter: 能夠理解爲郵箱…

這個分揀系統經過3個參數來識別 Action: 動做 view Category :額外的附加信息 Data: 數據uri或mimetyppe uri面試

若是咱們在啓動一個 Activity 時使用這樣的 Intent 對象: Intent intent =new Intent(); intent.setAction("cn.itcast.action"); 那麼全部的 Action 列表中包含了「cn.itcast.action」的 Activity 都將會匹配成功。 一個 Intent 能夠經過 URI 攜帶外部數據給目標組件。在 節點中,經過 節點匹配外部數據。mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。 若是在 Intent Filter 中指定了這些屬性,那麼只有全部的屬性都匹配成功時 URI 數據匹配纔會成功。好比註冊了 http協議的 Audio/Mp3 類型文件,那就不會有其餘的調用喚起當前Activity。 23. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面? 啓動一個界面有隱式意圖和顯式意圖兩種方式。 隱式意圖能夠啓動一個類型的界面,顯示意圖能夠啓動指定應用的指定界面。 這裏使用顯示意圖就能夠。 Intent intent = new Intent(); intent.setClassName(packageName, className); intent.seturi() 24. Intent傳遞數據時,能夠傳遞哪些類型數據? a、 數據的uri, intent.setData() intent.getData(); 數據的type,intent.setType(), intent.getType(); b、八大基本數據類型 Intent .putextra() intent.getextra(); c、可序列化對象。 (傳遞序列化對象時要生成新的對象,傳遞圖片的時候應該傳遞uri,不要直接傳遞bitmap對象。) 25. Serializable和Parcelable的區別 性能: a、Serializable在序列化的時候須要把對象先寫到磁盤上,致使性能較低。Parcelable序列化在內存裏處理,性能較高。谷歌推薦使用Parcelable類。 b、Parcelable不能使用在要將數據存儲在磁盤上的狀況。儘管Serializable效率低點,但在這種狀況下,只能使用Serializable 。算法

實現: a、Serializable 的實現,只須要繼承Serializable 便可。這只是給對象打了一個標記,系統會自動將其序列化。 b、Parcelabel 的實現,須要在類中添加一個靜態成員變量 CREATOR,這個變量須要繼承 Parcelable.Creator 接口。sql

  1. 請描述一下Broadcast Receiver。 a、手機使用時有不少事件沒法肯定何時會發生,好比電量變化,收到短信等,這個時候能夠經過註冊一個廣播接收者,等待系統發送廣播就能夠。 b、廣播分兩種 有序廣播 無序廣播 abortBroadcast(); c、具體使用有: 接收系統的廣播通知, 系統自帶了不少廣播,sd卡掛載,手機重啓,低電量,來電,來短信等…. 關閉全部的Activity 畫畫板生成圖片後,發送一個sd掛載的通知,通知系統的gallery去獲取到新的圖片. Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())); sendBroadcast(intent);數據庫

  2. BroadCastReceiver的生命週期 a、 廣播接收者的生命週期很是短暫的,在接收到廣播的時候建立,onReceive()方法結束以後銷燬; b、廣播接收者中不要作一些耗時的工做,不然會彈出Application No Response錯誤對話框; c、最好也不要在廣播接收者中建立子線程作耗時的工做,由於廣播接收者被銷燬後進程就成爲了空進程,很容易被系統殺掉; d、耗時的較長的工做最好放在服務中完成;

  3. 請介紹下Android的數據存儲方式。 a、文件 訪問權限. sdcard /。存儲圖片、序列化對象等 b、SharedPreference //shared_preps 。存儲設置信息。 c、數據庫 sqlite 。存儲大量的結構化數據。 d、網絡 socket tcp udp , http httpurlconnection。

  4. 爲何要用ContentProvider?它和sql的實現上有什麼差異? a、android 系統下 不一樣程序 數據 在data目錄的不一樣子文件下,默認是不能共享訪問 b、ContentProvider 是Android 提供的一個共享數據的類,而Sql 是一種操做數據庫的語言。 c、僅針對操做數據而言,ContentProvider屏蔽數據存儲的細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了 d、ContentProvider能夠實現不一樣app之間共享,操做數據 e、Sql也有增刪改查的方法. 可是sql只能查詢本應用下的數據庫。而contentprovider 還能夠去增刪改查本地文件. xml文件、網絡數據讀取更改

  5. 請介紹下ContentProvider是如何實現數據共享的。 a、建立一個MyProvider類繼承ContentProvider,並實現增刪改查方法 b、在清單文件裏註冊MyProvider類,註冊可以響應的Uri c、調用者獲取ContentResolver,並使用約定的uri執行增刪改查操做 ContentResolver resolver = getContentResolver(); resolver.query(uri, projection, selection, selectionArgs, sortOrder);} d、系統會自動找到MyProvider,並調用它的增刪改查方法

  6. 說說ContentProvider ContentResolver ContentObserver之間的關係 a、ContentProvider 內容提供者,用於封裝數據操做 b、ContentResolver 內容解析者,用於調用ContentProvider 處理數據 c、ContentObserver 內容監聽器,能夠監聽數據的狀態改變 d、能夠經過ContentResolver.registerContentObserver(uri,observer)監聽指定uri的消息。 e、使用ContentResolver.notifyChange(uri)發出消息,則正在監聽該uri的observer的onchange方法會被調用。

  7. 描述一下Fragment的生命週期

  8. Fragment和Activity之間的交互, Fragment和Fragment之間的交互 a、強耦合的方式:Activity自己就持有Fragment對象,能夠直接調用Fragment的函數。Fragment調用Activity的函數則麻煩一些,谷歌官方推薦在Fragment裏定義一個接口,而後Activity實現該接口。那麼在Fragment裏獲取到的Activity能夠強轉爲接口對象,Fragment調用接口裏的函數則能夠和Activity的交互。 b、弱耦合的方式:使用廣播接收者,在Activity和Fragment裏分別註冊廣播接收者,互相發送消息便可,這種方式不須要Activity和Fragment互相持有引用。 c、弱耦合的方式2:使用EventBus能夠達到和廣播相同的效果,同時因爲廣播的響應範圍是整個系統,而EventBus的做用範圍是應用內,因此效能更高。注意:回答這種方式的話須要瞭解EventBus的使用。

  9. 請介紹下Android中經常使用的五種佈局。 a、五大布局是:FrameLayout(幀佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局) b、FrameLayout 從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕.
    c、LinearLayout 線性佈局,這個東西,從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每個LinearLayout裏面又可分爲垂直佈局和水平佈局)。 d、AbsoluteLayout 絕對佈局用X,Y座標來指定元素的位置 android:layout_x="20px" android:layout_y="12px" 指定平板機型的遊戲開發、機頂盒開發中常常用到絕對佈局。 e、RelativeLayout 相對佈局可使用另外一個控件或者父窗體爲參照物,來肯定控件在界面上的位置。這種佈局能夠處理複雜的界面,比線性佈局的嵌套結構更節約內存和CPU。 f、TableLayout 表格佈局相似Html裏面的Table。每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity="" 。能夠用於oa 自動化 生成報表。目前基本被廢棄了。

  10. 談談UI中, Padding和Margin有什麼區別? Padding 是對控件的內容, margin是控件對父窗體.

  11. 描述JSON數據的Header和Body功能 a、JSON自己只是規定了數據格式,並無Header和Body的約定。此題考察的是面試者是否有工做經驗。 b、在正式的項目中,傳輸的JSON字符串會約定好傳遞一個header表明請求的異常狀態,此時body存放纔是正真的bean數據。相似下面的格式:

  12. 說明JSON和XML二者的特性 a、都是傳遞數據使用的格式化字符串 b、Json的格式比較精簡,XML的格式比較複雜,在移動領域裏爲了節約流量,大可能是使用json c、Xml有更強的擴展性,在一些特殊需求裏只能使用xml

  13. 請解析下面的JSON數組

a、 字符串能夠亂寫,json數組不能亂拼。這個數組的格式是錯誤的,item的數據格式不一致,根本就不是一個數組。 b、 工做裏遇到這種狀況時,應該要求服務端返回的數組內容格式統一,全部的item都包含name、uid、age。同時title應該是和數組平級的數據。 39. 請解釋下在單線程模型中Message、Handler、Message Queuen、Looper之間的關係。

  1. 對android主線程的運用和理解。 主線程,也就是UI線程,不能執行耗時的操做。四大組件都是在主線程運行。

  2. AIDL的全稱是什麼?如何工做? Android interface definition language (android接口定義語言) , 用來跨進程的訪問方法, 手機衛士 Itelephony 接口掛斷電話.

  3. 請解釋下Android程序運行時權限與文件系統權限的區別。 a、Android程序執行須要讀取到安全敏感項,好比耗電或者花錢。必需在androidmanifest.xml中聲明相關權限請求, 打電話,訪問網絡,獲取座標,讀寫sd卡,讀寫聯繫人等..安裝的時候會提示用戶。主要是給用戶看的。 b、文件系統的權限是linux權限. 也就是文件的可讀可寫可執行權限。主要是給程序員看的。(若是理解比較多,能夠拓展說一下:777本身 同組 其餘)

  4. Framework工做方式及原理,Activity是如何生成一個view的,機制是什麼。 a、 使用反射, 解析配置文件來獲取要使用的類和初始化屬性 b、 四大組件都有本身的生命週期,Framework經過調用不一樣的生命週期方法,管理四大組件的資源。 c、Activity建立一個view是經過 ondraw 畫出來的, 畫這個view以前,調用onmeasure方法來計算顯示的大小.

  5. 如何加載音樂、圖片、視頻信息,如何改善其效率。 a、Android提供mediascanner,mediaStore等類,掃描儲存卡里的數據, 音樂文件的信息都會存放到系統的數據庫表中,能夠經過MediaProvider獲取, b、改善顯示效率是個常見問題, 能夠從如下幾個方面做答, 分批加載數據, 延時加載數據, 合理使用緩存等.

  6. 要作一個儘量流暢的ListView,你平時在工做中如何進行優化的? a、複用convertView ,節約內存 b、使用ViewHolder ,節約cpu c、Item佈局最好使用相對佈局,層級越少越好,節約內存和Cpu。(使用hierarchyview工具查看優化。 ) d、item中有圖片時,異步加載 。避免阻塞主線程。 e、快速滑動時,不加載圖片。避免解析出來Bitmap卻不使用,浪費內存和CPU資源。 f、item中有圖片時,應對圖片進行適當壓縮 。節約內存。 g、實現數據的分頁加載。下降CPU和內存負載峯值。

  7. 如何在ScrollView中如何嵌入ListView 好比微博詳情界面,微博正文+評論列表。 a、一般狀況下咱們不會在ScrollView中嵌套ListView,可是若是面試官非讓我嵌套的話也是能夠的。 b、在ScrollView添加一個ListView會致使listview控件顯示不全,一般只會顯示一條,這是由於兩個控件的滾動事件衝突致使。因此須要經過listview中的item高度 * count去計算listview的顯示高度,從而使其完整展現。 C、這時listview的全部item都被建立出來,不存在convertview複用,佔用內存極高。工做裏不建議使用,通常是把微博正文放在listview的headerView裏,評論作爲列表部分。

  8. 如何實現讓ListView的條目顯示不同的佈局? a、 重寫BaseAdapter的getViewTypeCount()方法返回有幾種條目類型 b、 重寫BaseAdapter的getItemViewType(int position)方法,返回值指定position的條目是什麼類型的 c、在BaseAdapter的getView方法中根據當前position的條目類型去加載不一樣的View

  9. 啓動應用後,改變系統語言,應用的語言會改變麼? a、已經作了多國語言的話,會變 b、可是設置了android:configChanges="locale",則不會 在項目裏增長zh測試修改語言。能夠看到修改語言其實是界面重啓,從新加載資源。

  10. 啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別? a、區別是根據activity在manifest裏面的配置,這個activity可能會放在不一樣的task棧裏面。intent設置的flag flag_new_task 也會有影響。 b、好比,步驟一,在文件管理器裏打開一個文本或者圖片,按home鍵退出;步驟二,從桌面打開圖片app,能夠看到圖片app有本身的堆棧;步驟三,打開文件管理器。能夠看到圖片預覽界面在文件管理器的堆棧裏。

  11. Android程序與Java程序的區別? a、 Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt swing package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。 b、 android sdk 添加工具jar ,好比httpclient , pull ,opengl c、將Java 遊戲或者j2me程序移植到Android平臺的過程當中,後臺邏輯不須要修改,只要修改前臺的界面就能夠。

  12. Android中Task任務棧的分配。 a、首先咱們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 這意思就是說Task其實是一個Activity棧,一般用戶感覺的一個Application就是一個Task。從這個定義來看,Task跟Service或者其餘Components是沒有任何聯繫的,它只是針對Activity而言的。 b、Activity有不一樣的啓動模式, 能夠影響到task的分配 c、standard: 標準模式,一調用 startActivity()方法就會產生一個新的實例。 d、singleTop: 若是已經有一個實例位於 Activity 棧的頂部時, 就不產生新的實例, 而只是調用Activity 中的 newInstance()方法。若是不位於棧頂,會產生一個新的實例。 e、singleTask: 會在一個新的 task 中產生這個實例,之後每次調用都會使用這個,不會去產生 新的實例了。 f、singleInstance: 這個跟 singleTask 基本上是同樣, 只有一個區別: 在這個模式下的 Activity實例所處的 task 中,只能有這個 activity實例,不能有其餘的實例。

  13. dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念 a、每一個dvm虛擬機都是linux裏面的一個進程. b、dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面, c、三個進程不是一個概念,可是在使用中因爲一個dvm虛擬機就是一個linux進程,同時一個虛擬機只運行一個應用,因此也默認三者是同一個能夠統一使用。

  14. 如何判斷是否有SD卡? 配置文件中有sd卡的權限, 經過environment的靜態方法判斷 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED )

  15. 嵌入式操做系統內存管理有哪幾種, 各有何特性。 頁式,段式,段頁,等 …

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

  17. 談談對Android NDK的理解。 a、native develop kit 是一個交叉編譯的工具,能夠編譯c語言代碼,生成在手機上運行的.so文件,供java語言調用 b、通常在實時性要求高的應用裏使用ndk,好比遊戲, 圖形渲染, opencv (人臉識別) ,高清解碼等 c、反編譯C語言比Java困難,須要對核心源碼進行保密的時候也可使用NDK處理 d、咱們項目中那些地方用到了ndk, 好比手機影音、百度地圖

  18. Android系統中GC什麼狀況下會出現內存泄露呢? 內存溢出(OOM) a、Java 內存泄露的根本緣由就是 保存了不可能再被訪問的變量類型的引用 b、若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放。 c、要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用。典型的作法就是把對象數據成員設爲null或者從集合中移除該對象。 d、當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理。 e、若是出現大量的內存泄露,致使有內存被對象佔用不能釋放,最終致使內存耗盡沒法建立新的對象,就會出現內存溢出(OOM) Java帶垃圾回收的機制,爲何還會內存泄露呢? Vector v = new Vector(10);
    for (int i = 1; i < 100; i++) {
     Object o = new Object();   v.add(o);   o = null;
    }//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。

Handler h = new Handler(); 58. java中的soft reference是個什麼東西 a、StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收 b、SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存 c、WeekReference 在每次GC時都被回收 d、在之前的開發裏,圖片的緩存多數使用軟引用,保證內存不足時圖片可以及時被回收。在Android2.3版本以後軟引用的功能被修改成弱引用同樣,致使圖片老是要不斷從新加載,性能不好。新的圖片緩存實現都是LruCache機制。 59. 說說LruCache底層原理 a、LruCache使用一個LinkedHashMap簡單的實現內存的緩存,沒有軟引用,都是強引用。若是添加的數據大於設置的最大值,就刪除最早緩存的數據來調整內存。 b、經過構造方法初始化的maxSize值,它表示這個緩存的最大值是多少。通常都是可用的內存大小的八分之一, Runtime.getRuntime().maxMemory() / 8, c、插入圖片時首先會判斷插入後的size大小是否超過maxSize,若是超過了,就刪除最長時間未使用的緩存。這個操做將一直循環下去,直到size比maxSize小或者緩存爲空。 60. 如何避免oom異常 OOM內存溢出,想要避免OOM異常首先咱們要知道什麼狀況下會致使OOM異常。 a. 圖片過大致使OOM Android 中用bitmap時很容易內存溢出,好比報以下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。 解決方法: 方法1: 等比例縮小圖片

以上代碼能夠優化內存溢出,但它只是改變圖片大小,並不能完全解決內存溢出。 方法2:使用LruCache機制管理圖片。限制圖片的內存上限,並及時地進行recyle()操做 方法3:使用加載圖片框架處理圖片,如專業處理加載圖片的ImageLoader圖片加載框架。還有咱們學的XUtils的BitMapUtils來作處理。 b.界面切換致使oom 通常狀況下,開發中都會禁止橫屏的。由於若是是來回切換話,activity的生命週期會從新銷燬而後建立。 有時候咱們會發現這樣的問題,橫豎屏切換N次後 OOM了。 這種問題沒有固定的解決方法,可是咱們能夠從如下幾個方面下手分析。 一、看看頁面佈局當中有沒有大的圖片,好比背景圖之類的。 去除xml中相關設置,改在程序中設置背景圖(放在onCreate()方法中):

在Activity destory時注意,drawable.setCallback(null); 防止Activity得不到及時的釋放。
複製代碼

二、跟上面方法類似,直接把xml配置文件加載成view 再放到一個容器裏,而後直接調用 this.setContentView(View view);方法,避免xml的重複加載。 三、 在頁面切換時儘量少地重複執行一些代碼 好比:重複調用數據庫,反覆使用某些對象等等...... c.查詢數據庫沒有關閉cursor 程序中常常會進行查詢數據庫的操做,可是常常會有使用完畢Cursor後沒有關閉的狀況。若是咱們的查詢結果集比較小,對內存的消耗不容易被發現,只有在常時間大量操做的狀況下才會出現內存問題,這樣就會給之後的測試和問題排查帶來困難和風險。 d.構造Adapter沒有使用convertview 在使用ListView的時候一般會使用Adapter,那麼咱們應該儘量的使用ConvertView。 e、爲變量設置合適的做用範圍 儘可能小的變量做用範圍能夠保證變量儘快被回收,節約內存。 61. 根據本身的理解描述下Android數字簽名。 a、全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序 b、Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證 (對於網站而言,若是要證實本身是可信的,他們須要使用權威證書網站的證書) c、若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。 d、數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能 62. 什麼是ANR 如何避免它? a、在Android上,主線程使用來更新UI的,若是你的應用程序在主線程作耗時的操做,致使有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。 b、要避免這個問題能夠把耗時的操做放在子線程裏面完成, handler message,AsynTask , intentservice.等 63. android中的動畫有哪幾類,它們的特色和區別是什麼? 幀動畫, 補間動畫, 屬性動畫;  幀動畫(Frame Animation)通常用於圖片的切換,實現生成連續的gif圖效果  補間動畫(Tween Animation)分爲平移(Translate)、旋轉(Rotate)、縮放(Scale)、不透明度(Alpha);補間動畫只是改變了View的顯示效果  屬性動畫(Property Animation),Android3.0 (API11)及之後出現的功能,3.0以前的版本可以使用github第三方開源庫nineoldandroids.jar進行支持。支持對全部View能更新的屬性的動畫,如translationX水平平移, translationY豎直平移,alpha透明度, left左邊位置, rotation旋轉角度, scale縮放等,  屬性動畫不只能實現補間動畫的全部效果,並且是對view或任意對象的屬性的不斷進行的值操做。好比一個Button的位移,補間動畫只是重繪了view,並無真正的去改變Button的位置,點擊事件仍是停留在原來的位置,而屬性動畫就是在真正改變Button的位置; 64. 如何屏幕適配 Android的屏幕適配主要有五種方式: a、layout適配,根據不一樣的屏幕大小加載不一樣文件夾下的佈局文件圖片適配. b、權重適配,設置顯示比例。 c、根據不一樣屏幕大小使用不一樣文件夾下的圖片。使用9Patch圖片。 d、dimens.xml文件適配,根據不一樣的手機的密度加載不一樣文件夾下的dimens.xml e、java代碼適配 65. Emoji表情實現 a、使用SpannableString能夠把TextView或EditText的一部分文本替換爲圖片。 b、Span不只能夠在Textview、Edittext中把一部份內容設置爲圖片,還能夠設置一部份內容的樣式,如:字體、顏色、點擊事件等。

SpannableString spannableString = new SpannableString("0123456789"); Drawable icon = getResources().getDrawable(R.drawable.ic_launcher); ImageSpan span = new ImageSpan(icon); spannableString.setSpan(span,2,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 66. 自定義控件經常使用的方法 a、onMeasure方法:測量控件的大小 b、onLayout方法:對子View進行排版 c、onDraw方法:把控件畫出來 d、onTouch方法:處理觸摸事件 67. Android中touch事件的傳遞機制是怎樣的? a、Touch事件傳遞的相關API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent b、Touch事件相關的類有View、ViewGroup、Activity c、Touch事件會被封裝成MotionEvent對象,該對象封裝了手勢按下、移動、鬆開等動做 d、Touch事件一般從Activity#dispatchTouchEvent發出,只要沒有被消費,會一直按佈局層次往下傳遞,到最底層的View。 e、若是Touch事件傳遞到的每一個View都不消費事件,那麼Touch事件會反向向上傳遞,最終交由Activity#onTouchEvent處理. f、onInterceptTouchEvent爲ViewGroup特有,能夠攔截事件. g、Down事件到來時,若是一個View沒有消費該事件,那麼後續的MOVE/UP事件都不會再給它 68. 說說mvc模式的原理,它在android中的運用。 a、MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。 b、Android裏MVC模式的使用隨處均可以見到。最基本的就是控件對象,xml佈局文件,Activity類。以及數據集合,ListView,Adapter。 69. udp鏈接和TCP的不一樣之處,Socket是什麼? a、tcp確保數據安全,創建鏈接時有三次握手過程。面向鏈接流 b、udp 不關心數據是否達到,是否阻塞。面向無鏈接 c、畫面優先. tcp 流暢優先 udp d、協議只是一個文檔約定,Socket是Java語言裏對TCP/IP協議的實現 描述下這三次TCP對話的簡單過程: 主機A向主機B發出鏈接請求數據包:「我想給你發數據,能夠嗎?」,這是第一次對話; 主機B向主機A發送贊成鏈接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工做)的數據包:「能夠,你何時發?」,這是第二次對話; 主機A再發出一個數據包確認主機B的要求同步:「我如今就發,你接着吧!」,這是第三次對話。 三次「對話」的目的是使數據包的發送和接收同步,通過三次「對話」以後,主機A才向主機B正式發送數據。 70. 手寫一個單例模式,能不能保證使用時對象的惟一性 a、餓漢式和懶漢式的單例模式代碼處處都有,請自行查找學習 b、這兩種方法都不能保證使用時對象的惟一性。好比,當對象是可序列化的,保存對象到本地後,每次反序列化都是生成了一個新的對象。 c、最好的實現單例模式的方案爲,編寫一個包含單個元素的枚舉。程序員沒法本身new出枚舉對象,保證了只能有一個對象。同時枚舉的序列化機制也不會在反序列化時建立出新的對象,保證對象的惟一性。 71. 你知道推送的原理嗎?調用哪一個方法能夠接收消息,傳遞哪些參數呢? a、傳統獲取服務器數據使用的是pull模式,是客戶端向服務器請求數據。從客戶端發起鏈接請求,獲取到服務器數據後就關閉鏈接。當鏈接斷開後,服務器就會失去客戶端的地址,所以沒法主動向客戶端發送消息。 b、推送(push)是服務主動向客戶端發送數據。它的原理是保持一個長鏈接,當客戶端和服務器創建鏈接後再也不斷開,這樣服務器隨時有新消息均可以發送給客戶端。 c、至於如何獲取推送消息。因爲服務端傳來推送消息的時間是不肯定的,這裏只能等待推送SDK的回調,好比經過註冊監聽或者廣播接收者。不一樣的廠商的推送SDK可能會有不一樣的處理方案,以百度推送SDK來講,是經過廣播接收者獲取推送數據。

  1. 開發中都使用到哪些框架、平臺 EventBus(事件處理) JPush(推送平臺) 友盟(統計平臺) 有米(優米)(廣告平臺) 百度地圖 bmob(服務器平臺、短信驗證、郵箱驗證、第三方支付) 阿里雲OSS(雲存儲) ShareSDK(分享平臺、第三方登陸) Gson(解析json數據框架) imageLoader (圖片處理框架) zxing (二維碼掃描)
  2. 開發過程當中使用到哪些自定義控件 pull2RefreshListView 下拉刷新 LazyViewPager 只加載當前頁 SlidingMenu 側欄菜單 ToggleButton 滑動的開關
  3. android開發中怎麼去調試bug a、logcat b、斷點 debug c、從版本控制系統檢出代碼,查找出錯的提交。好比一個月前沒有的問題,忽然出現,能夠將代碼回退到一個月前,使用二分法檢查是哪一次提交的代碼致使出現問題。
  4. 寫10個簡單的linux命令 文件管理:ls mv rm cd mkdir 網絡管理:ping ifconfig 文件搜索、編輯:find grep vi cat 查看系統資源佔用:du df ps top
  5. JNI調用經常使用的兩個參數 JNIEnv *env, jobject javaThis
  6. ddms 和traceview的區別. a、 DDMS全稱daivilk debug manager system,是Android自帶的debug界面 b、TraceView是Android的性能分析工具,是DDMS組成的一部分

1.在應用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字"); 2.一樣在主activity的onStop方法中加入Debug.stopMethodTracing(); 3.同時要在AndroidManifest.xml文件中配置權限 3.從新編譯,安裝,啓動服務,測試完成取對應的traceview文件(adb pull /sdcard/xxxx.trace)。 4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應的應用便可。 78. 手寫算法 a、通常面試考察的都是計算機入門的基本算法,好比排序和查找,而且會要求在紙上手寫Java代碼或僞代碼。 b、排序最基礎的是冒泡排序。若是可使用快速排序,能夠認爲學習能力優秀。 c、查找最基礎的算法是有序數組的折半查找。 d、對於複雜的測試,好比讓現場寫一個自定義控件,能夠分析一下實現思路。 79. 項目如何向低版本兼容 a、樣式兼容: (1)使用兼容包中的樣式,如v7\v4 中的Compat 相關樣式。 (2)定義多個不一樣value文件夾,不一樣版本指定不一樣樣式。 b、佈局兼容: 定義多個不一樣layout-verson(verson爲版本數字) 的文件夾,不一樣版本指定不一樣的佈局文件。 c、高版本代碼兼容方式: (1)儘可能使用兼容包中的API,如getSupportActionBar, getSupportFragmentManager() 等。 (2)使用系統Version 來判斷,使低版本系統不能執行高版本代碼。同時使用 @TargetApi 來消除eclipse、AS 等工具報錯。 80. 介紹一下你的項目架構 架構是程序的骨架,肯定了整體的接口,要求具體的子類實現細節處理。並非非要用到反射、註解等高級技術才能叫架構。 a、界面架構 BaseActivity,BaseFragmen。拆解onCreate過程爲initView、initListener、initData b、網絡架構 三級網絡封裝 c、圖片、文件、數據庫等數據數據管理架構

相關文章
相關標籤/搜索