- 相關(guān)推薦
android面試常見問題
Android面試中HR常問的問題會有哪些呢?結(jié)合以往自己的經(jīng)歷,下面是小編為大家收集整理的android面試常見問題,歡迎閱讀。
1,PendingIntent 和Intent的區(qū)別:
PendingIntent就是一個Intent的描述,我們可以把這個描述交給別的程序,別的程序根據(jù)這個描述在后面的別的時間做你安排做的事情
換種說法Intent字面意思是意圖,即我們的目的,我們想要做的事情,在activity中,我們可以立即執(zhí)行它
PendingIntent 相當于對intent執(zhí)行了包裝,我們不一定一定要馬上執(zhí)行它,我們將其包裝后,傳遞給其他activity或application
這時,獲取到PendingIntent的application 能夠根據(jù)里面的intent來得知發(fā)出者的意圖,選擇攔截或者繼續(xù)傳遞或者執(zhí)行。
Android的四個基本組件中:—— Activity,Service和Broadcast Receiver——都是通過Intent機制激活的,不同類型的組件有不同的傳遞Intent方式:
要激活一個新的Activity,或者讓一個現(xiàn)有的Activity做新的操作,可以通過調(diào)用Context.startActivity()或者Activity.startActivityForResult()方法。
要啟動一個新的Service,或者向一個已有的Service傳遞新的指令,調(diào)用Context.startService()方法或者調(diào)用Context.bindService()方法將調(diào)用此方法的上下文對象與Service綁定。
Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()這三個方法可以發(fā)送Broadcast Intent。發(fā)送之后,所有已注冊的并且擁有與之相匹配IntentFilter的BroadcastReceiver就會被激活。
2,Android中的尺寸,以及dp,px,sp的區(qū)別和聯(lián)系:
px:表示屏幕實際的像素。 320*480 :標示:在橫向320個縱向480個像素。
pt:標示一個點,時屏幕的物理尺寸,大小為1英寸的七十二分之一。
in:標示英寸,時屏幕的物理尺寸,每英寸等于2.54厘米。例如,形容手機大小為3.2英寸,是說屏幕對角線的大小。
dp與sp標尺單位的又來及計算方法:
像素尺寸:240*320 320*240 320*480 480*800 480*854 640*960 720*1280,
屏幕物理尺寸:3.2、3.5、3.75、4.0、4.3、5.0、7、9.3、10.1
0.75 1.5 2xhdpi xxhdpi3 4 8
android 程序代碼部分 采用像素為單位
程序的布局所有的尺寸都是采用dp為單位。
公式 :一個dp數(shù)值轉(zhuǎn)換為px的數(shù)字:
px = dp * (dpi/160)
例如:10dp --> 在mdpi dpi = 160 ;因此 10dp = 10px。
像素密度:dpi:每英寸像素數(shù): 如 手機為:240*320 像素分辨率,大小為:1.5*2 英寸。像素密度:240/1.5 = 320/2 =160dpi。
譬如1280x720物理分辨率,5英寸大小的屏幕,其dpi 的計算方法是:sqrt(1280*1280+720*720)/5 = 293.72 dpi
譬如1280x720物理分辨率,5英寸大小的屏幕上,54dp
這個高度如何轉(zhuǎn)換成 px 呢,計算方法是:54dp * 293.72/160+0.5f = 99.6305px,約為 100px。
dpi = 60
Ldpi = 120 3
mpdpi = 160 4
hdpi= 240 6
xHdpi = 320 8
[java] view plain copy
import android.content.Context;
public class DensityUtil {
/**
* 根據(jù)手機的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機的分辨率從 px(像素) 的單位 轉(zhuǎn)成為 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
dp,sp,px之間的區(qū)別和聯(lián)系:
dp也就是dip,這個和sp基本類似。
若是 設(shè)置長度,高度等屬性時,可以使用dp,或者sp。但如果設(shè)置字體,需要使用sp。
dp是與密度無關(guān),sp除了與密度無關(guān)外,還與scale無關(guān)。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp = 1sp = 1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)是3.2寸),而屏幕密度變?yōu)榱?20,那么原來的TextView的寬度設(shè)置成160px,在密度為320的3.2寸屏幕里看到要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或者160sp的話。系統(tǒng)會自動將width屬性值設(shè)置成320px的。也就是160*320/160。其中320/160可稱為密度比例因子。
如果使用dp和sp,系統(tǒng)會根據(jù)屏幕密度的變化自動轉(zhuǎn)換。
3,關(guān)于scrool+ListView:
1,所有的容器在顯示內(nèi)容之前,都需要進行排版,排版的時候,都需要獲取內(nèi)部子控件或子容器的尺寸,通過尺寸才可以進行排版。
2,所有的View內(nèi)部都有一個回調(diào)的方法,onMeasure這個方法,
3, ScroolView內(nèi)部控件 進行尺寸計算 onMeasure()的時候,
參數(shù)模式 是 UNSPECIFIED.
ListView的onMeasure :方法,檢測模式 如果是 UNSPECINIED,listView則永遠只有一行。
4,Http請求數(shù)據(jù),get,Post的區(qū)別:
在HTTP請求消息中,請求方式有GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT和CONNECT八種。而在以后們最常用的有兩種請求方式:POST請求、GET請求。
get和post區(qū)別:
GET:從指定的服務(wù)器中獲取數(shù)據(jù),POST-提交數(shù)據(jù)給指定的服務(wù)器處理。
1,使用GET方法時,查詢字符串會以鍵值對的形式附加在action所指向的url的后面一起發(fā)送到服務(wù)器。
2,使用POST方法時,查詢字符串在POST信息中單獨存在,和HTTP請求一起發(fā)送到服務(wù)器。
3,get是從服務(wù)器上獲取數(shù)據(jù),post是用來向服務(wù)器上傳遞數(shù)據(jù)。
特點:
get:
get請求 能 夠被緩存下來。
get請求 會 保存在瀏覽器的 瀏覽記錄中。
以GET 請求的URL能夠保存為 瀏覽器書簽。
GET請求的URL能夠 保存為瀏覽器書簽。
GET請求 有長度限制。
GET請求 主要用以獲取數(shù)據(jù)。
post:
數(shù)據(jù)量大小為128k.
HTTP協(xié)議規(guī)范也沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務(wù)器對它的限制。IE對URL長度的限制是2083字節(jié)(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統(tǒng)的支持。
http和https的區(qū)別:
https 是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細內(nèi)容就需
要SSL。它是一個URI scheme(抽象標識符體系)。句法類同http:體系。用于安全的HTTP數(shù)據(jù)傳輸。
https:url表明它使用了HTTP,但HTTPS存在不同于HTTP的默認端口及一個加密/身份驗證與加密通訊方法。 被廣泛應(yīng)用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。
5,Handler的介紹:
android提供了Handler和Looper來滿足線程間的通信,Handler先進先出原則,Looper類來管理特定線程內(nèi)對象之間的消息轉(zhuǎn)換。
1,Looper:一個線程可以產(chǎn)生一個Looper對象,由他來管理此線程里的MessageQueue(消息隊列);
2,Handler:用于push新消息到MessageQueue里,或者接受Looper從MessageQueue送來的消息。
3,MessageQueue:用來存放線程放入的消息。
4,Message對象:handler用于傳遞的數(shù)據(jù)信息。
handler創(chuàng)建消息:
handler消息機制中引入了消息池,Handler創(chuàng)建消息時首先查詢消息池中是否有消息存在。如果有直接從消息池中取得,如果沒有則重新初始化一個消息實例。消息不被使用時,并不作為垃圾回收,而是放入消息池?晒┫麓蜨andler創(chuàng)建消息時使用。
Handler持有對UI主線程消息隊列MessageQueue和循環(huán)Looper的引用。子線程可以通過Handler將消息發(fā)送到UI線程的消息隊列MessageQueue中。
Handler處理消息:
UI主線程通過Looper循環(huán)查詢消息隊列的UI_MQ,當發(fā)現(xiàn)有消息存在時會將消息從隊列中取出。首先分析消息,通過消息的參數(shù)判斷該消息對應(yīng)的Handler,然后將消息分發(fā)到指定的Handler進行處理。
handler message messageQueue
每一個消息發(fā)送到主線程的MessageQueue中,MessageQueue遵循先進先出原則,發(fā)送消息不會阻塞線程,而接收線程會阻塞線程。Handler允許發(fā)送并處理Message消息,Message對象通過主線程的MessageQueue消息隊列相關(guān)聯(lián)的Message和Runnable對象進行存取。每個Handler實例對Message消息發(fā)送和接收與對應(yīng)主線程和主線程的消息隊列有關(guān)。當創(chuàng)建一個新的Handler時,Handler就屬于當前主線程,主線程MessageQueue消息隊列也同步創(chuàng)建,即Handler會綁定到創(chuàng)建該Handler的主線程/消息隊列上。然后,Handler就可以通過主線程的消息隊列發(fā)送和接收Message消息對象了。
6,java的內(nèi)存機制:
內(nèi)存:
寄存器,方法區(qū),棧,堆,本地方法區(qū)。
方法區(qū):存類的信息,常量池,靜態(tài)方法區(qū).
棧(值類型):存放調(diào)用方法的局部變量,
存儲在棧中的變量,作用域結(jié)束立即消失.
堆(引用類型):存數(shù)組或者引用對象.
特點:
1,分配內(nèi)存首地址。
2,有默認值。
3,有g(shù)c(垃圾回收機制)。
本地方法區(qū):實現(xiàn)類庫的調(diào)用.
注意:常量池中,Java默認創(chuàng)建-128~127之間的常量對象. 對于字符串常量會首先去常量池中查找,如果不存在就創(chuàng)建字符串常量.字符串常量對像保存在字符串常量池中.
7,raw和assert中的資源有什么區(qū)別:
raw和asserts文件夾的相同點:
1,兩者目錄下的文件在打包后會原封不動的保存在apk包中。不會被編譯成二進制。
不同點:
1,raw文件夾中的文件會被映射到R.java文件中。訪問的時候直接使用資源id即R.id.fileName;assert不會被映射到R.java中。訪問的時候需要AssertManager類。
2,raw不可以有目錄結(jié)構(gòu),而assert則可以有目錄結(jié)構(gòu),也就是assert下可以再建立文件夾。
讀取文件資源:
inputStream is = getResources().openRawResource(R.id.filename);
讀取assert下的文件資源,通過以下方式獲取輸入流來進行寫操作。
AssertManager am = null; am = getAssert(); InputStream is = am.open("fileName");
8,fileInputStream 與dataInputStream區(qū)別
FileInputStream是實體流,也就是真實做事情的流,用來讀文件的。使用該類創(chuàng)建對象時,系統(tǒng)會自動將需要讀的文件轉(zhuǎn)換成該類的流對象,你可以直接讀取。DataInputStream是裝飾流,必須建立在其他實體流的基礎(chǔ)之上。如果用軟件來類比流的話,那么操作系統(tǒng)就是實體流,而一般的應(yīng)用軟件則是裝飾流。因為應(yīng)用軟件以操作系統(tǒng)軟件為基礎(chǔ)
9,LayoutInfalter 的參數(shù) 兩個和三個參數(shù)的區(qū)別?
View inflate(int resource, ViewGroup root)
View inflate(int resource , ViewGroup root, boolean attachToRoot)
第二個參數(shù) 是指 實例的布局所要放入的根視圖。一般我們在不需要將該布局放入根視圖的時候都會把第二個數(shù)傳為null。
第三個 參數(shù)為 是否將 第二個視圖引用到第一個資源文件上。。
10,Linux進程 和線程:
進程是程序執(zhí)行時的一個實例,即它是程序已經(jīng)執(zhí)行到各種程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點看,進程的目的就是擔當分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。
線程是進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成(擁有很多相對獨立的執(zhí)行流的用戶程序共享應(yīng)用程序的大部分數(shù)據(jù)結(jié)構(gòu)),線程與同屬一個進程的其他的線程共享進程所擁有的全部資源。
11,android是什么:
是基于Linux內(nèi)核的軟件平臺和操作系統(tǒng),早期由Google開發(fā)
Android平臺手機5大優(yōu)勢:
一、開放性.
二、掙脫運營商的束縛.
三、豐富的硬件選擇.
四、不受任何限制的開發(fā)商
五、無縫結(jié)合的Google應(yīng)用
12,Intent的七大屬性:
data(Data屬性 通常用于向Action屬性提供操作的數(shù)據(jù)。Data屬性的值是個Uri對象)
extras(提供操作的額外數(shù)據(jù),可以為各種對象)
category (類別)
flags(為Intent添加控制標記,同activity,LaunchMode)
action
intentFalter (意圖過濾器,通過action查找該intent。)
type(Type屬性用于指定Data所指定的Uri對應(yīng)的MIME類型).
13,fragment和activity的生命周期
fragment生命周期
onAttach(); onCreate(); onCreateView(); onActivityCreated(); onStart(); onResume();
onPause(); onStop(); onDestoryView(); onDestory(); onDetach();
activity的生命周期:
onCreated(),onStart(),onRestart(),onResume(),onPaused(),onStoped(),onDestroyed()
14,事件分發(fā)機制:
TouchEvent事件發(fā)生時Activity的dispatchTouchEvent(MotionEvent ev)會以隧道方式從根元素依次往下傳遞直到內(nèi)層子元素或在中間元素由于某一條件停止傳遞。
dispatchTouchEvent事件的分發(fā)邏輯:
1,返回true,進行處理,事件分發(fā)給當前view的dispatchTouchEvent方法進行消費,同時事件會停止向下傳遞。
2,返回false,事件向下分發(fā),此時事件分發(fā)分為兩種:如果當前view獲取的事件來自Activity,則會將事件返回給父View的Activity的onTouchEvent進行消費。如果當前View獲取的事件來自父外層控件,則會將事件返回給父View的onTouchEvent進行消費。
3,如果返回系統(tǒng)默認的super.dispatchTouchEvent(ev),事件會自動的分發(fā)給當前View的onInterceptTouchEvent方法。
事件攔截方法:onInterceptTouchEvent(MotionEvent ev)
1,在外層的View的dispatchTouchEvent(MotionEvent ev) 方法返回系統(tǒng)默認的super.dispatchTouchEvent(ev)情況下,事件會自動的分發(fā)給當前View的onInterceptTouch
Event方法,onInterceptTouchEvent方法,onInterceptTouchEvent的事件攔截邏輯如下:
1,如果onInterceptTouchEvent返回true 標示事件將進行攔截,并將攔截到的事件交由當前view的onTouchEvent進行處理。
2,如果onInterceptTouchEvent返回false,則表示將事件放行,不進行攔截,當前view上的事件會被傳遞到子View上,再由子view的dispatchTouchEvent來開始這個事件的分發(fā)。
3,如果返回super,則默認攔截并將攔截到的事件交由當前的View的onTouchEvent進行處理。
事件響應(yīng):onTouchEvent(MotionEvent ev)
1,在dispatchTouchEvent返回super的情況下, 并且onInterceptTouchEvent返回false或者返回super的情況下onTouchEvent會被調(diào)用。onTouchEvent的事件相應(yīng)邏輯如下:
1,如果事件傳遞到當前View的onTouchEvent方法,而該方法返回了false,那么這個事件會從當前View向上傳遞,并且都是由上一層View的onTouchEvent來接受,如果傳遞到上面的onTouchEvent也返回false,這個事件就會消失,而且接受不到下一次事件。
2,如果改事件rue 則會接受消費該事件。
3,如果返回super默認處理事件的邏輯和返回false相同。
15,IntentReceiver作用:
當你希望你的應(yīng)用能夠?qū)σ粋外部的事件(如當電話呼入時,或者數(shù)據(jù)網(wǎng)絡(luò)可用時,或者到了晚上時)做出響應(yīng),你可以使用一個IntentReceiver。雖然IntentReceiver 在感興趣的事件發(fā)生時,會使用NotificationManager通知用戶,但它并不能生成一個UI。IntentReceiver 在AndroidManifest.xml 中注冊,但也可以在代碼中使用Context.registerReceiver()進行注冊。當一個intentreceiver 被觸發(fā)時,你的應(yīng)用不必對請求調(diào)用intentreceiver,系統(tǒng)會在需要的時候啟動你的應(yīng)用。各種應(yīng)用還可以通過使用Context.broadcastIntent()將它們自己的intentreceiver 廣播給其它應(yīng)用程序。
16,UDP和TCP,三次握手和四次揮手::
UDP():半雙工。傳輸快,不安全。信息量要求速度的適用。
TCP:(請求響應(yīng)方式)
三次握手:
第一次握手:建立連接時,客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN + ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。
連接終止協(xié)議(四次揮手):
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。
。1) TCP客戶端發(fā)送一個FIN,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報文段4)。
。2) 服務(wù)器收到這個FIN,它發(fā)回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將占用一個序號。
。3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個FIN給客戶端(報文段6)。
。4) 客戶段發(fā)回ACK報文確認,并將確認序號設(shè)置為收到序號加1(報文段7)。
17,http1.1訪問網(wǎng)絡(luò)的八種方式:
http協(xié)議請求由三部分組成,分別是:請求行、消息報頭、請求正文。
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本,格式如下:
Method Request-URI HTTP-Version CRLF
1,HTTP/1.0協(xié)議使用非持久連接,即在非持久連接下,一個tcp連接只傳輸一個Web對象,;
2,HTTP/1.1默認使用持久連接(然而,HTTP/1.1協(xié)議的客戶機和服務(wù)器可以配置成使用非持久連接)。
OPTIONS:返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性。
HEAD:向服務(wù)器索要與GET請求相一致的響應(yīng),只不過響應(yīng)體將不會被返回。這一方法可以在不必傳輸整個響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。
GET:向特定的資源發(fā)出請求。注意:GET方法不應(yīng)當被用于產(chǎn)生“副作用”的操作中。
POST:向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT:向指定資源位置上傳其最新內(nèi)容。
DELETE:請求服務(wù)器刪除Request-URI所標識的資源。
TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷。
CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器
18,F(xiàn)ragment的優(yōu)化:
hide 和 add
正確的切換方式是add(),切換時hide(),add()另一個Fragment;再次切換時,只需hide()當前,show()另一個。
/**
* 切換頁面的重載,優(yōu)化了fragment的切換
*
* @param f
* @param descString
*/
public void switchFragment(Fragment from, Fragment to) {
if (from == null || to == null)
return;
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction().setCustomAnimations(R.anim.tran_pre_in,
R.anim.tran_pre_out);
if (!to.isAdded()) {
// 隱藏 當前的fragment,add下一個到Activity中
transaction.hide(from).add(R.id.fl_main, to).commit();
} else {
// 隱藏當前的fragment,顯示下一個
transaction.hide(from).show(to).commit();
}
// 讓menu回去
menu.toggle();
}
19:aidl線程間通信介紹:
android系統(tǒng)中的進程之間不能共享內(nèi)存,因此,需要提供一些機制在不同進程之間進行數(shù)據(jù)通信。
aidl是一種接口定義語言,用與兩個進程間的通訊規(guī)則,共編譯器生成代碼。實現(xiàn)android設(shè)備上的兩個進程間通信。
定義步驟:
1,在項目中創(chuàng)建一個擴展名為aidl的文件,該文件的語法類似于java代碼。
2,如果aidl文件的內(nèi)容是正確的,工具會自動生成一個java接口文件。
3,建立一個服務(wù)類(service的子類)。
4,實現(xiàn)由aidl文件生成的java接口。
5,在注冊文件中配置AIDL服務(wù),標簽中的android:name的屬性就是客戶端要引用該服務(wù)的ID。也就是intent的參數(shù)值。
在Android 中,AiDL是一種接口定義語言,編譯器通過*.aidl文件的描述信息生成符合通信協(xié)議的java代碼,我們無需自己去寫這段繁雜的代碼,只需要在需要的時候調(diào)用即可。通過這種方式我們就可以完成進程間的通信工作。
20,單元測試的步驟和方法:
第一步:
在安卓注冊文件的應(yīng)用程序application代碼塊中添加代碼:
在application外部添加代碼:
<instrumentation android:name="android.test.InstrumentionTestRunner"
android:targetPackage = "xx.xx.x.x" android:label = "Tests for My App"/>
第二部 :
新建普通類繼承 AndroidTestCase類。編寫測試方法:必須以public void開頭,盡量拋出異常。在該方法中調(diào)用需要測試的方法或代碼。
第三步:將鼠標放在測試代碼的測試方法上,點擊run as方法運行測試。
---集成測試:
主要是在單元測試的基礎(chǔ)上測試接口訪問或者異步任務(wù)是否正確。
21,數(shù)字簽名的作用:
1,目的是保證軟件包的完整性包含軟件發(fā)布者的證書信息。
2,作用:
1,確保軟件包沒有被修改,
2,android系統(tǒng)根據(jù)相同軟件id來區(qū)分軟件,如果相同的id,只要證書不同,那么不允許安裝,除非卸
載原有程序,保護數(shù)據(jù)。
3,證書可以包含有效期,如果一個軟件證書的有效期過期了,android不允許程序再運行了。
1,Key Store:用于 保存公鑰和私鑰,公鑰包含證書信息;開發(fā)工具使用keystore文件來進行數(shù)字簽名。
2,團隊中應(yīng)該使用相同的keystore文件,進行代碼的調(diào)試和打包,主要針對百度地圖這種,需要證書信息的,
3,如公司已經(jīng)提供keystore,那么直接復(fù)制出來,放到自己的電腦上。
4,若沒有提供,需要創(chuàng)建一個 放到工程中。
keyStore文件的生成:
1,推薦 在工程中創(chuàng)建keyStore文件,團隊就可以協(xié)同工作了。
2,名詞:key alias別名:在創(chuàng)建的時候,可以給每一個秘鑰對私鑰,指定一個名稱。
這樣就。
22,Android內(nèi)存的優(yōu)化:
android優(yōu)化:內(nèi)存控制,循環(huán)使用。圖片的優(yōu)化(二次采樣)。
內(nèi)存優(yōu)化:
1,減少內(nèi)存占有。
2,及時的緩存。
3,把不適用的內(nèi)存置空
4,圖片比較大的 進行二次采樣。
android 代碼優(yōu)化的核心原則:
1、字符串頻繁操作時,多用StringBuffer而少用String
2、盡量使用本地變量,即反復(fù)使用的變量要先保存成臨時或局部變量,尤其是循環(huán)中使用的變量
3、String方法中Substring和indexOf都是native方法可以大量的使用。
4、如果函數(shù)返回String類型,而且返回后的使用就是要加入到StringBuffer此時可以直接傳入StringBuffer
5、用兩個一維數(shù)組代替二維數(shù)組 int[][]=====int[] int[]
6、如果返回直接類型足夠了,就不應(yīng)返回接口類型如假如返回Hashmap就足夠了,請不要返回Map
7、如果一個方法不訪問(不修改)成員變量,請用static方法
8、盡量不用getters和setters,如果你非要用的話請加上final關(guān)鍵字,編譯器會把它當成內(nèi)聯(lián)函數(shù)
9、永遠不要在for循環(huán)第二個參數(shù)中使用方法調(diào)用
10、不修改的static變量請用static final常量代替
11、foreach可以用來處理數(shù)組和arraylist,如果處理其他對象相當于Iterator
12、避免使用枚舉,請使用常量代替。
13、慎用浮點數(shù) float尤其是大量的數(shù)學(xué)運算
14、不使用的引用變量要手動置null,提高內(nèi)存被回收的幾率
15、慎用圖片操作,使用后要立即釋放資源。
23,fresco:第三方圖片加載庫介紹:
DraweeView 是Fresco的三大組件(Hierarchy、Controller、View) 之一,作為MVC模式中的 View,主要負責(zé)顯示由 Hierarchy 提供的數(shù)據(jù),Controller 作為幕后,負責(zé)獲取數(shù)據(jù)。
fresco是通過控件來實現(xiàn)它內(nèi)部的優(yōu)化緩存處理的。
Fresco源碼解析,fresco源碼:Fresco是一個MVC模型,由三大組件構(gòu)成,
它們的對應(yīng)關(guān)系如下所示:
M ->DraweeHierarchy
V -> DraweView
C -> DraweeController。
M 所對應(yīng)的 DraweeHierarchy 是一個有層次結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),DraweeView 用來顯示位于 DraweeHierarchy 最頂層的圖像(top level drawable),DraweeController則用來控制DraweeHierarchy的頂層圖像是哪一個。
三者的互動關(guān)系很簡單,DraweeView 把獲得的 Event 轉(zhuǎn)發(fā)給 Controller,然后 Controller 根據(jù) Event 來決定是否需要顯示和隱藏 (包括動畫)圖像,而這些圖像都存儲在 Hierarchy 中,最后 DraweeView 繪制時直接通過 getTopLevelDrawable 就可以獲取需要顯示的圖像。
24,垃圾回收內(nèi)部運行機制:
java中 垃圾回收機制的原理:
1,gc垃圾回收機制的工作原理:
1,gc的工作原理:引用計數(shù),標記復(fù)制。引用計數(shù)其實是一種簡單但速度很慢的垃圾回收技術(shù),所有對象都需要有一個引用計數(shù)器,當有引用連接時計數(shù)器加1。當引用離開作用域時或者被置為null時,計數(shù)器-1.垃圾回收器會在所有包含對象引用的列表上進行遍歷,當發(fā)現(xiàn)某個對象的引用計數(shù)為0時,就釋放占用的空間。
2,“標記復(fù)制”的運行機制,垃圾回收器遍歷包含所引用的列表,當發(fā)現(xiàn)存活的對象引用時做上標記,這樣當遍歷完 所有對象引用并做上標記的時候,執(zhí)行垃圾回收,將沒有標記的 對象 堆空間釋放。
3,垃圾回收機制的特點:java的垃圾回收機制使得java程序員不用擔心內(nèi)存空間的分配,減少了內(nèi)存溢出。但同時也犧牲了一定的性能。
實現(xiàn)gc的算法:
引用計數(shù)法,tracing算法,compacting算法,copying算法,generation算法,adaptive算法,
25,設(shè)計模式:
根據(jù)模式的目的劃分為三類:
1,創(chuàng)建型模型:與對象的創(chuàng)建有關(guān)。2, 結(jié)構(gòu)性模型:處理類與對象的組合。3,行為型模型:對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進行描述。
1.創(chuàng)建型模式:
(1).工廠方法模式 (2).抽象工廠模式 (3).創(chuàng)建者模式 (4).原型模式 (5).單例模式
2.結(jié)構(gòu)型模式:
(6).適配器模式 (7).橋模式 (8).組合模式 (9).裝飾模式 (10).外觀模式 (11).享元模式 (12).代理模式
3.行為型模式
(13).解釋器模式 (14).模板方法模式 (15).職責(zé)鏈模式 (16).命令模式 (17).迭代器模式 (18).中介者模式 (19).備忘錄模式 (20).觀察者模式 (21).狀態(tài)模式 (22).策略模式 -----:官方告訴大家我這里有一個排序的接口ISort的sort()方法,然后民間各盡其能,實現(xiàn)這個排序的方法:冒泡,快速,堆等等。這些方法就是“不同的策略”。 (23).訪問者模式
MVC不是一種設(shè)計模式:
Trygve Reenskaug最初提出MVC的目的是為了把數(shù)據(jù)(Model)和視圖(View)分離開來,然后用控制器(Controller)作膠水來粘合M和V之間的關(guān)系。目的是為了實現(xiàn)注意點分離這樣一個更高層次的設(shè)計理念,也就是讓專業(yè)的對象做專業(yè)的事情,View就只負責(zé)視圖相關(guān)的東西,Model就只負責(zé)描述數(shù)據(jù)模型,Controller負責(zé)總控,各自協(xié)作。
它其實是其它三個經(jīng)典的設(shè)計模式的演變:觀察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和組合模式(Composite)。
26,ViewStub介紹:
解決動態(tài)根據(jù)條件顯示哪個View或某個布局:
android.view.ViewStub。
viewStub是一個輕量級的View。他是一個看不見的,不占布局的位置。占用資源非常小的控件,可以為ViewStub制定一個布局,在inflate布局的時候,只有ViewStub會被初始化。然后當ViewStub被設(shè)置為可見的時候,或是調(diào)用了ViewStub.inflate()的時候,ViewStub所向的布局就會被inflate和實例化。然后ViewStub的布局屬性都會傳給它所指向的布局。這樣,就可以使用ViewStub來方便的在運行時,要還是不要顯示某個布局。
viewStub只能實例化一次,之后ViewStub對象會被置為null。
27,軟件測試的基本步驟:
軟件首先在開發(fā)中進行單元測試。
開發(fā)完成后進行 集成測試(設(shè)計規(guī)格說明)-------》功能測試(系統(tǒng)功能需求)-----》性能
測試(其他軟件需求)-----》驗收測試(用戶需求規(guī)格說明書)-----》安裝測試(用戶環(huán)境)。
28,加密算法:
數(shù)據(jù)加密:
計算機的加密解密是由秘鑰控制實現(xiàn)的。秘鑰使用戶按照一種密碼制隨機選取。通常是一隨機字符串。是控制明文和秘文變化的隨機參數(shù)。
密碼技術(shù)除了提供信息的加解密外,還提供對信息來源的鑒別,保證信息的完整和不可否認等功能,而這三種功能都是通過數(shù)字簽名實現(xiàn)。數(shù)字簽名時涉及信息和簽名人私鑰的計算結(jié)果。首先簽名人的軟件對發(fā)送的信息進行散列函數(shù)運算后。生成信息摘要。
加密體制:
根據(jù)秘鑰類型不同將現(xiàn)代密碼及技術(shù)分為兩類:對稱加密(秘鑰加密)系統(tǒng),非對稱加密(公開秘鑰加密)。
對稱加密:
加密和解密均采用一把秘密鑰匙,而且通信算法必須足夠強大。適合于大規(guī)模生產(chǎn)。
非對稱加密(公鑰加密):
指加密和解密使用不同秘鑰的加密算法。也稱為公私鑰加密,假設(shè)兩個用戶要加密交換。
MD5:消息摘要(信息摘要算法),Message-Digest Algorithm 5 散列函數(shù)。
將數(shù)據(jù)(如漢字)運算為另一固定長度的值。是緊湊算法的基礎(chǔ)原理。
它只是將數(shù)據(jù)按照指定算法壓縮成長度固定的摘要信息。
摘要算法 就好比將一本書的每一頁第一個字的筆畫數(shù)計算出來,并拼接在一起,組成了一個很長的數(shù)字串。不論何時,按相同的算法計算這本書的摘要,都是完全一樣的。但通過這個數(shù)字串,無法還原出書中的數(shù)據(jù),即過程不可逆。md5算法類似于這種計算摘要的思想,只是具體實現(xiàn)要復(fù)雜很多。
MD5特點:
1,壓縮性:任意長度的數(shù)據(jù),算出的MD5的值都是固定的。
2,容易計算:從元數(shù)據(jù)計算出MD5的值很容易。
3,抗修改性:對原數(shù)據(jù)進行任何修改,哪怕只修改一個字節(jié),所得到的MD5值都有很大區(qū)別。
4,強抗碰撞:已知原數(shù)據(jù)MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
原理:
1,對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組。經(jīng)過了一系列的處理后,
算法的輸出有四個32位組成,將這四個32位分組級聯(lián)后生成一個128位散列值。
2,例如字符串: 計算數(shù)據(jù)的長度,對數(shù)據(jù)進行填充到512位(64個字節(jié))。然后將數(shù)據(jù)分成16個小組(16個數(shù))。經(jīng)過數(shù)據(jù)分組處理后,按照內(nèi)存順序輸出即為最終結(jié)果。
RSA:非對稱加密原理:
用到素數(shù),互質(zhì)數(shù)(公因數(shù)只有1的兩個數(shù)),指數(shù)運算,模運算(模運算即求余運算)等幾個簡單的數(shù)學(xué)知識。
密鑰產(chǎn)生方法:yh
隨機產(chǎn)生兩個不相等的質(zhì)數(shù)計算乘機n轉(zhuǎn)為二進制,二進制的位數(shù)就是密鑰的位數(shù)。實際應(yīng)用中RSA密鑰一般為1024位,重要場合為2048位。
計算出n的歐拉函數(shù),隨機選擇一個整數(shù)e(實際應(yīng)用中,常常選擇65537),條件是1< e < φ(n),且e與φ(n) 互質(zhì)。
計算e對于φ(n)的 模反元素d。所謂"模反元素"就是指有一個整數(shù)d,可以使得ed被φ(n)除的余數(shù)為1。
將n和e封裝成公鑰,n和d封裝成私鑰。
RSA缺點:
產(chǎn)生密鑰很麻煩,受到產(chǎn)生素數(shù)技術(shù)的限制。
分組長度太大,為保證安全性,n至少也要600bit以上。使運算代價很高,尤其是速度較慢。
DES算法的入口參數(shù)有三個:Key、Data、Mode。其中Key為8個字節(jié)共64位,是DES算法的工作密鑰;Data也為8個字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。
DES算法是這樣工作的:如Mode為加密,則用Key 去把數(shù)據(jù)Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結(jié)果;
如Mode為解密,則用Key去把密碼形式的數(shù)據(jù)Data解密,還原為Data明碼形式(64位)作為DES的輸出結(jié)果。 在通信網(wǎng)絡(luò)的兩端,雙方約定一致的Key,在通信的源點用Key對核心數(shù)據(jù)進行DES加密,然后以密碼形式在公共通信網(wǎng)(如電話網(wǎng))中傳輸?shù)酵ㄐ啪W(wǎng)絡(luò)的終點, 數(shù)據(jù)到達目的地后,用同樣的Key對密碼數(shù)據(jù)進行解密,便再現(xiàn)了明碼形式的核心數(shù)據(jù)。這樣,便保證了核心數(shù)據(jù)(如PIN、MAC等)在公共通信網(wǎng)中傳輸?shù)陌踩院涂煽啃浴?/p>
29,activity的啟動模式:
standard(標準模式) singleTop(棧頂) singleTask() singleInstance()
標準模式:每次都會創(chuàng)建一個新的Activity,不在任務(wù)棧中作任何存在性檢查。(對系統(tǒng)消耗過大,每次都會創(chuàng)建一個activity的實例)。
singleTop(棧頂模式):只對棧頂作存在性檢查,當啟動的activity已經(jīng)位于棧頂時,只對棧頂作存在性檢查,直接使用。若沒有位于棧頂則直接創(chuàng)建。
singleTask(檢查棧中所有):系統(tǒng)會檢查棧中是否存在該活動的實例,如存在則直接使用該實例。
singleInstance:在開發(fā)程序中如果需要activity在整個體系中都只有一個實例則使用單實例模式。指定為singleInstance模式的activity會啟動一個新的任務(wù)棧來管理這個activity。
30,ListView 的優(yōu)化:
1,利用ListView自身的緩存機制,他會緩存一個條目的item,當listView第一屏顯示完成之后。就會出現(xiàn)一個緩存條目,其實就是BaseAdapter里面的public View getView(int position,View convertView,ViewGroup parent)。
2,減少findViewById()的次數(shù),findViewById是一個相對比較耗性能的操作,因為這個操作每次都需要到布局中查找文件。把item里面的控件封裝成一個javaBean,當item條目被加載的時候就去找相應(yīng)的控件。
3,利用時間去換取時間,比如開機優(yōu)化,把一些重要的程序先啟動了,啟動系統(tǒng)完成之后再啟動其他程序。
4,利用空間去換取時間,把要獲取的數(shù)據(jù)現(xiàn)價在到內(nèi)存里面,在處理數(shù)據(jù)的時候,直接從內(nèi)存中獲取。減少數(shù)據(jù)庫的頻繁打開和關(guān)閉和減少查詢的次數(shù)。
31,Thread和Runnable區(qū)別:
如果一個類繼承Thread,則不適合資源共享,但是如果實現(xiàn)了Runnable接口的話,則很容易的實現(xiàn)資源共享。
在程序開發(fā)中只要是多線程肯定以Runnable接口為主,因為實現(xiàn)Runnable接口相比繼承Thread類有如下好處:
避免點繼承的局限性,一個類可以繼承多個接口。
適合于資源的共享。
32,surfaceView view GLSurfaceView: 區(qū)別:
View:顯示視圖,內(nèi)置畫布,提供圖形繪制函數(shù)、觸屏事件、按鍵事件函數(shù)等;必須在UI主線程內(nèi)更新畫面,速度較慢。
SurfaceView:基于view視圖進行拓展的視圖類,更適合2D游戲的開發(fā);是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快。
GLSurfaceView:基于SurfaceView視圖再次進行拓展的視圖類,專用于3D游戲開發(fā)的視圖;是SurfaceView的子類,openGL專用。
33,android系統(tǒng)中具備6個啟動模式:
1,normal mode:一般啟動模式的功能是正常啟動方式,方法為關(guān)機狀態(tài)下按電源鍵啟動。
2,safe mode:此模式和正常啟動一樣,但沒有登記Google,所以不能訪問Market或使用你的Google賬號,操做方法為按住“menu”鍵,按電源鍵啟動手機,直至手機啟動完成松開“menu”鍵。
3,恢復(fù)模式(recovery mode):可打開命令解釋程序(shell),刷新映像文件,執(zhí)行備份等,。當然這一切取決于你手機上的recovery image版本。使用方法很簡單。就是home鍵和電源鍵一起按。
4,引導(dǎo)模式的功能,是從sd卡上安裝新的系統(tǒng)映像,只需再按一次電源鍵。值得一提為android手機獲取root權(quán)限。就是使用這個模式,操做方法為照相鍵和電源鍵一起按。
5,fastboot模式主要是在電腦上使用fastboot命令刷新映像文件。使用方法為按住返回鍵,按電源鍵啟動手機,直至屏幕出現(xiàn)FASTBOOT字樣松開后返回鍵。
6,診斷模式(diagnostic mode)是為了測試手機各項功能的模式,刻意通過軌跡球中心鍵和電源鍵打開。
34,Permission 的ProtectionLevel的屬性值:
normal:低風(fēng)險權(quán)限,只要申請了就可以使用(在AndroidMainFest.xml中添加),安裝時不需要用戶確認。
danerous:高風(fēng)險權(quán)限,安裝時需要用戶的確認才可使用。
signature:只有當申請權(quán)限的應(yīng)用程序的數(shù)字簽名與聲明此權(quán)限的應(yīng)用程序的數(shù)字簽名相同時,才能將權(quán)限授給他。
signatureOrSystem:簽名相同,或者申請權(quán)限的應(yīng)用為系統(tǒng)應(yīng)用(在system image中)。
35,內(nèi)存溢出和內(nèi)存泄露的區(qū)別:
內(nèi)存溢出out of memory,是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給他存了long才能存下的數(shù)。
比如棧:棧滿時,進行進棧,內(nèi)存溢出。?諘r,進行出棧,內(nèi)存也會溢出。分配內(nèi)存不足以放下數(shù)據(jù)項序列,稱為內(nèi)存溢出。
內(nèi)存泄露memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴重,無論多少內(nèi)存遲早會被占光。 是指向系統(tǒng)中申請分配內(nèi)存進行使用(new),但使用完后,卻沒有歸還。申請到的內(nèi)存自己也不能再訪問,而系統(tǒng)也不能再次將它分配給需要的程序。
內(nèi)存泄露會導(dǎo)致內(nèi)存溢出。
36,java中有四種類型的引用:及區(qū)別:
1,強引用(Strong Reference):只要某個對象有強引用與之關(guān)聯(lián),JVM必定不會回收這個對象,即使在內(nèi)存不足的情況下,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象。
2,弱引用(Weak Refrence):如果一個對象只有弱引用指向它,垃圾回收器會立即回收該對象。
3,軟引用(SoftRefrence):只有在內(nèi)存不足的時候JVM才會回收該對象。并且這個特性很適合用來實現(xiàn)緩存:比如網(wǎng)頁緩存、圖片緩存等。
4,虛引用(PhantomReference):如果一個對象與虛引用關(guān)聯(lián),則跟沒有引用與之關(guān)聯(lián)一樣,在任何時候都可能被垃圾回收器回收。
37,怎么解決橫豎屏切換導(dǎo)致的 數(shù)據(jù)丟失?
activity橫豎屏切換時,當前的Activity會被銷毀,然后Activity上面的數(shù)據(jù)將全部丟失。
如ListView扇面的每個item的checkbox,橫豎屏切換時,復(fù)選框就丟失所有選中的信息。
實現(xiàn):
1,在注冊文件中,activity 標簽中,使用android:configChanges = "orientation|keyboardHidden"標簽。
2,強制activity在 支持橫屏或者豎屏。landscape標識橫屏,portrait標識豎屏。
3,在activity中:通過復(fù)寫 onConfigurationChanged(Configuratiion newConfig)方法。實現(xiàn)在不同屏幕下的處理方式。
[java] view plain copy
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
/*
* 橫豎屏檢測
*/
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 當前為橫屏
//實現(xiàn)代碼
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// 當前為豎屏
//實現(xiàn)代碼
}
/*
* 實體鍵盤狀態(tài)檢測
*/
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
// 實體鍵盤處于推出狀態(tài)
//實現(xiàn)代碼
}
else if (newConfig.hardKeyboardHidden == onfiguration.HARDKEYBOARDHIDDEN_YES) {
// 實體鍵盤處于合上狀態(tài)
//實現(xiàn)代碼
}
}
38,Volley請求和xUtils請求的區(qū)別:
Volley谷歌的:支持小數(shù)據(jù)大頻繁請求。
xUtils中國人開發(fā)的。
相同點:
1,采用了網(wǎng)絡(luò)數(shù)據(jù)緩存機制。
2,通過handler機制進行線程通信。
不同點:
1,Volley請求在android2.3版本之前是通過HttpClient,在之后的版本是URLHTTPConnextion.xUtils都是通過HttpClient請求數(shù)據(jù)信息的(bitmap模塊圖片是通過URLHTTPConnection)。URLHttpConnection默認支持GZIP壓縮。api操作簡單。
2,Volley將Http請求數(shù)據(jù)先緩存進Byte[],然后是分配給不同的請求轉(zhuǎn)化為需要的格式。 xUtils是直接轉(zhuǎn)換為需要的格式。 Volley的擴展性很好,但是不能存在大數(shù)據(jù)的請求,否則就報OOM。 XUtils不會緩存如byte[]支持大數(shù)據(jù)的請求,速度要比Volley稍快。但擴展性低。
3,Volley訪問網(wǎng)絡(luò)數(shù)據(jù)時直接開啟固定個數(shù)的線程訪問網(wǎng)絡(luò)數(shù)據(jù),在run方法中執(zhí)行死循環(huán)。阻塞等待請求隊列等。 XUtils是開啟線程池來管理線程。緩存失效策略。volley的所有網(wǎng)絡(luò)數(shù)據(jù)支持從http相應(yīng)頭控制是否緩存和讀取緩存失效時間,每個請求可以控制是否緩存和緩存失效時間。 xUtils網(wǎng)絡(luò)數(shù)據(jù)請求是統(tǒng)一自定義緩存失效時間。
39,android5.0的新特性:
1、Face unlock(面部解鎖):在Lollipop系統(tǒng)中,Google花費大力氣優(yōu)化了面部解鎖功能。當用戶拿起手機處理鎖屏界面上的消息通知時,面部解鎖功能便自動被激活。隨意瀏覽幾條消息之后,手機已經(jīng)默默地完成了面部識別,解鎖就是這么簡單!
2,Lock screen notifications(鎖屏通知中心)
Android Lollipop中加入了全新風(fēng)格的通知系統(tǒng),改進后的通知系統(tǒng)會優(yōu)先顯示由用戶設(shè)定的重要的信息,而將不太緊急的內(nèi)容隱藏起來。用戶只需要向下滑動就可以查看全部的通知內(nèi)容,如果是短信、微信,就可以再通知欄里直接進行回復(fù),非常人性化。
3,Pin Apps(多任務(wù)視窗)
Lollipop在系統(tǒng)設(shè)置中提供了一項全新的功能——在多任務(wù)視窗中,給app應(yīng)用窗口添加pin鎖定代碼。正如名字講的那樣,像是用別針鎖定app應(yīng)用,只用當輸入正確的密碼才能退出該app界面。雖然說與iOS系統(tǒng)的Guided Access功能也很像,但Guest Mode使用時好像更加簡單快捷。
4,Material Design
Google重新設(shè)計了更加趨于扁平化的Lollipop系統(tǒng)UI,稱為Material Design。在今年6月26日舉辦的I/O 2014開發(fā)者大會上,許多人就已經(jīng)提前領(lǐng)略到Material Design出色的功能了。到現(xiàn)在,它得到了更多的優(yōu)化,例如給通訊錄聯(lián)系人添加不同的顏色優(yōu)先等級。新的UI設(shè)計,在基本元素的處理上,借鑒了傳統(tǒng)的印刷設(shè)計,從字體版式、網(wǎng)格系統(tǒng),到空間、比例、配色、圖像等方面,都驚醒了大膽的平面化的創(chuàng)新。這一舉措,無疑是加大了國產(chǎn)UI設(shè)計的難度與門檻。
5,Android 5.0還支持新的電池模式、多賬戶登陸、訪客模式以及通過藍牙設(shè)備解鎖等新功能。
Material Design新控件:
支持的八個新控件:
TextInputLayout:對EditText進行封裝,帶有提示信息的輸入框。一個TextInputLayout只能嵌套一個EditText,內(nèi)容過多會水平滾動進行查看
FloatingActionButton:一個負責(zé)顯示界面基本操作的懸浮圓形按鈕。繼承自ImageView,你可以使用android:src(更改圓形按鈕中間的圖片)或者ImageView的任意方法。懸浮按鈕的背景使用colorAccent屬性更改。
Snackbar:一個介于Toast和AlertDialog之間的輕量級控件。他可以很方便的提供消息的提示和動作反饋。
TabLayout標簽布局位置隨意,只能進行文字導(dǎo)航,既實現(xiàn)了固定的選項卡(View的寬度平均分配),也實現(xiàn)了可滾動的選項卡(View寬度不固定同時可以橫向滾動)
NavigationView:
CoorDinatorLayout: 效果1:滾動效果,例子如:讓浮動操作按鈕(FloatingActionButton)上下滑動,為Snackbar留出空間,實現(xiàn)方式:使用CoordinatorLayout作為基本布局放在FloatingActionButton布局外層,會自動實現(xiàn)上移下移的動畫.
AppBarLayout:可把容器類的組件全部作為AppBar,例如把Toolbar和TabLayout放到了AppBarLayout中,讓他們當做一個整體作為AppBar.
TooBayLayout:CollapsingToolbarLayout作用是提供了一個可以折疊的Toolbar,它繼承至FrameLayout,給它設(shè)置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在響應(yīng)layout_behavior事件時作出相應(yīng)的scrollFlags滾動事件(移除屏幕或固定在屏幕頂端)。