Android基礎知識一

1.常用的存儲方式有哪些?
(五種,說出哪五種,五種存儲方式什麼情況下用。)注意sharepreferes對象支持讀取不支持寫入,寫入引用Editor。
SQLite:
SQLite是一個輕量級的數據庫,支持基本SQL語法,是常被採用的一種數據存儲方式。Android爲此數據庫提供了一個名爲SQLiteDatabase的類,封裝了一些操作數據庫的API。
SharedPreference:
除SQLite數據庫外,另一種常用的數據存儲方式,其本質就是一個xml文件,常用於存儲較簡單的參數設置。
File:
即常說的文件(I/O)存儲方法,常用語存儲大數量的數據,但是缺點是更新數據將是一件困難的事情。
ContentProvider:
Android 系統中能實現所有應用程序共享的一種數據存儲方式,由於數據通常在各應用間的是互相私密的,所以此存儲方式較少使用,但是其又是必不可少的一種存儲方式。例如音頻,視頻,圖片和通訊錄,一般都可以採用此種方式進行存儲。每個ContentProvider都會對外提供一個公共的URI(包裝成Uri對 象),如果應用程序有數據需要共享時,就需要使用ContentProvider爲這些數據定義一個URI,然後其他的應用程序就通過 Content Provider傳入這個URI來對數據進行操作。
網絡存儲:
從網絡讀取數據和寫入數據。 Android提供了通過網絡來實現數據的存儲和獲取的方法。
我們可以調用WebService返回的數據或是解析HTTP協議實現網絡數據交互。
1:目前在國內網絡上的資料數據的存儲方式分別是: SQLite, SharedPreference, File, ContentProvider, 網絡存儲,但是,我去官方文檔查了一下,谷歌給的存儲方式分爲這五種:
1: Shared Preferences(以鍵值對的形式存儲私有的,簡單數據類型)
2: Internal Storage(內存存儲)(私有的數據存儲在設備的內存裏面)
3: External Storage(外部存儲)(將公共的數據存儲在SD卡里面)
4: SQLite Databases(數據庫存儲)(將數據存儲在私有的數據庫裏面)
(數據庫存儲包括SQLite和ContentProvider,其實ContentProvider的底層就是在操作數據庫)
5: Network Connection(網絡連接)(存儲數據在web端,在你自己的數據服務器上)
2.安卓中動畫有幾類,他們的特點和區別?
在國內的很多網站上動畫都分爲兩種:幀動畫和補間動畫,但是在安卓的官網上在3.0,又加入一種屬性動畫.也就是現在有3種動畫.
1: Property Animation(屬性動畫別加入在3.0)
2: View Animation (補間動畫分爲:透明,旋轉,位移,縮放)
注意:補間動畫是假動畫,比如一個位移從A移動到B,如果給他設置監聽事件,他的點擊區域永遠都在A,但是屬性動畫,如果給他設置點擊事件,同樣從A移動到B,他的點擊區域就在B.
3: Drawable Animation(幀動畫幀動畫類似於放電影,通過播放已經排列放好的圖片來實現。)
兩種,一種是補間動畫,還有一種是幀動畫,幀動畫類似於放電影,通過播放已經排列放好的圖片來實現。
補間動畫的實現定義開始和結束,中間由系統計算得出效果有透明,位移,放大縮小等等。
自定義錄音或者進度條過程,會應用到幀動畫,補間動畫,一般用於應用的歡迎界面。
(菜單彈出,例如贊和評論,是個動畫過程。)
3.handler機制原理
在安卓中有4大組件:activity,service,contentprovider,broadcastreceiver,這4大組件都運行在主線,谷歌官方規定,安卓不能再主線程做耗時操作,負責會造成ANR,爲了避免這種情況的出現,必須開線程處理耗時操作,但是安卓規定,子線程不能更新UI,所以安卓引入了Handler機制,
(因爲安卓中的UI控件不是線程安全的,如果在多線程中,併發訪問可能會導致UI控件處於不可預期的狀態,(爲啥系統不對UI控件的訪問加鎖機制,缺點有兩個1:加上鎖機制會讓UI訪問的邏輯變的複雜,其次鎖機制會降低UI訪問的效率,因爲鎖機制會阻塞某些線程的執行,最簡單最高效就是採用單線程來處理,對於我們來說也不是很麻煩,只需要通過Handler切換一下UI訪問的執行線程即可))
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---(短連接,只管發,不管收,想聊天就是UDK,丟了幾句聊天記錄無所謂)用戶數據報協議,是一個簡單的面向數據報的運輸層協議,面向無連接。UDP不提供可靠性,數據傳輸可能發生錯序,丟包,但效率較高。一般用於對於實時性要求較高的場合。
6線程之間的通信方式(如何避免ANR)
(1). AsyncTask,其中doInBackground()和onPostExecute(Result)兩個方法非常重要
doInBackground() 這個方法運行在後臺線程中,主要負責執行那些很耗時的操作,如訪問網絡。該方法必須重寫。(其實這個方法就是在子線程中做耗時操作,通過handler發送到onPostExecute)
onPostExecute(Result) 這個方法運行於UI主線程,在doInBackground(Params…)方法執行後調用,該方法用於接收後臺任務執行後返回的結果,刷新UI顯示。
(2.)子線程 + handler
在子線程中執行完耗時操作需要刷新UI時,通過handler.sendMessage()發消息給主線程, 然後在主線程Handler中的handleMessage()方法中執行刷新UI操作
7.activity的生命週期
(可見安卓開發藝術與探索) // 開始 重新啓動 停止 銷燬 暫停
七個,oncreate,onstart,onrestart,onstop,onresume,ondestroy,onpause;(清楚整個週期的過程)
1).啓動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態(onStart在頁面沒有獲取焦點之前執行, onResume在頁面獲取焦點時執行,一般情況下網絡請求放在onResume方法中,這樣做到目的是負責在當前頁面上的頁面結束後,當前頁面也快及時更新數據)。
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。
Activity 有七個生命週期
一般情況下創建一個activity首先會執行onCreate,onStart,onResume,onPause,onStop,onDestory,這個時候我們一般將訪問網絡放在onResume裏面,
onCreate :activity 第一次創建的時候被執行,
onStart :在啓動但沒有獲取焦點之前執行,無法與用戶進行交互
onResume :在獲取到焦點的時候執行,同時可以操作頁面
onPause :activity正在失去焦點的時候執行
onStop :失去焦點以後執行
onDestory:頁面銷燬的時候執行,
比如剛剛創建一個activity,首先會執行onCreate, onStart, onResume,這個時候跳轉到其他activity,當前activity首先會執行onPause, onStop,(但是如果另外一個activity採用了透明的主題,當前activity不會回調onStop),其他activity執行onCreate, onStart, onResume,這個時候結束掉其他activity,當前activity會執行onRestart, onStart, onResume
8.ArrayList和LinkedList區別?
存數據,ArrayList數組存儲數據,索引值以下標來搜索,查詢比較方,刪除增加比較麻煩,但是linkedList以鏈表式存儲數據,對於增刪比較方便。
ArrayList和LinkedList在性能上各 有優缺點,都有各自所適用的地方,總的說來可以描述如下:
對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry對象。
在ArrayList的 中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
LinkedList不 支持高效的隨機元素訪問。
ArrayList的空 間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
可以這樣說:當操作是在一列數據的後面添加數據而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數據的前面或中 間添加或刪除數據,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

9.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()
10·圖片異步加載怎麼做?
三級緩存:
1:首先從強引用中獲取(Lrucache),如果強引用中沒有,再去軟引用中獲取(SoftReference),如果軟引用再去SD卡獲取(SD卡被Dis Lrucache替代掉),如果這三級緩存中都沒有,就開啓網絡去請求圖片,請求回來的圖片,在加入到強引用中(Lrucache),如果強引用已經滿了,這時候,強引用通過Lrucache算法,刪除掉一些最近不常用的圖片,這時候咱們把這些圖片放到軟引用裏面,(當內存不足到時候軟引用就會被被垃圾回收機制回收),如果垃圾回收機制沒有,軟引用也滿了,將不常用的圖片移除掉,同時加入到SD卡,(現在被Dis Lrucache替代)
(key 一般使用的是網絡請求圖片的url,來保證唯一性,一般情況下我會做一下MD5加密,這樣做的目的是爲了保證不會出現非法字符)
現在SoftReference已經被替代掉,現在我們只使用兩級緩存,在加網絡, Lrucache, Dis Lrucache
LRC算法:最近最少使用的(內部如何實現的)
強引用: Lrucache
軟引用: SoftReference
弱引用:weak(隨時被垃圾回收機制回收)
虛引用:phantomreference
可定義圖片異步加載工具類,核心方式實現思路如下:
1.先從內存緩存(Map<String,SoftReference<Bitmap>>中獲取圖片顯示
2.獲取不到的話從本地SD卡里獲取並顯示
3.都獲取不到的話通過子線程從網絡加載圖片並保存到內存及SD卡中並通過handler顯示
11·service和Thread區別?
Service:是安卓的自大組件之間, Service的開啓方式有兩種,分別是StartService,和BindService,這兩種啓動方式的區別是: StartService與Activity沒有任何關係,只要開啓以後,就一直活躍在後頭, BindService與開啓的activity有關聯,只要activity銷燬, Service就會銷燬.
Thread:的Java中的線程類,與service沒有本質上的關聯,在安卓中,2.3以後不允許在主線程進行耗時操作,避免ANR,所以一般情況下,都將耗時操作放在Thread裏面,安卓提供了Handler機制來更新UI.(Handler原理)
1).Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些異步的操作。
2).Service:Service 是android的一種機制,當它運行的時候如果是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上
12·內存泄露如何解決?
1)、 數據庫的cursor沒有關閉
2)、 構造adapter沒有使用緩存contentview
Listview:性能優化:
1: Listview是需要和適配器配合使用的,常用的適配器有arrayAdapter,SimplerAdapter, SimpleCursorAdapter,BaseAdapter,一般情況下我使用的是繼承BaseAdapter,實現它的四個方法,其中最重要的兩個方法,getCount,和getView,在不做任何處理的情況下getview每次都重新生成一個view,這樣的結果就是很消耗內存,谷歌官網提供了優化listview內存的方法,通過ConvertView的複用和使用ViewHolder來減少findbyid的次數,從而達到控件的複用和減少cpu的消耗,但是因爲控件的複用,在加載圖片的時候,複用的控件裏面有殘留的圖片,從而造成圖片的錯位,所以我們必須在初始化的時候設置默認圖片來清除緩存的圖片,同時在加載的時候圖片的時候,如果不進行listview的性能優化,就會造成OOM,所以一般情況下我們會加載二次採樣過後的url,同時我們會進行三級緩存的處理,(同上)
二次採樣:
既然是二次採樣,那當然要分爲兩步了,下面我們來說說每次採樣的主要工作:
1.第一次採樣
第一次採樣我主要是想要獲得圖片的壓縮比例,假如說我有一張圖片是200*200,那麼我想把這張圖片的縮略圖顯示在一個50*50的ImageView上,那我的壓縮比例應該爲4,那麼這個4應該怎麼樣來獲得呢?這就是我們第一步的操作了,我先加載圖片的邊界到內存中,這個加載操作並不會耗費多少內存,加載到內存之後,我就可以獲得這張圖片的寬高參數,然後根據圖片的寬高,再結合控件的寬高計算出縮放比例。
2.第二次採樣
在第一次採樣的基礎上,我來進行二次採樣。二次採樣的時候,我把第一次bab採樣後算出來的結果作爲一個參數傳遞給第BitmapFactory,這樣在加載圖片的時候系統就不會將整張圖片加載進來了,而是隻會加載該圖片的一張縮略圖進來,這樣不僅提高了加載速率,而且也極大的節省了內存,而且對於用戶來說,他也不會有視覺上的差異
3.代碼實現
第一次採樣:首先獲取new BitmapFactory.Options()獲取option對象, inJustDecodeBounds設置爲true只會加載圖片的邊框進來,並不會加載圖片具體的像素點,通過BitmapFactory.decodeFile(filePath, options);來進行第一次加載圖片,通過outWidth原圖的寬度,通過outHeight獲取原圖的高,接下來通過圖片的跨度和控件的高度來獲取一個採樣率sampleSize,接下來設置inJustDecodeBounds爲false,同時設置縮放比,設置inPreferredConfig的圖片的圖片格式有(分別爲ALPHA_8,RGB_565,ARGB_4444,ARGB_8888),最後進行圖片的加載.
衍生的listview優化問題:減少創建View的對象,充分使用contentview,可以使用靜態類來處理優化getView的過程 3、Bitmap對象不使用時採用recycle()釋放內存 4、Activity中的對象生命週期大於Activity
)Bitmap對象不使用recycle()釋放內存
)Activity中的對象生命週期大於Activity;
內存泄露大多數都是由於相同的錯誤導致的,即:對Context擁有較長時間的引用。
避免Context相關的內存泄露,記住以下事情:
不要保留對Context-Activity長時間的引用(對Activity的引用的時候,必須確保擁有和Activity一樣的生命週期)
嘗試使用Context-Application來替代Context-Activity
如果你不想控制內部類的生命週期,應避免在Activity中使用非靜態的內部類,而應該使用靜態的內部類,並在其中創建一個對Activity的弱引用。這種情況的解決辦法是使用一個靜態的內部類,其中擁有對外部類的WeakReference,如同ViewRoot和它的Winner類那樣
GC(垃圾回收)不能解決內存泄露問題
13·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裏面處理,當然對業務計算等操作也是必須放在的該層的。
14·常用的設計模式
單例設計模式(例如:Application)
所謂單例設計模式簡單說就是無論程序如何運行,採用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟如下:
(1) 將採用單例設計模式的類的構造方法私有化(採用private修飾)。
(2) 在其內部產生該類的實例化對象,並將其封裝成private static類型。
(3) 定義一個靜態方法返回該類的實例。
工廠設計模式
程序在接口和子類之間加入了一個過渡端,通過此過渡端可以動態取得實現了共同接口的子類實例化對象
代理設計模式
指由一個代理主題來操作真實主題,真實主題執行具體的業務操作,而代理主題負責其他相關業務的處理。比如生活中的通過代理訪問網絡,客戶通過網絡代理連接網絡(具體業務),由代理服務器完成用戶權限和訪問限制等與上網相關的其他操作(相關業務)。
觀察者設計模式(自定義控件的時候設置點擊事件,)
所謂觀察者模式,舉個例子現在許多購房者都密切觀察者房價的變化,當房價變化時,所有購房者都能觀察到,以上的購房者屬於觀察者,這便是觀察者模式。
java中可以藉助Observable類和Observer接口輕鬆實現以上功能。當然此種模式的實現也不僅僅侷限於採用這兩個類。
觀察者模式本質上就是設置監聽:通過監聽來觀察發生變化,通過回調返回,
首先需要定義一個接口,接口裏面需要定義一個方法,方法的參數就是需要返回的參數,
其次需要定義一個監聽設置的方法
最後在需要監聽的地方設置監聽
在需要調用的的地方首先new出對象,調用監聽的方法,設置內部實現類,實現方法,從而達到監聽的目的.
適配器模式(listview,gridview)
如果一個類要實現一個具有很多抽象方法的接口,但是本身只需要實現接口中的部分方法便可以達成目的,所以此時就需要一箇中間的過渡類,但此過渡類又不希望 直接使用,所以將此類定義爲抽象類最爲合適,再讓以後的子類直接繼承該抽象類便可選擇性的覆寫所需要的方法,而此抽象類便是適配器類。
15·面向對象的特徵?
封裝
封裝最好理解了。封裝是面向對象的特徵之一,是對象和類概念的主要特性。
封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
繼承
面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。
多態
多態性(polymorphisn)是允許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
實現多態,有二種方式,覆蓋,重載。
覆蓋,是指子類重新定義父類的虛函數的做法。
1:方法名相同,參數類型相同,子類的返回值類型大於等於父類,修飾符子類的訪問權限要大於等於父類,子類拋出的異常不能大於父類.
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
1:同一方法中方法名相同,參數列表不同,參數的個數,類型,順序(具體使用自定義adapter)
16·程序結束的時候,如何處理Activity的?
記錄打開的Activity:(http://zdpeng.iteye.com/blog/1576055)
每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
Activity層數不要太多,太多用戶體驗太差,手機反應慢,所以在做app的時候,儘量保持不超過3層,第一層main,
17·配置文件中存放什麼?
四大組件,意圖,權限,第三方key,版本號等
18·Final ,finally,finalized,區別;
final用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不
可繼承。(geitview內部類訪問外部類的時候需要加final)
finally是異常處理語句結構的一部分,表示總是執行。(捕獲異常的時候用過)
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此
方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
19·NDK是什麼?
NDK 是 Native Development Kit 的簡稱。它是一個工具集,集成了 Android 的交叉編譯環境,並提供了一套比較方便的 Makefile ,可以幫助開發者快速開發 C 或是 C++ 的動態庫,並自動的將 so 和 java 程序打包成 apk ,在 Android 上運行。Android 上,應用程序的開發,大部分基於 Java 語言來實現。要使用 c 或是 c++ 的程序或庫,就需要使用 NDK 來實現。
20.百度地圖和谷歌地圖的優缺點?
優勢:
1一打開百度地圖頁面,顯示的就是目前所在城市地圖,谷歌地圖不然。
2百度地圖的界面,百度地圖很多都是在顯眼位置用文字做提示,一目瞭然,谷歌界面有點炫,很多用圖標來表示,但是用起來相對複雜,不熟悉的用戶需要確定這個圖標是否是所需要選擇的。
而百度地圖搜索框下就直接有“公交”“駕車”的選項,界面簡潔直接很多,谷歌地圖需要點擊獲取路線,再點擊小圖標來選擇“公交”這些選項,而且圖標不夠引人注目,使用起來相對複雜些,試想一個很少用網絡地圖的人分別使用二者地圖,那個更方便呢?應該是百度,大多數用戶通過地圖是查詢位置-這個地方在哪,周圍有什麼地物,查詢路線-從一個方到另一個地方如何到達,用百度地圖,這些問題很容易解決,而用谷歌地圖得擺弄一會兒。
3百度地圖的查詢路線更好,首先還是界面更簡潔直接,然後是數據的問題,先不管爲他們提供數據的公司如何,剛剛特意同時查了下,同樣地起點和終點, 百度地圖給出了5條路線,谷歌地圖給出的是4條路線,而且百度地圖路線的選擇時可以選擇“較快捷”“少換乘”“少步行”三種方式,更方便。打車費用也直接 顯示出來,而且個人體會10元內的打車費用基本正確。
4百度地圖有個視野內搜索功能,可以很方便地查找到目標位置,谷歌地圖沒有。這個很重要。
5一個重要界面佈局問題,百度地圖是地圖視野在左,而谷歌地圖是地圖視野在右,我們現在時喜歡從左到右看東西啊,這點百度地圖更符合用戶習慣。(當然也可能是我常用百度地圖,所以這麼覺得)
PS:剛在知乎上有朋友說到——因“左圖右列表”強調的是“地圖”,反之強調的是“搜索”;我們發現用戶在經過這麼些年的教育後,“不在乎”地圖在哪邊,相對其它體驗,這一點影響用戶選擇服務的權重並不高。
6百度地圖已經和都市圈合作推出了部分城市如北京、上海、深圳、廣州的三維地圖,谷歌地圖沒有。
7百度地圖地圖視野上方有個截圖功能,可以直接拉框截圖,谷歌地圖沒有。
8以北京實時路況信息爲例,直接輸入北京查詢,百度地圖顯示的是主城區的實時路況,而谷歌顯示的區域很大,包括了密4雲、廊坊市了,但是實時路況信息還是顯示的主城區,顯示路況的彩色條就全擠在一起了,設計得不如百度好。
8使用百度的佔大多數,經常可以聽到“百度一下啊”的話語。隨之帶來百度地圖的使用率也相對較高。
9百度地圖的地圖百寶箱、房產、天氣等信息。
劣勢:
1如果需要從網絡地圖上獲取數據的話,谷歌地圖完勝,而且還有谷歌地球在一旁輔助,如虎添翼,從網上各種各樣的谷歌地圖相關工具軟件就可以看出。
2路線查詢時輸入地點名稱卻有多個符合條件時,會給出一個下拉菜單給予選擇,同一地點谷歌地圖提供的數據精確到街道,而百度地圖精確到區。
3谷歌地圖可以將側邊欄隱藏起來,看到更大的地圖視野,而百度地圖是點擊全屏來顯示更大的視野,兩種切換方式比起來谷歌的更舒服。
4谷歌地圖有個分享鏈接功能,而且還提供“粘貼 HTML 以便嵌入到網站”這一功能,百度沒有。
5界面佈局百度地圖更簡潔,但是色彩搭配上和畫面感上谷歌地圖更好。
6谷歌的品牌形象佔優。
21·安卓的系統架構
應用層:使用Java語言進行開發的一些應用程序
應用框架曾:主要是谷歌發佈的一些操作支持的類庫(API框架),開發人員可以使用這些類庫方便的進行程序開發,但是在開發時必須遵守框架的開發原則
系統運行庫層:當使用安卓框架層進行開發時,安卓操作系統會自動使用一些c/c++的庫文件來支持所使用的各個組件,使其可以更好的爲程序服務;
Linux內核層:安卓操作系統主要是基於Linux內核,程序的安全性,驅動程序,進程管理等都由Linux內核提供。
22.listView優化
1)、convertView複用,對convetView進行判空,當convertView不爲空時重複使用,爲空則初始化,從而減少了很多不必要的View的創建
2)定義一個ViewHolder,封裝Listview Item條目中所有的組件,將convetView的tag設置爲ViewHolder,不爲空時通過ViewHolder的屬性獲取對應組件即可
3)、當ListView加載數據量較大時可以採用分頁加載和圖片異步加載
發佈了9 篇原創文章 · 獲贊 5 · 訪問量 7525
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章