Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Andriod之132個最佳問題

Andriod之132個最佳問題

編輯:關於Android編程

1.常用的存儲方式有哪些?

(五種,說出哪五種,五種存儲方式什麼情況下用。)注意sharepreferes對象支持讀取不支持寫入,寫入引用Editor。

SQLite:

SQLite是一個輕量級的數據庫,支持基本SQL語法,是常被采用的一種數據存儲方式。Android為此數據庫提供了一個名為SQLiteDatabase的類,封裝了一些操作數據庫的API。

SharedPreference:

除SQLite數據庫外,另一種常用的數據存儲方式,其本質就是一個xml文件,常用於存儲較簡單的參數設置。

File:

即常說的文件(I/O)存儲方法,常用語存儲大數量的數據,但是缺點是更新數據將是一件困難的事情。

ContentProvider:

Android 系統中能實現所有應用程序共享的一種數據存儲方式,由於數據通常在各應用間的是互相私密的,所以此存儲方式較少使用,但是其又是必不可少的一種存儲方式。 例如音頻,視頻,圖片和通訊錄,一般都可以采用此種方式進行存儲。每個ContentProvider都會對外提供一個公共的URI(包裝成Uri對 象),如果應用程序有數據需要共享時,就需要使用ContentProvider為這些數據定義一個URI,然後其他的應用程序就通過 ContentProvider傳入這個URI來對數據進行操作。

網絡存儲:

從網絡讀取數據和寫入數據。Android提供了通過網絡來實現數據的存儲和獲取的方法。

我們可以調用WebService返回的數據或是解析HTTP協議實現網絡數據交互。

 

*2.安卓中動畫有幾類,他們的特點和區別?

兩種,一種是補間動畫,還有一種是幀動畫,幀動畫類似於放電影,通過播放已經排列放好的圖片來實現。

補間動畫的實現定義開始和結束,中間由系統計算得出效果有透明,位移,放大縮小等等。

自定義錄音或者進度條過程,會應用到幀動畫,補間動畫,一般用於應用的歡迎界面。

(菜單彈出,例如贊和評論,是個動畫過程。)

3.handler機制原理

Handler主要用於線程間的通信。

一個Handler允許發送和處理Message和Runable對象,UI主線程會自動分配一個Looper(消息輪詢器),每個Looper中封裝著MessageQueue(消息隊列),遵循先進先出原則。Looper負責不斷的從自己的消息隊列裡取出隊頭的任務或消息執行。一般是在子線程執行完耗時操作之後,通過Handler的sendMessage或post方法將Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負責執行他們(用到handleMessage方法,主要執行刷新UI的代碼)。
其中Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域。

 

字面以外加上關聯點。

4除了handler和子線程,還有一個處理線程的是什麼,主要方法是什麼?

AsynTask,doInbackGround+onPostExecute

doInBackground()這個方法運行在後台線程中,主要負責執行那些很耗時的操作,如訪問網絡。該方法必須重寫。

onPostExecute(Result)這個方法運行於UI主線程,在doInBackground(Params…)方法執行後調用,該方法用於接收後台任務執行後返回的結果,刷新UI顯示

5.tcp和udp區別.

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務,傳輸數據前經過“三次握手”建立連接,保證數據傳輸的可靠性,但效率比較低。一般用於對於數據傳輸安全性較高的場合。

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議,面向無連接。UDP不提供可靠性,數據傳輸可能發生錯序,丟包,但效率較高。一般用於對於實時性要求較高的場合。

6線程之間的通信方式(如何避免ANR)

(1).AsyncTask,其中doInBackground()和onPostExecute(Result)兩個方法非常重要

doInBackground()這個方法運行在後台線程中,主要負責執行那些很耗時的操作,如訪問網絡。該方法必須重寫。

onPostExecute(Result)這個方法運行於UI主線程,在doInBackground(Params…)方法執行後調用,該方法用於接收後台任務執行後返回的結果,刷新UI顯示。

(2.)子線程+handler

在子線程中執行完耗時操作需要刷新UI時,通過handler.sendMessage()發消息給主線程,然後在主線程Handler中的handleMessage()方法中執行刷新UI操作

7.activity的生命周期

 

1).啟動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。

2).當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。

3).當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。

4).當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後台:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。

5).用戶後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。

6).當前Activity處於被覆蓋狀態或者後台不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。

7).用戶退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。

 

*8.ArrayList和LinkedList區別?

存數據,ArrayList數組存儲數據,索引值以下標來搜索,查詢比較方,刪除增加比較麻煩,但是linkedList以鏈表式存儲數據,對於增刪比較方便。

9.安卓內存的優化?*

1)靜態變量引起內存洩露

在代碼優化的過程中,我們需要對代碼中的靜態變量特別留意。靜態變量是類相關的變量, 它的生命周期是從這個類被聲明,到這個類徹底被垃圾回收器回收才會被銷毀。所以,一般情況下,靜態變量從所在的類被使用開始就要一直占用著內存空間,直到 程序退出。如果不注意,靜態變量引用了占用大量內存的資源,造成垃圾回收器無法對內存進行回收,就可能造成內存的浪費

2)使用Application的Context

在Android中,Application Context的生命周期和應用的生命周期一樣長,而不是取決於某個Activity的生命周期。如果想保持一個長期生命的對象,並且這個對象需要一個 Context,就可以使用Application對象。可以通過調用Context.getApplicationContext()方法或者 Activity.getApplication()方法來獲得Application對象。

3)及時關閉資源

Cursor是Android查詢數據後得到的一個管理數據集合的類。正常情況下,如 果我們沒有關閉它,系統會在回收它時進行關閉,但是這樣的效率特別低。如果查詢得到的數據量較小時還好,如果Cursor的數據量非常大,特別是如果裡面 有Blob信息時,就可能出現內存問題。所以一定要及時關閉Cursor。

4)使用Bitmap及時調用recycle()

前面的章節講過,在不使用Bitmap對象時,需要調用recycle()釋放內存,然後將它設置為null。雖然調用recycle()並不能保證立即釋放占用的內存,但是可以加速Bitmap的內存的釋放。

在代碼優化的過程中,如果發現某個Activity用到了Bitmap對象,卻沒有顯式的調用recycle()釋放內存,則需要分析代碼邏輯,增加相關代碼,在不再使用Bitmap以後調用recycle()釋放內存。

5)對Adapter進行優化

下面以構造ListView的BaseAdapter為例說明如何對Adapter進行優化。

軟引用和弱引用。

如果一個對象只具有軟引用,那麼如果內存空間足夠,垃圾回收器就不會回收它;如果內存 空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。軟引用可以和一個引用隊 列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

如果一個對象只具有弱引用,那麼在垃圾回收器線程掃描的過程中,一旦發現了只具有弱引 用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。弱 引用也可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與 之關聯 的引用隊列中。

弱引用與軟引用的根本區別在於:只具有弱引用的對象擁有更短暫的生命周期,可能隨時被回收。而只具有軟引用的對象只有當內存不夠的時候才被回收,在內存足夠的時候,通常不被回收。

UI優化

在Android應用開發過程中,屏幕上控件的布局代碼和程序的邏輯代碼通常是分開 的。界面的布局代碼是放在一個獨立的xml文件中的,這個文件裡面是樹型組織的,控制著頁面的布局。通常,在這個頁面中會用到很多控件,控件會用到很多的 資源。Android系統本身有很多的資源,包括各種各樣的字符串、圖片、動畫、樣式和布局等等,這些都可以在應用程序中直接使用。這樣做的好處很多,既 可以減少內存的使用,又可以減少部分工作量,也可以縮減程序安裝包的大小。

 

10.framgment生命周期?

 

oncreate,onstart,onrestart,onstop,onresume,ondestroy,onpause,onAttach,onCreateView,onDettach,onDestroyView;(和activity的生命周期比較,會更好)

MyFragment onAttach() 粘貼到activity上
MyFragment onCreate() fragment創建
MyFragment onCreateView() fragment創建自己的視圖

MainActivity onCreate()
MyFragment onActivityCreated() 可以處理fragment數據的初始化

MainActivity onStart()
MyFragment onStart()

MainActivity onResume()
MyFragment onResume()

按後退鍵
MyFragment onPause()
MainActivity onPause()

MyFragment onStop()
MainActivity onStop()

MyFragment onDestoryView() 銷毀掉自己的視圖
MyFragment onDestory()
MyFragment onDetach() 解除和activity的關系

MainActivity onDestory()

 

11·圖片異步加載怎麼做?

可定義圖片異步加載工具類,核心方式實現思路如下:

1.先從內存緩存(Map>中獲取圖片顯示

2.獲取不到的話從本地SD卡裡獲取並顯示

3.都獲取不到的話通過子線程從網絡加載圖片並保存到內存及SD卡中並通過handler顯示

12·service和Thread區別?

http://wenku.baidu.com/link?url=p-P0sCqgr7y1w-mkd-B8DIwpIppzEud9MCVtttYWp1AWAmfZEfLyqKYKvAJWtXE2N2X8WS4vNHutJRBaG_RAC9i1AwqY5Wh7Zh4s-XHixju

 

1).Thread:Thread是程序執行的最小單元,它是分配CPU的基本單位。可以用Thread來執行一些異步的操作。

2).Service:Service是android的一種機制,當它運行的時候如果是LocalService,那麼對應的Service是運行在主進程的main線程上的。如:onCreate,onStart這些函數在被系統調用的時候都是在主進程的main線程上運行的。如果是RemoteService,那麼對應的Service則是運行在獨立進程的main線程上

13·內存洩露如何解決?

http://wenku.baidu.com/view/03dc4b46b307e87100f69604.html

 

1)、數據庫的cursor沒有關閉

2)、構造adapter沒有使用緩存contentview

衍生的listview優化問題:減少創建View的對象,充分使用contentview,可以使用靜態類來處理優化getView的過程3、Bitmap對象不使用時采用recycle()釋放內存4、Activity中的對象生命周期大於Activity

3.)Bitmap對象不使用recycle()釋放內存

4.)Activity中的對象生命周期大於Activity;

內存洩露大多數都是由於相同的錯誤導致的,即:對Context擁有較長時間的引用。

避免Context相關的內存洩露,記住以下事情:

不要保留對Context-Activity長時間的引用(對Activity的引用的時候,必須確保擁有和Activity一樣的生命周期)

嘗試使用Context-Application來替代Context-Activity

如果你不想控制內部類的生命周期,應避免在Activity中使用非靜態的內部類,而應該使用靜態的內部類,並在其中創建一個對Activity的弱引用。這種情況的解決辦法是使用一個靜態的內部類,其中擁有對外部類的WeakReference,如同ViewRoot和它的Winner類那樣

GC(垃圾回收)不能解決內存洩露問題

 

 

14·MVC的使用?

mvc是model,view,controller的縮寫,mvc包含三個部分:

  l模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。

  l視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。

  l控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用用戶出發的相關事件,交給m哦得了處理。

  android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:

   1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這裡需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通信實現。

  2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程序就很容易被回收掉。

  3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。

15·常用的設計模式

單例設計模式

所謂單例設計模式簡單說就是無論程序如何運行,采用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟如下:

(1) 將采用單例設計模式的類的構造方法私有化(采用private修飾)。

(2) 在其內部產生該類的實例化對象,並將其封裝成private static類型。

(3) 定義一個靜態方法返回該類的實例。

工廠設計模式

程序在接口和子類之間加入了一個過渡端,通過此過渡端可以動態取得實現了共同接口的子類實例化對象

代理設計模式

指由一個代理主題來操作真實主題,真實主題執行具體的業務操作,而代理主題負責其他相關業務的處理。比如生活中的通過代理訪問網絡,客戶通過網絡代理連接網絡(具體業務),由代理服務器完成用戶權限和訪問限制等與上網相關的其他操作(相關業務)。

觀察者設計模式

所謂觀察者模式,舉個例子現在許多購房者都密切觀察者房價的變化,當房價變化時,所有購房者都能觀察到,以上的購房者屬於觀察者,這便是觀察者模式。

java中可以借助Observable類和Observer接口輕松實現以上功能。當然此種模式的實現也不僅僅局限於采用這兩個類。

適配器模式

如果一個類要實現一個具有很多抽象方法的接口,但是本身只需要實現接口中的部分方法便可以達成目的,所以此時就需要一個中間的過渡類,但此過渡類又不希望 直接使用,所以將此類定義為抽象類最為合適,再讓以後的子類直接繼承該抽象類便可選擇性的覆寫所需要的方法,而此抽象類便是適配器類。

策略模式 Strategy

策略模式定義一系列的算法,把它們一個個封裝起來,並且使它們可以相互替換。本模式使得算法的變化不會影響到使用算法的客戶。

策略模式將每一個算法封裝到一個具有公共接口的獨立類中,解除了客戶與具體算法的直接耦合,是客戶改變算法更為容易。

策略模式+簡單工廠+反射+配置文件可以組成更為靈活的方式。

 

16·面向對象的特征?

封裝

封裝最好理解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。

封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。

繼承

面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。

多態

多態性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

實現多態,有二種方式,覆蓋,重載。

覆蓋,是指子類重新定義父類的虛函數的做法。

重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

 

17·程序結束的時候,如何處理Activity的?*

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

18·配置文件中存放什麼?

四大組件,意圖,權限,第三方key,版本號等

19·Final ,finally,finalized,區別;

final用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不

可繼承。

finally是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此

方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

 

20·NDK是什麼?

NDK 是 Native Development Kit 的簡稱。它是一個工具集,集成了 Android 的交叉編譯環境,並提供了一套比較方便的 Makefile ,可以幫助開發者快速開發 C 或是 C++ 的動態庫,並自動的將 so 和 java 程序打包成 apk ,在 Android 上運行。Android 上,應用程序的開發,大部分基於 Java 語言來實現。要使用 c 或是 c++ 的程序或庫,就需要使用 NDK 來實現。

 

21百度地圖和谷歌地圖的優缺點?

優勢:

1一打開百度地圖頁面,顯示的就是目前所在城市地圖,谷歌地圖不然。

2百度地圖的界面,百度地圖很多都是在顯眼位置用文字做提示,一目了然,谷歌界面有點炫,很多用圖標來表示,但是用起來相對復雜,不熟悉的用戶需要確定這個圖標是否是所需要選擇的。

而百度地圖搜索框下就直接有“公交”“駕車”的選項,界面簡潔直接很多,谷歌地圖需要點擊獲取路線,再點擊小圖標來選擇“公交”這些選項,而且圖標不夠引人注目,使用起來相對復雜些,試想一個很少用網絡地圖的人分別使用二者地圖,那個更方便呢?應該是百度,大多數用戶通過地圖是查詢位置-這個地方在哪,周圍有什麼地物,查詢路線-從一個方到另一個地方如何到達,用百度地圖,這些問題很容易解決,而用谷歌地圖得擺弄一會兒。

3百度地圖的查詢路線更好,首先還是界面更簡潔直接,然後是數據的問題,先不管為他們提供數據的公司如何,剛剛特意同時查了下,同樣地起點和終點, 百度地圖給出了5條路線,谷歌地圖給出的是4條路線,而且百度地圖路線的選擇時可以選擇“較快捷”“少換乘”“少步行”三種方式,更方便。打車費用也直接 顯示出來,而且個人體會10元內的打車費用基本正確。

4百度地圖有個視野內搜索功能,可以很方便地查找到目標位置,谷歌地圖沒有。這個很重要。

5一個重要界面布局問題,百度地圖是地圖視野在左,而谷歌地圖是地圖視野在右,我們現在時喜歡從左到右看東西啊,這點百度地圖更符合用戶習慣。 (當然也可能是我常用百度地圖,所以這麼覺得)

PS:剛在知乎上有朋友說到——因“左圖右列表”強調的是“地圖”,反之強調的是“搜索”;我們發現用戶在經過這麼些年的教育後,“不在乎”地圖在哪邊,相對其它體驗,這一點影響用戶選擇服務的權重並不高。

6百度地圖已經和都市圈合作推出了部分城市如北京、上海、深圳、廣州的三維地圖,谷歌地圖沒有。

7百度地圖地圖視野上方有個截圖功能,可以直接拉框截圖,谷歌地圖沒有。

8以北京實時路況信息為例,直接輸入北京查詢,百度地圖顯示的是主城區的實時路況,而谷歌顯示的區域很大 ,包括了密雲、廊坊市了,但是實時路況信息還是顯示的主城區,顯示路況的彩色條就全擠在一起了,設計得不如百度好。

8使用百度的占大多數,經常可以聽到“百度一下啊”的話語。隨之帶來百度地圖的使用率也相對較高。

9百度地圖的地圖百寶箱、房產、天氣等信息。

劣勢:

1如果需要從網絡地圖上獲取數據的話,谷歌地圖完勝,而且還有谷歌地球在一旁輔助,如虎添翼,從網上各種各樣的谷歌地圖相關工具軟件就可以看出。

2路線查詢時輸入地點名稱卻有多個符合條件時,會給出一個下拉菜單給予選擇,同一地點谷歌地圖提供的數據精確到街道,而百度地圖精確到區。

3谷歌地圖可以將側邊欄隱藏起來,看到更大的地圖視野,而百度地圖是點擊全屏來顯示更大的視野,兩種切換方式比起來谷歌的更舒服。

4谷歌地圖有個分享鏈接功能,而且還提供“粘貼 HTML 以便嵌入到網站”這一功能,百度沒有。

5界面布局百度地圖更簡潔,但是色彩搭配上和畫面感上谷歌地圖更好。

6谷歌的品牌形象占優。

 

22·安卓的系統架構

http://wenku.baidu.com/view/3ef50eddd15abe23482f4d7e.html

 

應用層:使用Java語言進行開發的一些應用程序

應用框架曾:主要是谷歌發布的一些操作支持的類庫(API框架),開發人員可以使用這些類庫方便的進行程序開發,但是在開發時必須遵守框架的開發原則

系統運行庫層:當使用安卓框架層進行開發時,安卓操作系統會自動使用一些c/c++的庫文件來支持所使用的各個組件,使其可以更好的為程序服務;

Linux內核層:安卓操作系統主要是基於Linux內核,程序的安全性,驅動程序,進程管理等都由Linux內核提供。

23.listView優化

1)、convertView復用,對convetView進行判空,當convertView不為空時重復使用,為空則初始化,從而減少了很多不必要的View的創建

2)定義一個ViewHolder,封裝ListviewItem條目中所有的組件,將convetView的tag設置為ViewHolder,不為空時通過ViewHolder的屬性獲取對應組件即可

3)、當ListView加載數據量較大時可以采用分頁加載和圖片異步加載

24·安卓上安裝了多個浏覽器,能否指定頁面訪問;

通過直接發送URI把參數帶過去,或者通過Manifest裡的intentfilter的data屬性

25·簡述音樂播放的方式與區別?

1):MediaPlayer:主要用於播放音頻,可以播放視頻,但是一般不用其進行視頻播放。

2):SoundPool: 主要用播放一些短促的聲音片段,主要優勢是cpu資源占有量低,反應延遲小。

 

*26·工作中如何利用線程池的?】

Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

*27·onTouch和onTouchEvent區別?

1.onTouch方法:
onTouch方法是View的 OnTouchListener借口中定義的方法。
當一個View綁定了OnTouchLister後,當有touch事件觸發時,就會調用onTouch方法。
(當把手放到View上後,on Touch方法被一遍一遍地被調用)

2.onTouchEvent方法:
onTouchEvent方法是override 的Activity的方法。
重新了Activity的onTouchEvent方法後,當屏幕有touch事件時,此方法就會別調用。

 

28·JSON的結構?

json是一種輕量級的數據交換格式,

json簡單說就是對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構

1、對象:對象表示為“{}”擴起來的內容,數據結構為{key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為對象.key獲取屬性值,這個屬性值的類型可以是數字、字符串、數組、對象幾種。

2、數組:數組在json中是中括號“[]”擴起來的內容,數據結構為["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數字、字符串、數組、對象幾種。

經過對象、數組2種結構就可以組合成復雜的數據結構了。

29·SIM卡的EF文件有何作用?

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

30.最長的短信多長,多少個字節?

70個漢字,140個字節

31·&和&&的區別

一個位運算符,一個是邏輯運算符

32·Java的基本特征

封裝

封裝最好理解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。

封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。

繼承

面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。

多態

多態性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

實現多態,有二種方式,覆蓋,重載。

覆蓋,是指子類重新定義父類的虛函數的做法。

重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

 

33·注冊廣播的方式

android中,不同進程之間傳遞信息要用到廣播,可以有兩種方式來實現。
第一種方式:在Manifest.xml中注冊廣播,是一種比較推薦的方法,因為它不需要手動注銷廣播(如果廣播未注銷,程序退出時可能會出錯)。
具體實現在Manifest的application中添加:





上面兩個android:name分別是廣播名和廣播的動作(這裡的動作是表示系統啟動完成),如果要自己發送一個廣播,在代碼中為:
Intent i = new Intent("android.intent.action.BOOT_COMPLETED");
sendBroadcast(i);
這樣,廣播就發出去了,然後是接收。
接收可以新建一個類,繼承至BroadcastReceiver,也可以建一個BroadcastReceiver的實例,然後得寫onReceive方法,實現如下:
protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("android.intent.action.BOOT_COMPLETED")) {
//Do something
}
}
};

第二種方式,直接在代碼中實現,但需要手動注冊注銷,實現如下:
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");
registerReceiver(mEvtReceiver, filter); //這時注冊了一個recevier ,名為mEvtReceiver,然後同樣用上面的方法以重寫onReceiver,
最後在程序的onDestroy中要注銷廣播,實現如下:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}



Android系統中的廣播是廣泛用於應用程序之間通信的一種手段,它類似於事件處理機制,不同的地方就是廣播的處理是系統級別的事件處理過程(一般事件處理是控件級別的)。在此過程中仍然是離不開Intent對象,理解廣播事件的處理過程,靈活運用廣播處理機制,在關鍵之處往往能實現特別的效果,
在Android 中如果要發送一個廣播必須使用sendBroadCast 向系統發送對其感興趣的廣播接收器中。
使用廣播必須要有一個intent 對象必設置其action動作對象
使用廣播必須在配置文件中顯式的指明該廣播對象
每次接收廣播都會重新生成一個接收廣播的對象
在BroadCast 中盡量不要處理太多邏輯問題,建議復雜的邏輯交給Activity 或者 Service 去處理

34·異步和同步的區別?

同步:提交請求->等待服務器處理->處理完畢返回這個期間客戶端浏覽器不能干任何事異步:請求通過事件觸發->服務器處理(這是浏覽器仍然可以作其他事情)->處理完畢

*35·Afinal和XUtils的區別?

Xutils是基於Afinal的

xUtils 包含了很多實用的android工具。

xUtils 源於Afinal框架,對Afinal進行了適當的精簡,和一些適度的擴展和重構。

xUtils 具有Afinal的一些特性如:無需考慮bitmap在android中加載的時候oom的問題和快速滑動的時候圖片加載位置錯位等問題; 簡潔,約定大於配置...

 

DbUtils模塊:android中的orm框架,一行代碼就可以進行增刪改查。

ViewUtils模塊:android中的ioc框架,完全注解方式就可以進行UI綁定和事件綁定。

HttpUtils模塊:支持同步,異步方式的請求,支持大文件上傳;支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD請求,支持multipart上傳設置subtype如related。

BitmapUtils模塊:加載bitmap的時候無需考慮bitmap加載過程中出現的oom和android容器快速滑動時候出 現的圖片錯位等現象;內存管理使用lru算法,更好的管理bitmap內存;可配置線程加載線程數量,緩存大小,緩存路徑,加載顯示動畫等...

 

36·ContentProvider的URI的配置?

清單文件之指定URI或者代碼裡面指定URI,contentProvider通過URI訪問數據

37·AIDL是什麼?

AIDL全稱AndroidInterfaceDefinitionLanguage(AndRoid接口描述語言)是一種借口描述語言;編譯器 可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程跨界對象訪問的目的.AIDL的IPC的機制和COM或CORBA類 似,是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值.如果要使用AIDL,需要完成2件事情:1.引入AIDL的相關類.;2.調用aidl產生的class.理論上,參數可以傳遞基本數據類型和String,還有就是Bundle的派生類

38·屏幕適配?

?最好可以通過權重(layout_weight)的方式來分配每個組件的大小,也可以通過具體的像素(dip)來確定大小。
盡量使用Relativelayout。
已知應用支持平台設備的分辨率,可以提供多個layout_320*480...
drawable-hdpi,drawable-mdpi,drawable-ldpi分別代表分辨率為480*800,360*480,240*360,放置圖片大小相差1.5倍
最後還需要在AndroidManifest.xml裡添加下面一段,沒有這一段自適應就不能實現:
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity="true"/>
在標簽和標簽之間添加上面那段代碼。即可。
備注:三者的解析度不一樣,就像你把電腦的分辨率調低,圖片會變大一樣,反之分辨率高,圖片縮小
還可以通過.9.png實現圖片的自適應

 

 

39·版本更新?數據庫的更新?跨版本?

版本:

在清單文件更改版本號,上傳更新的應用到平台,利用平台的更新提醒用戶是否更新新版本。

數據庫更新:

先更改版本號,在onupgress方法內判斷版本號是否一致,不一致則更新數據庫。

40·安卓自定義組件?

Android自定義組件有三種實現思路:

1) 繼承某個現有組件,在其基礎上添加額外功能,如繼承Gallery實現CoverFlow效果

2) 復合型組件定義: 繼承某個Layout,實現復合組件自定義,如TextView和EditText組合實現登錄注冊組件

3) 繼承View,實現onDraw()方法,實現自己繪制組件,如翻頁效果組件

*41.listview分頁加載的步驟

通常實現分頁加載有兩種方式,一種是在ListView底部設置一個按鈕,用戶點

擊即加載。另一種是當用戶滑動到底部時自動加載。

在ListView底部設置一個按鈕,用戶點擊即加載實現思路:

// 加上底部View,注意要放在setAdapter方法前

ListView.addFooterView(moreView);

bt.setOnClickListener(new OnClickListener() {

 

@Override

public void onClick(View v) {

pg.setVisibility(View.VISIBLE);// 將進度條可見

bt.setVisibility(View.GONE);// 按鈕不可見

 

handler.postDelayed(new Runnable() {

 

@Override

public void run() {

loadMoreDate();// 加載更多數據

bt.setVisibility(View.VISIBLE);

pg.setVisibility(View.GONE);

mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新數據

}

 

}, 2000);

}

});

當用戶滑動到底部時自動加載實現思路: 實現OnScrollListener 接口重寫

onScrollStateChanged 和onScroll方法,使用onscroll方法實現”滑動“後處理檢查是否還有新的記錄,如果有,添加記錄到adapter, adapter調用 notifyDataSetChanged 更新數據;如果沒有記錄了,則不再加載數據。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載.

 

42.移動互聯數據的交換格式

 

移動互聯數據交互格式有XML和JSON

1.JSON和XML的數據可讀性基本相同

2.JSON和XML同樣擁有豐富的解析手段

3.JSON相對於XML來講,數據的體積小

4.JSON與JavaScript的交互更加方便

5.JSON對數據的描述性比XML較差

6.JSON的速度要遠遠快於XML

 

 

 

 

 

 

 

 

43.xmpp的底層是怎樣實現的?

socket,雙廣播,連接廣播和通知光爆

 

 

*44.Activity的啟動模式(四種)

Standard、singleTop、singleTask、singleInstance

standard
默認模式,可以不用寫配置。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。

singleTop
可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。

singleTask
只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
如果是在別的應用程序中啟動它,則會新建一個task,並在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。

singleInstance
只有一個實例,並且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。

 

45.廣播機制的作用

廣播機制,本質上它就是一種組件間的通信方式,如果是兩個組件位於不同的進程當中,那麼可以用Binder機制來實現,如果兩個組件是在同一個進程中,那麼它們之間可以用來通信的方式就更多了,這樣看來,廣播機制似乎是多余的。然而,廣播機制卻是不可替代的,它和Binder機制不一樣的地方在於,廣播的發送者和接收者事先是不需要知道對方的存在的,這樣帶來的好處便是,系統的各個組件可以松耦合地組織在一起,這樣系統就具有高度的可擴展性,容易與其它系統進行集成。

實現思路:

在第1步中,廣播的接收者把廣播接收器注冊到ActivityManagerService中;在第2步中,廣播的發送者同樣是把廣播發送到ActivityManagerService中,由ActivityManagerService去查找注冊了這個廣播的接收者,然後把廣播分發給它們。

在第2步的分發的過程,其實就是把這個廣播轉換成一個消息,然後放入到接收器所在的線程消息隊列中去,最後就可以在消息循環中調用接收器的onReceive函數了。這裡有一個要非常注意的地方是,由於ActivityManagerService把這個廣播放進接收器所在的線程消息隊列後,就返回了,它不關心這個消息什麼時候會被處理,因此,對廣播的處理是異步的,即調用sendBroadcast時,這個函數不會等待這個廣播被處理完後才返回

實例連接:http://wenku.baidu.com/view/b73dd968af1ffc4ffe47ac0c.html

46.圖片輪播的實現思路

圖片輪播是由viewpage和handler兩者結合所實現的,

 

47.Sleep和wait的區別

1.這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object

類。

2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可

以使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池

等待,出讓系統資源,其他線程可以占用CPU。一般wait不會加時間限制,

因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用

notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系

統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到

只能調用interrupt()強行打斷。

3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而

sleep可以在任何地方使用

4. Sleep需要捕獲異常,而wait不需要

 

 

48.全局異常處理

Android使用UncaughtExceptionHandler捕獲全局異常

Android系統的“程序異常退出”,給應用的用戶體驗造成不良影響。為了捕獲應用運行時異常並給出友好提示,便可繼承UncaughtExceptionHandler類來處理。通過Thread.setDefaultUncaughtExceptionHandler()方法將異常處理類設置到線程上即可。
Demo下載地址:http://code.google.com/p/android-custom-view/downloads/list

 

*49.靜態變量合實例變量的區別

語法:靜態變量前要加static來修飾,而實例變量前則不加;

程序運行時的區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量;靜態變量不屬於某個實例對象,而是屬於類,所以也稱為類變量,靜態變量就會被分配空間,靜態變量就可以被使用了。

 

*50.listview失去焦點怎麼處理

在listview子布局裡面寫,可以解決焦點失去的問題

android:descendantFocusability="blocksDescendants"

 

 

*51.什麼是匿名內部類,在什麼時候調用

內部類:內部類可以是static的或者非static的,static內部類只能包含靜態方法和靜態類變量,只能訪問外部類的靜態元素,內部類可以實例化,多次使用。 匿名內部類:它只能使用一次,不區分static和非static。如果用到外部類的變量的話,必須是類變量或者實例變量,就是必須是類定義的變量,或者final的局部變量。匿名內部類如果是繼承某個類的話是可以重寫那個類的方法的,這個和普通內部類一樣。

1、實現事件監聽器的時候

2、用匿名內部類編碼非常簡潔,也容易讀懂,不重復利用時使用。

 

 

52.android中asset和raw的區別;

*res/raw和assets的相同點:

1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。


*res/raw和assets的不同點:

 

1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾

*讀取文件資源:

1.讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作

·InputStream is = getResources().openRawResource(R.id.filename);

2.讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作

·AssetManager am =null;

·am = getAssets();

·InputStream is = am.open("filename");

 

 

53.什麼是線程

線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標准的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建撤消另一個線程,同一進程中的多個線程之間可以並發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒阻塞運行三種基本狀態。每一個程序都至少有一個線程,那就是程序本身。

  線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程

 

 

*54.線程和進程的區別

進程是表示資源分配的基本單位,又是調度運行的基本單位。

線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。

線程的優點:

(1)易於調度。

(2)提高並發性。通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分。

(3)開銷少。創建線程比創建進程要快,所需開銷很少。。

(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行。

進程和線程的關系:

(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。

(3)處理機分給線程,即真正在處理機上運行的是線程。

(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

 

55.接口和抽象類的區別

abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用

abstract定義該類,即抽象類。

用interface修飾的類,裡面的方法都是抽象方法,因此在定義接口的時候,可以

直接不加那些修飾,系統會默認的添上去。接口裡面的字段都是公有常量,即

public static final修飾的字段。

 

 

56.xml有幾種解析方式、區別

基本的解析方式有三種: DOM,SAX,Pull

dom解析:解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後就可以使用DOM接口來操作這個樹結構。優點是對文檔增刪改查比較方便,缺點占用內存比較大。

sax解析:基於事件驅動型,優點占用內存少,解析速度快,缺點是只適合做文檔的讀取,不適合做文檔的增刪改,不能中途停止。

pull解析:同樣基於事件驅動型,android官方API提供,可隨時終止,調用next()方法提取它們(主動提取事件)

 

 

 

57.webview的輔助類

WebSettings、WebViewClient、WebChromeClient

WebSettings

設置WebView的一些屬性、狀態等,例如允許使用javascript,允許使用緩存,允許使用內置的縮放組件

setJavaScriptEnabled(true);設置支持js

 

WebViewClient

主要幫助WebView處理各種通知、請求事件(例如,點擊鏈接時候如何顯示界面,頁面開始加載,加載完畢之後有何動作等)

shouldOverrideUrlLoading() onPageStarted() onPageFinished()

 

WebChromeClient

輔助WebView處理Javascript的對話框、網站圖標、網站Title、加載進度等

核心方法有onJsAlert() onJsConfirm() onJsPrompt() onProgressChanged() onReceivedIcon()

onReceivedTitle()

 

 

 

58.w’ebview加載網頁的兩種方式

loadUrl(url)通過url地址加載互聯網或本地網頁

如:loadUrl("http://www.baidu.com");

loadUrl("file:///android_asset/html/index.html");

loadData(data,type,encoding)直接加載網頁內容,容易亂碼,一般用loadDataWithBaseURL代替

 

 

59.Intent可以被傳遞的數據類型

intent是連接Activity, Service, BroadcastReceiver, ContentProvider四大組件的信使,,可以傳遞八種基本數據類型以及string, Bundle類型,以及實現了Serializable或者Parcelable的類型。

Intent可以劃分成顯式意圖和隱式意圖。

顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。

隱式意圖:沒有明確指定組件名的Intent為隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。

 

 

60.攔截短信

短信其實是一個有序廣播

 

1:創建一個繼承BroadcastReceiver類的廣播接收器。

 

2:在清單文件中注冊廣播並在中設置優先級 priority(只要比你想攔截程序的短信接收器優先級高就可以了)

 

3:在onReceiver()中調用abortBroadcast()就可以了

 

61.Throws與Throw的區別

1.throw則是指拋出的一個具體的異常類型。

2.通常在一個方法(類)的聲明處通過throws聲明方法(類)可能拋出的異常信息,而在方法(類)內部通過throw聲明一個具體的異常信息。

3.throws通常不用顯示的捕獲異常,可由系統自動將所有捕獲的異常信息拋給上級方法;

throw則需要用戶自己捕獲相關的異常,而後在對其進行相關包裝,最後在將包裝後的異常信息拋出。

如果在方法中會有異常被拋出而你又不希望在這個方法體內對此異常進行處理,可以使用throws在聲明方法的時候同時聲明他可能會跑出的異常。

4.兩者位置不同.

 

 

 

62.Service是如何啟動

1通過startService
  Service會經歷onCreate->onStart
  stopService的時候直接onDestroy
  
  如果是調用者(TestServiceHolder)自己直接退出而沒有調用stopService的
  話,Service會一直在後台運行。
  下次TestServiceHolder再起來可以stopService。

 

2通過bindService
  Service只會運行onCreate,這個時候TestServiceHolder和TestService綁定在一起
  
  TestServiceHolder退出了,Srevice就會調用onUnbind->onDestroyed
  所謂綁定在一起就共存亡了。

 

63.android虛擬機的進程和linux的關系

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

 

64.程序運行的權限和文件系統權限的區別

運行時權限 Dalvik( android 授權) 文件系統 linux 內核授權

 

 

*65.訪問網絡如何加密

1:對稱加密(DES,AES)和非對稱(RSA公鑰與私鑰)。

(支付寶裡的商戶的公鑰和私鑰)

2:MD5(算法)

3:Base64

 

*66.訪問網絡都有哪兩種方式

get與post是兩種不同的提交方式

get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。

對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。

get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。

get安全性非常低,post安全性較高。

HTTP 定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST 僅用於更新站點。

 

 

 

67.一鍵退出的實現

定義一個類繼承Application,定義一個集合存放所有的activity,定義一個添

加的方法,再寫一個退出的方法,使用for循環全部調用finish方法,然後在每個

Activity的onCreate方法中調用自定義類裡的添加方法,然後在需要使用一鍵退出

的地方調用類中的退出方法即可。

 

 

 

*68.gc是什麼

GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

 

 

 

*69.listview的分頁加載

ListView分頁加載通常有兩種實現方式:一種是ListView底部設置一個按鈕,用戶點擊即加載;另一種是當用戶滑動到底部時自動加載。

在此說一下第一種方式點擊底部按鈕即加載的實現思路 :

通過addFooterView()方法為listview底部加入一個“加載更多”按鈕和加載進度的視圖,默認按鈕顯示,加載進度為gone。當用戶點擊“加載更多”按鈕時,按鈕設置為gone,加載進度顯示,並開啟子線程從網絡上加載下一頁數據,加載完畢,發消息給handler,再handler的handleMessage()方法中通過adapter的notifyDataSetChanged方法通知listview刷新,顯示剛加入的數據,並恢復按鈕顯示,加載進度隱藏。

 

 

 

70.w’eb’service的UDDI是什麼

UDDI是一種目錄服務,企業可以使用它對Web services進行注冊和搜索。UDDI,英文為"Universal Description, Discovery and Integration",可譯為“通用描述、發現與集成服務”。

 

 

71、webService中uddi是指什麼

UDDI是一種目錄服務,企業可以使用它對Web Service進行注冊和搜索。UDDI,英文為“Universal Description and Integration”,可譯為“通用描述、發現與集成服務”。

*72、說說java的反射機制原理以及應用場合

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有

屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態

獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

類對象: 封裝了類的描述信息的對象,類加載的產物,由jvm創建java.lang.Class

應用場景: Gson 序列化反序列化

 

獲取類對象的方式:1. 類名.class2. 類的對象.getClass()3. Class.forName("

包名.類名")

73、contentprovider怎麼實現數據共享

一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。

要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限。

如何通過一套標准及統一的接口獲取其他應用程序暴露的數據?

Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。

74、java有幾種引用類型

強引用,軟引用、弱引用、幽靈引用、

75、如何讓Activity變成一個窗口?

答:在清單文件AndroidManifest.xml中相應的標簽內設置屬性android:theme=”@android:style/The

76,啟動一個線程時run()還是start()

start()

77,ArrayList的便利

ArrayList al=new ArrayList();

for(int i=0;i<10;i++){

al.add(String.valueOf(i));

}

Iterator it=al.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

 

78、String,StringBuffer區別

 

JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,

即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個

StringBuffer類提供的字符串進行修改。

StringBuilder與StringBuffer的區別 。

StringBuffer

1,一個類似於 String 的字符串緩沖區,對它的修改不會像String那樣重創建對象。

2,使用append()方法修改Stringbuffer的值,使用toString()方法轉換為字符串。

Stringbuild是jdk1.5後用來替換stringBuffer的一個類,大多數時候可以替換

StringBuffer。和StringBuffer的區別在於Stringbuild是一個單線程使用的類,不值

執行線程同步所以比StringBuffer的速度快,效率高。

79、集合的實現類

HashSet:元素無需、不可重復;ArrayList:元素有序,可重復

HashMap以兼職對的形式伯村數據,key值可重復,value值不可重復

80、android中常用的布局

第一種:幀布局(框架布局)FrameLayout,在這個布局中,所有的子元素統統放於這塊區域的左上角,並且後面的子元素直接覆蓋在前面的子元素之上,將前面的子元素部分和全部遮擋。

第二種:線性布局LinearLayout,最常用的一種布局方式,所有子控件的對齊方式,取決於如何定義 orientation的屬性:vertical 垂直方向 ,如果按照這種方向所有的子控件將按照垂直的方式分布在布局上,每行只允許有一個子元素,horizontal水平方向 ,這時子控件將會以水平的方向分布在布局中。

第三種:絕對布局AbsoluteLayout,又可以叫做坐標布局,可以直接指定子元素的絕對位置,這種布局簡單直接,直觀性強,但是由於手機屏幕尺寸差別比較大,使用絕對定位的適應性會比較差。

第四種:相對布局RelativeLayout,允許子元素指定它們相對於其父元素或兄弟元素的位置,這是實際布局中最常用的布局方式之一。它靈活性大很多,當然屬性也多,操作難度也大,屬性之間產生沖突的的可能性也大,使用相對布局時要多做些測試。

第五種:表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一個TableRow布局對象,當然也可以是普通的View對象,TableRow裡每放一個元素就是一列,總列數由列數最多的那一行決定。

第六種:網格布局 GridLayout,在Android 4.0中,新引入的GridLayout網格布局,GridLayout布局使用虛細線將布局劃分為行,列和單元格,也支持一個控件在行,列上都有交錯排列。而GridLayout使用的其實是跟LinearLayout類似的API,只不過是修改了一下相關的標簽而已,所以對於開發者來說,掌握GridLayout還是很容易的事情。

81、char,varchar區別

1、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要占去10個字節的空間。

 

2、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什麼“+1”呢?這一個字節用於保存實際使用了多大的長度。

82.io流讀取輸出方法

文件讀取:

public static void main(String[] args) throws IOException

{

//創建一個文件讀取流對象,並初始化時指定名稱的文件相關聯。

//要保證此文件是已存在,如不存在會發生異常:FileNotFoundException

FileReader fr = new FileReader("demo.txt");

 

//調用讀取流對象的read方法。

//read方法一次只讀一個字符,而且會自動向下讀取。當讀取完後會返回-1.

int ch = 0;

while((ch = fr.read())!=-1)

System.out.print((char)ch);

fr.close();

}

*83,如何序列化

1). 實現序列化 Serializable

2). 屬性私有化,並提供get,set方法

3). 提供無參構造

4). 屬性名必須與json串中屬性名保持一致 (因為Gson解析json串底層用到了Java的反射原理)

84、如何在android中調用js

loadUrl("javascript:test()");

 

85、顯示intent隱士intent區別

對於明確指出了目標組件名稱的intent成為現實intent;對於沒有明確指出目標組件名稱的intent成為隱式intent。

86、廣播分為幾種

第一種:在清單文件中聲明,添加

第二種使用代碼進行注冊如:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

87、intent和activity的區別

Activity活動,可以理解為窗口,是人機交互的核心,所以又被人們說成是所有程序的根本。Intent意圖,負責所有Activity窗口通訊。Service服務是相對Activity來說的,不需要人機交互,但可以為Activity提供交互必需要的一些東西。

Android中,Activity是所有程序的根本,所有程序的流程都運行在Activity之中,Activity具有自己的生命周期. 由系統控制生命周期,程序無法改變,但可以用onSaveInstanceState保存其狀態對於Activity,關鍵是其生命周期的把握(如下圖),其次就是狀態的保存和恢復(onSaveInstanceState onRestoreInstanceState),以及Activity之間的跳轉和數據傳輸(intent)。

Intent

Android中提供了Intent機制來協助 應用間的交互與通訊,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對 應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent不僅可用於應用程序之間,也可用於應用程序內部的Activity/Service之間的交互。

 

 

88、android中經常用哪種數據庫

 

SharedPreference,存放較少的五種類型的數據,只能在同一個包內使

用,生成XML的格式存放在設備中

(2) SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫

(3) File文件,通過讀取寫入方式生成文件存放數據

(4) ContentProvider,主要用於讓其他應用程序使用保存的數據

(5)通過網絡獲取數據和寫入數據到網絡存儲空間

 

*89、ipc機制(及原理)

)IPC(Inter-Process Communication,進程間通信),

aidl是 Android Interface definition language的縮寫,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口.編譯器可以通過擴展名為aidl的文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的.

BroadcastReceiver也可以實現進程間通信

ContentProvider 提供進程間數據共享

2).Android的 Service工作流程

1.Android虛擬機啟動之前系統會先啟動service Manager進程;

2.service Manager打開binder驅動,並通知binder kernel驅動程序這個進程將作為System Service Manager;

3.然後該進程將進入一個循環,等待處理來自其他進程的數據。

4.用戶創建一個System service後,通過defaultServiceManager得到一個遠程ServiceManager的接口,通過這個接口我們可以調用addService函數將System service添加到Service Manager進程中;

5.然後client可以通過getService獲取到需要連接的目的Service的IBinder對象,這個IBinder是Service的BBinder在binder kernel的一個參考,

6.所以service IBinder 在binder kernel中不會存在相同的兩個IBinder對象,每一個Client進程同樣需要打開Binder驅動程序。對用戶程序而言,我們獲得這個對象就可以通過binder kernel訪問service對象中的方法。

7.Client與Service在不同的進程中,通過這種方式實現了類似線程間的遷移的通信方式,對用戶程序而言當調用Service返回的IBinder接口後,訪問Service中的方法就如同調用自己的函數。

 

90、八種基本數據類型

 

byte、short、int、long、float、double、char、boolean

91、上傳圖片怎麼做

用圖片異步加載通過開啟子線程實現

92、異常

答:編譯時異常: 程序正確,但因為外在的環境條件不滿足引發。例如:用戶錯

誤及I/O問題----程序試圖打開一個並不存在的遠程Socket端口。這不是程序本

身的邏輯錯誤,而很可能是遠程機器名字錯誤(用戶拼寫錯誤)。對商用軟件系統,

程序開發者必須考慮並處理這個問題。Java編譯器強制要求處理這類異常,如果

不捕獲這類異常,程序將不能被編譯。

運行期異常: 這意味著程序存在bug,如數組越界,0被除,入參不滿足規范.....

這類異常需要更改程序來避免,Java編譯器強制要求處理這類異常。

93、==equals區別

1、 ==是判斷兩個變量或實例是不是指向同一個內存空間

equals是判斷兩個變量或實例所指向的內存空間的值是不是相同

 

 

2、==是指對內存地址進行比較

equals()是對字符串的內容進行比較

 

3、==指引用是否相同

equals()指的是值是否相同

 

94 public,private,protect權限

public在任何情況下都可用;

protect可在當前類,同一個包中和子孫類中使用;

default:可在當前類和同一個包中使用

private只能在當前類中使用

95、HttpClient與HttpUrlConnection的區別

後者更為常用。HttpClient是個開源框架,封裝了訪問http的請求頭,參數,內容體,響應等等, HttpURLConnection是java的標准類,什麼都沒封裝,用起來太原始,不方便HttpClient實際上是對Java提供方法的一些封裝,在HttpURLConnection中的輸入輸出流操作,在這個接口中被統一封裝成了HttpPost(HttpGet)和HttpResponse,這樣,就減少了操作的繁瑣性。

 

96,json解析方式的兩種區別

1,SDK提供JSONArray,JSONObject

2,google提供的 Gson

通過fromJson()實現對象的反序列化(即將json串轉換為對象類型)

通過toJson()實現對象的序列化 (即將對象類型轉換為json串)

通過google提供的Gson解析json時,定義JavaBean的規則是什麼?

1). 實現序列化 Serializable

2). 屬性私有化,並提供get,set方法

3). 提供無參構造

4). 屬性名必須與json串中屬性名保持一致 (因為Gson解析json串底層用到了Java的反射原理)

*97、什麼時候用遞歸

樹用遞歸方便,用其它方法好像跟本不可能.

 

遞歸用在特定的函數如 f(x)= f(x-1) + 2

 

像這種情況,你想算出f(x)就必需算出f(x-1),而f(x)和f(x-1)實際上都是用共一個方法,只是參數相差一.這種時候用遞歸就很快.

*98、jdbc中怎麼處理事物

事務,也是數據庫事務,指的是作為單個邏輯工作單元執行的一系列操作。正常的情況下,操作應該順利進行,與操作相關的所有數據庫信息也成功地更新;

 

但是,如果在這一系列過程中任何一個環節出了差錯,導致操作失敗了,數據庫中所有信息都必須保持操作前的狀態不變。否則,數據庫的信息將會一片混亂而不可預測。

 

一個邏輯工作單元要稱為事務,必須滿足ACID(原子性,一致性,隔離性和持久性)

 

事務的結束只能有兩種形式:提交和回滾。操作完全成功則提交,產生永久性的修改;操作不完全成功則回滾,恢復到事務開始前的狀態。它們將結束一個事務。

 

(1)關閉自動提交事務。通過設置連接的自動提交事務屬性為false,

*99、android時間分發機制

當你點擊了某個控件,首先會去調用該控件所在布局的dispatchTouchEvent方法,然後在布局的dispatchTouchEvent方法中找到被點擊的相應控件,再去調用該控件的dispatchTouchEvent方法

100,static內部發出對非static的調用

不能調用

101.基於回調機制的處理以及監聽機制的處理

監聽機制的處理模型圖:

 

①直接使用匿名內部類,作為事件監聽器

ps:就是我們平時最常用的那種,setXxxListener後就重寫裡面的對應方法

通常都是臨時使用一次,復用性不高

②使用內部類作為事件監聽器

使用優點:可以在該類中復用,可直接訪問外部類的所有界面組件

③使用外部類作為事件監聽器

就是另外創建一個處理事件的Java文件,該形式比較少見

因為外部類不能直接訪問用戶界面類中的組件,要通過構造方法將組件傳入使用,

這樣的結果就是代碼不夠簡潔

④直接使用Activity作為事件監聽器

只需要讓Activity類實現~Listener事件監聽接口,在Activity中定義重寫對應的事件處理器方法

/kf/201403/287434.html

回調機制的處理:

Android平台中,每個View都有自己的處理事件的回調方法,通過重寫View中的這些回調方法來實現需要的響應事件。當某個事件沒有被任何一個View處理時,便會調用Activity中相應的回調方法。Android提供了以下回調方法供用戶使用:

1. onKeyDown:
功能:該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實現了該接口並重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。

2. onKeyUp:
功能:該方法同樣是接口KeyEvent.Callback中的一個抽象方法,並且所有的View同樣全部實現了該接口並重寫了該方法,onKeyUp方法用來捕捉手機鍵盤按鍵抬起的事件。

3. onTouchEvent:

功能:該方法在View類中的定義,並且所有的View子類全部重寫了該方法,應用程序可以通過該方法處理手機屏幕的觸摸事件。

4. onTrackBallEvent:
   功能: 接下來將介紹的是手機中軌跡球的處理方法onTrackBallEvent。所有的View同樣全部實現了該方法。

5.  onFocusChanged:
   功能: 前面介紹的各個方法都可以在View及Activity中重寫,接下來介紹的onFocusChanged卻只能在View中重寫。該方法是焦點改變的回調方法,當某個控件重寫了該方法後,當焦點發生變化時,會自動調用該方法來處理焦點改變的事件。

http://blog.csdn.net/liranke/article/details/6855601

102.UI中padding和margin的區別

Padding用來指定組件內的內容距離組件邊界的距離;

Margin用來指定控件與控件之間的距離

103.*View如何刷新

實現模式對話框的OnOk()函數,在其中添加下面的代碼就可以了:
((C***View)(AfxGetMainWnd()->GetActiveView()))->Invalidate();
其中C***View替換為你自己的View類的名字。
當然,調用Invalidate()只是按你的問題要求實現了刷新顯示而已,至於如何實現圖片大小的更新,仍需要其他代碼(比如在View類中添加代表圖片大小的成員變量,在OnDraw()中按照成員變量繪制圖片,在OnOK()中更新View成員變量的值)

104.*This和getApplicationContext ()的區別

getApplicationContext():生命周期是整個應用,應用摧毀,它才摧毀。

this:代表當前,在Activity當中就是代表當前的Activity,換句話說就是Activity.this在Activity當中可以縮寫為this.

105.*橫豎屏切換activity周期的變化

1、新建一個Activity並把各個生命周期打印出來

2、運行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

3、按crtl+f12切換成橫屏時

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

4、再按crtl+f12切換成豎屏時,打印信息如下

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

5、修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟3

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

6、再執行步驟4,發現不會再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->

7、把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只打印onConfigChanged

onConfigurationChanged-->

8、執行步驟4

onConfigurationChanged-->
onConfigurationChanged-->

總結:

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

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

3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

總結一下整個Activity的生命周期

補充一點,當前Activity產生事件彈出Toast和AlertDialog的時候

ActivityActivity的生命周期不會有改變運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume

Activity未被完全覆蓋只是失去焦點:onPause--->onResume

106.如何實現ViewPager

先在布局文件中調用v4包下的ViewPager,在java代碼中初始化ViewPager,並設置adapter(繼承PagerAdapter),再設置監聽onPageChangeListener

 

107.Sqlite中的事務如何實現

開啟事務:starttransaction
sql:…updateaccountsetmoney=money-500whereid=1;--檢驗隔離性
sql…updateaccountsetmoney=money+500whereid=2;
commit提交-驗證原子性、一致性

 

108.Android中常用的菜單以及區別

1、左右推出的Menu

使用方法:

一.首先導入SlidingMenu這個庫文件

二.在你的項目中引入SlidingMenu這個庫

eclipse中的流程:右擊你的項目 -- Properties -- Android -- Add 選擇SlidingMenu庫

三.在你的項目中使用這個SlidingMenu

配置設定方法中setMode() 是常用屬性有:

1)SlidingMenu.LEFT 左測菜單

2)SlidingMenu.RIGHT 右側菜單

3)SlidingMenu.LEFT_RIGHT 左右2測菜單

 

2、Path菜單

3、GridView菜單

4、popuwindow菜單

5、系統菜單

 

109.重載和重寫的區別

方法的重載屬於,編譯時多態,方法名相同參數列表不同,返回值必須相同或都沒有返回值類型。 方法的覆蓋屬於運行時多態,子類覆蓋父類的方法,子類指向父類引用,在調用方法的時候用父類的引用調用。

110.Set list map集合的特點

List接口元素有序可重復.

實現類有:ArrayList 數組實現輕量級,運行快,線程不安全。JDK1.2查詢快

Vector數組實現重量級,運行慢,線程安全。JDK1.0保證元素的無序唯一,自定義對象存進HashSet為了保證元素內容不重復需要覆蓋hashCode()與equals()方法。

SortedSet(不重要)元素有序(Unicode升序)唯一

LinkedList 鏈表實現常用語堆棧與隊列的實現增刪操作快

Set接口元素無序不可重復

實現類有:HashSet,底層用hashCode()算法實現,

TreeSet要求元素有序,自定義的對象需要實

現Comparable接口的compareTo(objecto)方法

Map(接口):與Collection接口無關,有一個子接口SortedMap特點:元素是key-value,key

唯一,無序;value可重復

實現類:HashMap輕量級線程不安全的,允許key或value為nullJDK1.2

HashTable重量級線程安全的不允許key或value為nullJDK1.0

Properties是HashTable的子類,主鍵和值都是字符串

SortedMap:(不重要)

特點:key唯一,有序(Unicode升序)

實現類:TreeMap

111.gradView上拉加載和下拉刷新怎麼實現

實現OnScrollListener接口重寫onScrollStateChanged和onScroll方法,使用onscroll方法實現”滑動“後處理檢查是否還有新的記錄,如果有,調用addFooterView,添加記錄到adapter,adapter調用notifyDataSetChanged更新數據;如果沒有記錄了,把自定義的mFooterView去掉。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載

 

112.用過哪些框架

XUtils AFinal 第三方開源框架

113.橫向scrollView和ViewPager之間的沖突

重寫ScrollView,

publicclassHomeFeatureLayoutextendsHorizontalScrollView{

privateArrayList items = null;

privateGestureDetectorgestureDetector;

View.OnTouchListenergestureListener;

privatestaticfinalintSWIPE_MIN_DISTANCE = 5;

privatestaticfinalintSWIPE_THRESHOLD_VELOCITY = 300;

privateintactiveFeature = 0;

 

publicHomeFeatureLayout(Contextcontext, ArrayList items){

super(context);

setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

setFadingEdgeLength(0);

this.setHorizontalScrollBarEnabled(false);

this.setVerticalScrollBarEnabled(false);

LinearLayoutinternalWrapper = newLinearLayout(context);

internalWrapper.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

internalWrapper.setOrientation(LinearLayout.HORIZONTAL);

addView(internalWrapper);

this.items = items;

for(inti = 0; i< items.size();i++){

LinearLayoutfeatureLayout = (LinearLayout) View.inflate(this.getContext(),R.layout.homefeature,null);

TextViewheader = (TextView) featureLayout.findViewById(R.id.featureheader);

ImageViewimage = (ImageView) featureLayout.findViewById(R.id.featureimage);

TextViewtitle = (TextView) featureLayout.findViewById(R.id.featuretitle);

title.setTag(items.get(i).GetLinkURL());

TextViewdate = (TextView) featureLayout.findViewById(R.id.featuredate);

header.setText("FEATURED");

ImagecachedImage = newImage(this.getContext(), items.get(i).GetImageURL());

image.setImageDrawable(cachedImage.getImage());

title.setText(items.get(i).GetTitle());

date.setText(items.get(i).GetDate());

internalWrapper.addView(featureLayout);

}

gestureDetector = newGestureDetector(newMyGestureDetector());

setOnTouchListener(newView.OnTouchListener() {

@Override

publicbooleanonTouch(Viewv, MotionEventevent) {

if(gestureDetector.onTouchEvent(event)) {

returntrue;

}

elseif(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL ){

intscrollX = getScrollX();

intfeatureWidth = getMeasuredWidth();

activeFeature = ((scrollX + (featureWidth/2))/featureWidth);

intscrollTo = activeFeature*featureWidth;

smoothScrollTo(scrollTo, 0);

returntrue;

}

else{

returnfalse;

}

}

});

}

 

classMyGestureDetectorextendsSimpleOnGestureListener{

@Override

publicbooleanonFling(MotionEvente1, MotionEvente2, floatvelocityX, floatvelocityY) {

try{

//right to left

if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

activeFeature = (activeFeature < (items.size() - 1))? activeFeature + 1:items.size() -1;

smoothScrollTo(activeFeature*getMeasuredWidth(), 0);

returntrue;

}

//left to right

elseif(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

activeFeature = (activeFeature > 0)? activeFeature - 1:0;

smoothScrollTo(activeFeature*getMeasuredWidth(), 0);

returntrue;

}

} catch(Exceptione) {

// nothing

}

returnfalse;

}

}

 

114.集合和數組的區別

1):數組在定義時必須定義長度,而集合在定義時不必定義長度。

2):數組在定義時必須要聲明數組的數據類型,而集合不必。但是一般情況下我們都是存儲統一數據類型的數據,我們可以使用泛型的寫法來限制集合裡面的數據類型。

115.什麼方法不能被重寫

被final修飾的方法,構造方法,

116.編譯時異常和運行時異常的區別

異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。

117.Gps定位和網絡定位的區別

GPS定位需設置權限android.permission.ACCESS_LOCATION_FINE

網絡定位需設置權限android.permission.ACCESS_LOCATION_COARSE

即GPS定位比網絡定位在精確度方面更精准,但在速度方面稍差一些,而且GPS定位適合在室外環境下使用,網絡定位在室內,室外都可以。

 

118.如何實現通訊錄的排序

 

119.Collection和Collections的區別
Collection是集合類的上級接口,繼承與他的接口主要有Set和List
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

Native是啥

120.Service實現的兩種方式

1.Context.startService()方式啟動

①Context.startService()方式的生命周期:啟動時,startService –> onCreate() –> onStart()停止時,stopService –> onDestroy()如果調用者直接退出而沒有停止Service,則Service 會一直在後台運行Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法附代碼

2.Context.bindService()方式啟動:①Context.bindService()方式的生命周期:綁定時,bindService -> onCreate() –> onBind()調用者退出了,即解綁定時,Srevice就會unbindService –>onUnbind() –> onDestory()Context.bindService()方式啟動 Service的方法:綁定Service需要三個參數:bindService(intent, conn, Service.BIND_AUTO_CREATE);第一個:Intent對象第二個:ServiceConnection對象,創建該對象要實現它的onServiceConnected()和onServiceDisconnected()來判斷連接成功或者是斷開連接第三個:如何創建Service,一般指定綁定的時候自動創建附代碼

 

121.手機上使用的傳感器有什麼

#define SENSOR_TYPE_ACCELEROMETER 1 //加速度

#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力

#define SENSOR_TYPE_ORIENTATION 3 //方向

#define SENSOR_TYPE_GYROSCOPE 4 //陀螺儀

#define SENSOR_TYPE_LIGHT 5 //光線感應

#define SENSOR_TYPE_PRESSURE 6 //壓力

#define SENSOR_TYPE_TEMPERATURE 7 //溫度

#define SENSOR_TYPE_PROXIMITY 8 //接近

#define SENSOR_TYPE_GRAVITY 9 //重力

#define SENSOR_TYPE_LINEAR_ACCELERATION 10//線性加速度

#define SENSOR_TYPE_ROTATION_VECTOR 11//旋轉矢量

 

122.SurfaceView實現的原理

SurfaceView,它擁有獨立的繪圖表面,即它不與其宿主窗口共享同一個繪圖表面。由於擁有獨立的繪圖表面,因此SurfaceView的UI就可以在一個獨立的線程中進行行繪制。又由於不占用主線程資源,SurfaceView一方面可以實現復雜而高效的UI,另一方面又不會導致用戶輸入得不到及時響應。

123.Int Integer的區別

int 是基本類型,直接存數值

 

  1.Java 中的數據類型分為基本數據類型和復雜數據類型

  int 是前者>>integer 是後者(也就是一個類)

  2.初始化時>>

  int i =1;

  Integer i= new Integer(1);(要把integer 當做一個類看)

  int 是基本數據類型(面向過程留下的痕跡,不過是對java的有益補充)

  Integer 是一個類,是int的擴展,定義了很多的轉換方法

  

類似的還有:float Float;double Double;string String等

 

124.Application類的作用

Application和Actovotu,Service一樣是android框架的一個系統組件,當android程序啟動時系統會創建一個 application對象,用來存儲系統的一些信息。通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己 的Application,也很簡單創建一個類繼承 Application並在manifest的application標簽中進行注冊(只需要給Application標簽增加個name屬性把自己的 Application的名字定入即可)。

android系統會為每個程序運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命周期是整個程序中最長的,它的生命周期就等於這個程序的生命周期。因為它是全局 的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,數據傳遞,數據共享 等,數據緩存等操作。

 

125.嵌入式操作系統

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

 

126.ViewFlipper和ViewPager的區別

1.ViewFilpper類繼承於ViewAnimator類。而ViewAnimator類繼承於FrameLayout。

查看ViewAnimator類的源碼可以看出此類的作用主要是為其中的View切換提供動畫效果。該類有如下幾個和動畫相關的方法。

2.ViewPager用於實現多頁面的切換效果,該類存在於Google的兼容包裡面,所以在引用時記得在BuilldPath中加入“android-support-v4.jar”

 

127.定義數組的幾種方式

nta[];//聲明未初始化
a=newint[10];//定義占用空間大小(10個int)
inta[]=newint[10];//聲明並定義大小(即分配了指定大小的空間)
inta[]={1,2,3};//聲明並初始化,占用空間大小是3個int。

 

 

128.知道哪幾種排序方式

冒泡

public static int[] doMaoPao(int[] in){

int temp;

int length = in.length;

for(int i = 0;i

for(int j=0;j

if(in[j]

temp = in[j+1];

in[j+1] = in[j];

in[j] = temp;

}

System.out.print("輸出j="+in[j]+" ");

System.out.println(" ");

System.out.print("輸出j+1= "+in[j+1]);

}

// System.out.print("i="+in[i]);

}

return in;

}

選擇

public static int[] doPaiXv(int[] in){

for(int i=0;i

int temp = 0;

for(int j=i+1;j

if(in[i]>in[j]){

temp = in[i];

in[i] = in[j];

in[j] = temp;

}

System.out.print("輸出j="+in[j]+" ");

System.out.println(" ");

System.out.print("輸出i= "+in[i]);

}

}

return in;

}

二分

public static void binary_sort(int a[]){

int i,j,temp;

int left,right,mid;

for(i = 1; i

left = 0;

right = i-1;

temp = a[i];

while(left <= right){

mid = (left + right) /2;

if(a[mid] > temp){

right = mid - 1;

}else{

left = mid + 1;

}

}

for(j=i-1; j>right; j--){

a[j+1] = a[j];

a[right+1] = temp;

}

}

}

public static void main(String[] args) {

int a[] = {2,6,9,8,4,7,3,1,0,5};

binary_sort(a);

for(int i=0;i

System.out.print(a[i]+ " ");

}

129.Doget和doPost的區別

通過get方式提交的數據有大小的限制,通常在1024字節左右。也就是說如果提交的數據很大,用get方法就可需要小心;而post方式沒有數據大小的限制,理論上傳送多少數據都可以。

通過get傳遞數據,實際上是將傳遞的數據按照”key,value”的方式跟在URL的後面來達到傳送的目的的;而post傳遞數據是通過http請求的附件進行的,在URL中並沒有明文顯示

 

130.什麼是API

API(ApplicationProgrammingInterface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節.
簡單來說,就是一套可供調用的系統接口.

131.常遇到的異常、如何解決

異常的繼承結構:

基類為Throwable,Error和Exception繼承Throwable,RuntimeException和IOException等繼承Exception,具體的RuntimeException繼承RuntimeException。

Error和RuntimeException及其子類成為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。

 

1、SQLException:操作數據庫異常類。

問題:當Java應用程序與數據庫進行溝通時如果產生了錯誤,就會觸發這個類。同時會將數據庫的錯誤信息通過這個類顯示給用戶。當用戶插入數據的時候,如果這個字段的值跟現有的紀錄重復了,違反了數據庫的唯一性約束,此時數據庫就會跑出一個異常信息。這個信息一般用戶可能看不到,因為其發生在數據庫層面的。此時這個操作數據庫異常類就會捕捉到數據庫的這個異常信息,並將這個異常信息傳遞到前台。如此的話,前台用戶就可以根據這個異常信息來分析發生錯誤的原因。

解決方案:檢查插入的數據是否重復。
2、ClassCastException:數據類型轉換異常。

問題:在Java應用程序中,有時候需要對數據類型進行轉換。這個轉換包括顯示的轉換與隱式的轉換。不過無論怎麼轉換,都必須要符合一個前提的條件,即數據類型的兼容性。在數據類型進行轉換之前,就保證數據類型的兼容性。如此的話,就不容易造成數據類型的轉換異常。如在只允許數值類型的字段中,可以設置不允許用戶輸入數值以外的字符。

解決方案:注意相應的組件在初始化的時候,是否相對應。
3、NumberFormatException:字符串轉換為數字類型時拋出的異常。

在數據類型轉換過程中,如果是字符型轉換為數字型過程中出現的問題,對於這個異常在Java程序中采用了一個獨立的異常,即NumberFormatException.如現在講字符型的數據“123456”轉換為數值型數據時,是允許的。但是如果字符型數據中包含了非數字型的字符,如123#56,此時轉換為數值型時就會出現異常。系統就會捕捉到這個異常,並進行處理。
解決方案:檢查數據是否正確。

 

4. java.lang.NullPointerException
(1).如果使用第三包的jar包,jar包中有錯誤

(2).沒有實例化組件

(3).沒有把Adapter和值綁定;

(4).當頁面中某個組件賦值為null時activity會出現錯誤,程序崩潰後其他頁面的數據就會被重新初始化

(5).用Intent傳值時,獲取的key不存在

(6).沒有賦初始值

5. java.lang.ClassNotFoundException  異常的解釋是"指定的類不存在"。
6. java.lang.ArithmeticException  這個異常的解釋是"數學運算異常",比如程序中出現了除以零這樣的運算就會出這樣的異常。
7. java.lang.ArrayIndexOutOfBoundsException
  異常的解釋是"數組下標越界",現在程序中大多都有對數組的操作,因此在調用數組的時候一定要認真檢查,看自己調用的下標是不是超出了數組的范圍,一般來說,顯示(即直接用常數當下標)調用不太容易出這樣的錯,但隱式(即用變量表示下標)調用就經常出錯了,還有一種情況,是程序中定義的數組的長度是通過某些特定方法決定的,不是事先聲明的,這個時候,最好先查看一下數組的length,以免出現這個異常。
8. java.lang.IllegalArgumentException

這個異常的解釋是"方法的參數錯誤",比如g.setColor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法調用中的參數傳遞是不是出現了錯誤。
9. java.lang.IllegalAccessException
  這個異常的解釋是"沒有訪問權限",當應用程序要調用一個類,但當前的方法即沒有對該類的訪問權限便會出現這個異常。對程序中用了Package的情況下要注意這個異常

10.安全異常:產生的原因是由於當前的設備不支持當前程序,這個是由於機型產生的問題,我們應該換一個設備進行測試,檢測當前程序存在什麼樣的異常;另一種原因是獲取激活的網絡信息實體類,需要添加權限,否則會出現此異常

解決辦法:在配置文件中,添加android_permission_Access_NetWork_State的權限

11. RejectExcuteException:一個異步任務只能執行一次,否則會報異常

一個線程最多能執行5個線程,超出則等待,否則會報拒絕執行的異常

解決辦法:使用子線程+handler來代替AsyncTask,或者一個線程中少添加幾個異步操作。

12. Out of memory:內存溢出是存放的數據過多導致內存不足的溢出事件

13. Memory leak:內存洩露是本應該釋放的資源沒有充分得到釋放,就繼續添加數據導致內存洩露事件;

 

Java應用程序中常見的異常類還有很多。如未找到相應類異常、不允許訪問某些類異常、文件已經結束異常、文件未找到異常、字段未找到異常等等。一般系統開發人員都可以根據這個異常名來判斷當前異常的類型。

 

ArithmeticException(除數為0的異常), BufferOverflowException(緩沖區上溢異常), BufferUnderflowException(緩沖區下溢異常), IndexOutOfBoundsException(出界異常), NullPointerException(空指針異常), EmptyStackException(空棧異常), IllegalArgumentException(不合法的參數異常), NegativeArraySizeException, NoSuchElementException, SecurityException, SystemException, UndeclaredThrowableException

 

 

132.常用的推送,並簡單介紹

並行的都包括:即時信息和空間協議(IMPP)、空間和即時信息協議(PRIM);

推送的實現原理:

XMPP是一種基於XML的協議,它繼承了在XML環境中靈活的發展性。因此,基於XMPP的應用具有超強的可擴展性。XMPP的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。所有從一個client到另一個client的jabber消息和數據都要xmpp server,client連接到server,server利用本地目錄系統的證書對其認證,client制定目標地址,讓server告知目標狀態,server查找,連接並進行相互認證,client間進行交互。

XMPP系統特點:

1)客戶機/服務器通信模式;(2)分布式網絡;(3)簡單的客戶端;(4)XML的數據格式。

通俗解釋:

其實XMPP 是一種很類似於http協議的一種數據傳輸協議,它的過程就如同“解包裝--〉包

裝”的過程,用戶只需要明白它接受的類型,並理解它返回的類型,就可以很好的利用xmpp來進行數據通訊。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved