GUI,界面,與用戶交互的可視接口。
站在用戶的角度思考問題,與客戶深入溝通,找到涿州網(wǎng)站設(shè)計(jì)與涿州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋涿州地區(qū)。
當(dāng)然Fragment,View也是,不過我把它看作是控件,Activity是開發(fā)中最基本的容器(窗口)。
目的是便于管理Activity生命周期。
新啟動(dòng)的Activity會(huì)壓入棧頂,而處于棧頂?shù)腁ctivty處于Active活躍狀態(tài),即可以和用戶做交互(可見可交互)。壓在下面的Activity則處于可見不可交互,或不可見不可交互狀態(tài),并且系統(tǒng)可能會(huì)因?yàn)閮?nèi)存不足原因優(yōu)先回收掉任務(wù)棧最下面的Activity,所以也有被回收狀態(tài)。
1.資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activty被殺死并重新創(chuàng)建
2.資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死
擴(kuò)展:進(jìn)程優(yōu)先級(jí)
當(dāng)Activity異常被回收的情況下,系統(tǒng)會(huì)調(diào)用onSaveIntanceState(Bundle),重新啟動(dòng)時(shí)會(huì)調(diào)用onRestoreInstanceState(Bundle),所以可以在Bundle做一些數(shù)據(jù)保存和恢復(fù)的工作。
數(shù)據(jù)恢復(fù):onCreate()與onRestoreInstanceState()區(qū)別:
onCreate()需要判空,onRestoreInstanceState不需要。
啟動(dòng)模式簡(jiǎn)單來說就是定義Activity實(shí)例與Activity任務(wù)棧的關(guān)聯(lián)方式。
目的:
設(shè)置方式:
有哪些啟動(dòng)模式?
TaskAffinity(任務(wù)相關(guān)性),這個(gè)參數(shù)標(biāo)識(shí)了一個(gè)Activity所需要的任務(wù)棧的名字,默認(rèn)情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的名字。所有我們可以通過設(shè)置TaskAffinity為每個(gè)Activity單獨(dú)指定任務(wù)棧。
啟動(dòng)Activity就兩種,顯示調(diào)用和隱式調(diào)用。
即在Intent中,顯示傳入要跳轉(zhuǎn)的組件類名。這種方式比較簡(jiǎn)單直接,但也造成了關(guān)聯(lián)耦合。
這樣調(diào)用方式的好處是我不必知道我的目標(biāo)組件具體的名字,只要有組件滿足我設(shè)置的過濾條件即可找到我想要的組件。這種方式廣泛應(yīng)用在模塊化開發(fā),解決了模塊之間的跳轉(zhuǎn)問題。
隱式調(diào)用需要Intent能夠匹配目標(biāo)組件的IntentFilter中設(shè)置的過濾信息,如果不匹配將無法啟動(dòng)目標(biāo)組件。IntentFilter中的過濾信息包括action、category、data
清單文件中,如果data僅指定了mimeType,沒有指定URI,則data中URI的scheme的默認(rèn)值為file和content,所以Intent中URI的scheme也必須為file或content才能匹配到。
類似URI的結(jié)構(gòu),就是匹配URI的。
URI結(jié)果: scheme://host:port/[path|pathPrefix|pathPattern]
使用PackageManager的兩種方法判空。
第二個(gè)flag參數(shù)使用MATCH_DEFAULT_ONLY時(shí),表示僅僅匹配那些在intent-filter中聲明了android.intent.category.DEFAULT這個(gè)category的組件。
常用的Android性能優(yōu)化方法:
一、布局優(yōu)化:
1)盡量減少布局文件的層級(jí)。
層級(jí)少了,繪制的工作量也就少了,性能自然提高。
2)布局重用 include標(biāo)簽
3)按需加載:使用ViewStub,它繼承自View,一種輕量級(jí)控件,本身不參與任何的布局和繪制過程。他的layout參數(shù)里添加一個(gè)替換的布局文件,當(dāng)它通過setVisibility或者inflate方法加載后,它就會(huì)被內(nèi)部布局替換掉。
二、繪制優(yōu)化:
基于onDraw會(huì)被調(diào)用多次,該方法內(nèi)要避免兩類操作:
1)創(chuàng)建新的局部對(duì)象,導(dǎo)致大量垃圾對(duì)象的產(chǎn)生,從而導(dǎo)致頻繁的gc,降低程序的執(zhí)行效率。
2)不要做耗時(shí)操作,搶CPU時(shí)間片,造成繪制很卡不流暢。
三、內(nèi)存泄漏優(yōu)化:
1)靜態(tài)變量導(dǎo)致內(nèi)存泄漏 ? 比較明顯
2)單例模式導(dǎo)致的內(nèi)存泄漏?單例無法被垃圾回收,它持有的任何對(duì)象的引用都會(huì)導(dǎo)致該對(duì)象不會(huì)被gc。
3)屬性動(dòng)畫導(dǎo)致內(nèi)存泄漏 ?無限循環(huán)動(dòng)畫,在activity中播放,但是onDestroy時(shí)沒有停止的話,動(dòng)畫會(huì)一直播放下去,view被動(dòng)畫持有,activity又被view持有,導(dǎo)致activity無法被回收。
四、響應(yīng)速度優(yōu)化:
1)避免在主線程做耗時(shí)操作 包括四大組件,因?yàn)樗拇蠼M件都是運(yùn)行在主線程的。
2)把一些創(chuàng)建大量對(duì)象等的初始化工作放在頁(yè)面回到前臺(tái)之后,而不應(yīng)該放到創(chuàng)建的時(shí)候。
五、ListView的優(yōu)化:
1)使用convertView,走listView子View回收的一套:RecycleBin 機(jī)制
主要是維護(hù)了兩個(gè)數(shù)組,一個(gè)是mActiveViews,當(dāng)前可見的view,一個(gè)是mScrapViews,當(dāng)前不可見的view。當(dāng)觸摸ListView并向上滑動(dòng)時(shí),ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范圍,此時(shí)這些OnScreen的View就變得不可見了,不可見的View叫做OffScreen的View,即這些View已經(jīng)不在屏幕可見范圍內(nèi)了,也可以叫做ScrapView,Scrap表示廢棄的意思,ScrapView的意思是這些OffScreen的View不再處于可以交互的Active狀態(tài)了。ListView會(huì)把那些ScrapView(即OffScreen的View)刪除,這樣就不用繪制這些本來就不可見的View了,同時(shí),ListView會(huì)把這些刪除的ScrapView放入到RecycleBin中存起來,就像把暫時(shí)無用的資源放到回收站一樣。
當(dāng)ListView的底部需要顯示新的View的時(shí)候,會(huì)從RecycleBin中取出一個(gè)ScrapView,將其作為convertView參數(shù)傳遞給Adapter的getView方法,從而達(dá)到View復(fù)用的目的,這樣就不必在Adapter的getView方法中執(zhí)行LayoutInflater.inflate()方法了。
RecycleBin中有兩個(gè)重要的View數(shù)組,分別是mActiveViews和mScrapViews。這兩個(gè)數(shù)組中所存儲(chǔ)的View都是用來復(fù)用的,只不過mActiveViews中存儲(chǔ)的是OnScreen的View,這些View很有可能被直接復(fù)用;而mScrapViews中存儲(chǔ)的是OffScreen的View,這些View主要是用來間接復(fù)用的。
2)使用ViewHolder避免重復(fù)地findViewById
3)快速滑動(dòng)不適合做大量異步任務(wù),結(jié)合滑動(dòng)監(jiān)聽,等滑動(dòng)結(jié)束之后加載當(dāng)前顯示在屏幕范圍的內(nèi)容。
4)getView中避免做耗時(shí)操作,主要針對(duì)圖片:ImageLoader來處理(原理:三級(jí)緩存)
5)對(duì)于一個(gè)列表,如果刷新數(shù)據(jù)只是某一個(gè)item的數(shù)據(jù),可以使用局部刷新,在列表數(shù)據(jù)量比較大的情況下,節(jié)省不少性能開銷。
六、Bitmap優(yōu)化:
1)減少內(nèi)存開支:圖片過大,超過控件需要的大小的情況下,不要直接加載原圖,而是對(duì)圖片進(jìn)行尺寸壓縮,方式是BitmapFactroy.Options 采樣,inSampleSize 轉(zhuǎn)成需要的尺寸的圖片。
2)減少流量開銷:對(duì)圖片進(jìn)行質(zhì)量壓縮,再上傳服務(wù)器。圖片有三種存在形式:硬盤上時(shí)是file,網(wǎng)絡(luò)傳輸時(shí)是stream,內(nèi)存中是stream或bitmap,所謂的質(zhì)量壓縮,它其實(shí)只能實(shí)現(xiàn)對(duì)file的影響,你可以把一個(gè)file轉(zhuǎn)成bitmap再轉(zhuǎn)成file,或者直接將一個(gè)bitmap轉(zhuǎn)成file時(shí),這個(gè)最終的file是被壓縮過的,但是中間的bitmap并沒有被壓縮。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);
七、線程優(yōu)化:
使用線程池。為什么要用線程池?
1、從“為每個(gè)任務(wù)分配一個(gè)線程”轉(zhuǎn)換到“在線程池中執(zhí)行任務(wù)”
2、通過重用現(xiàn)有的線程而不是創(chuàng)建新線程,可以處理多個(gè)請(qǐng)求在創(chuàng)建銷毀過程中產(chǎn)生的巨大開銷
3、當(dāng)使用線程池時(shí),在請(qǐng)求到來時(shí)間 ,不用等待系統(tǒng)重新創(chuàng)建新的線程,而是直接復(fù)用線程池中的線程,這樣可以提高響應(yīng)性。
4、通過和適當(dāng)調(diào)整線程池的大小 ,可以創(chuàng)建足夠多的線程以使處理器能夠保持忙碌狀態(tài),同時(shí)還可以防止過多線程相互競(jìng)爭(zhēng)資源而使應(yīng)用程序耗盡內(nèi)存或者失敗。
5、一個(gè)App里面所有的任務(wù)都放在線程池中執(zhí)行后,可以統(tǒng)一管理 ,當(dāng)應(yīng)用退出時(shí),可以把程序中所有的線程統(tǒng)一關(guān)閉,避免了內(nèi)存和CPU的消耗。
6、如果這個(gè)任務(wù)是一個(gè)循環(huán)調(diào)度任務(wù),你則必須在這個(gè)界面onDetach方法把這個(gè)任務(wù)給cancel掉,如果是一個(gè)普通任務(wù)則可cancel,可不cancel,但是最好cancel
7、整個(gè)APP的總開關(guān)會(huì)在應(yīng)用退出的時(shí)間把整個(gè)線程池全部關(guān)閉。
八、一些性能優(yōu)化建議:
1)避免創(chuàng)建過多對(duì)象,造成頻繁的gc
2)不要過多使用枚舉,枚舉占用的空間比整型大很多
3)字符串的拼接使用StringBuffer、StringBuilder來替代直接使用String,因?yàn)槭褂肧tring會(huì)創(chuàng)建多個(gè)String對(duì)象,參考第一條。
4)適當(dāng)使用軟引用,(弱引用就不太推薦了)
5)使用內(nèi)存緩存和磁盤緩存。
1.調(diào)用系統(tǒng)的分享功能
2.通過第三方SDK,如ShareSDK,友盟等
3.自行使用各自平臺(tái)的SDK,比如QQ,微信,微博各自的SDK
本文只是關(guān)于如何實(shí)現(xiàn)Android系統(tǒng)分享,并非第三方SDK實(shí)現(xiàn)方法
Android開發(fā)時(shí)通過startActivity發(fā)送action為Intent.ACTION_SEND的Intent即很容易就可以實(shí)現(xiàn)系統(tǒng)分享功能,舉個(gè)簡(jiǎn)單例子看看:
從例子中,可以發(fā)現(xiàn)實(shí)現(xiàn)系統(tǒng)分享主要由三部分Action、Extras和Type組成。首先將Intent的cation設(shè)置為Intent.ACTION_SEND,其次根據(jù)分享的內(nèi)容設(shè)置不同的Type,然后根據(jù)不同的社交平臺(tái)設(shè)置相關(guān)Extras,最后將Intent發(fā)送出去即可完成系統(tǒng)分享。
1.如何將自己的應(yīng)用能夠顯示在系統(tǒng)分享的應(yīng)用選擇框中?
根據(jù)以上介紹,我們可以在應(yīng)用清單文件中使用intent-filter來完成;
2.如何監(jiān)聽在應(yīng)用選擇框中,選擇了那個(gè)應(yīng)用?
需要采用BroadcastReceiver來實(shí)現(xiàn):(該方法在部分手機(jī)上可以實(shí)現(xiàn),并且需要API Level大于等于22)
3.如何為制定應(yīng)用設(shè)置分享type?
4.如何只顯示指定的應(yīng)用?
Xfermode表示圖層的混合模式,用于描述兩個(gè)圖層之間進(jìn)行融合時(shí),像素點(diǎn)進(jìn)行計(jì)算的規(guī)則。
在API16之前,Xfermode有3個(gè)子類:AvoidXfermode、PixelXorXfermode、PorterDuffXfermode。但在API16以后,前兩個(gè)已經(jīng)過時(shí),甚至從源碼里移除,所以我們只需學(xué)習(xí) PorterDuffXfermode 即可。
PorterDuffXfermode 最早是在1984年由Porter和Duff兩人發(fā)表的論文《Compositing Digital Images》中出現(xiàn),所以該混合模式也根據(jù)作者來命名。
PorterDuffXfermode 構(gòu)造函數(shù)需要指定一個(gè) PorterDuff.Mode ,而PorterDuff.Mode在以下地方都會(huì)涉及:
它提供18種模式可選項(xiàng):
各種模式下的效果如下圖所示:
這里可以發(fā)現(xiàn),兩種效果是不一樣的,谷歌官方給的是第一種,但是,通常情況應(yīng)該是第二種,具體原因可 參考該文章 。比如我們畫一個(gè)矩形,應(yīng)該按第二種效果來考慮,因?yàn)樵磮D和目標(biāo)圖大小不一致;如果畫相同大小的Bitmap,則按第一種做。
在實(shí)際應(yīng)用中,我們可以從以下三個(gè)方面來決定使用哪種模式:
1、沒有硬件加速:
invalidate the view hierarchy ------ draw the view hierarchy
2、有硬件加速:
invalidate the view hierarchy ------ record and update the display list ------ draw the display list
1、繪制不正確:可能使用了不支持硬件加速的操作, 需要關(guān)閉硬件加速或者繞過該操作
2、拋出異常:可能使用了不支持硬件加速的操作, 需要關(guān)閉硬件加速或者繞過該操作
在Android系統(tǒng)中,有4個(gè)不同級(jí)別的打開或者關(guān)閉硬件加速操作:
1、Application級(jí)別:
application android:hardwareAccelerated="false"
默認(rèn)為true,用于控制這個(gè)app是否開啟硬件加速。
2、Activity級(jí)別:
activity android:hardwareAccelerated="false"
3、Window級(jí)別:(只支持開啟操作)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4、View級(jí)別:(只支持關(guān)閉操作)
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
LAYER_TYPE_HARDWARE ,使用硬件加速(GPU)進(jìn)行繪制
LAYER_TYPE_SOFTWARE ,使用CPU進(jìn)行繪制
或者布局文件中,指定以下屬性:
android:layerType="software"
1、view.isHardwareAccelerated()
如果返回true,表示view掛在一個(gè)開啟了硬件加速的Window之下,也就意味著,它在繪制時(shí),并不一定開啟了硬件加速。
2、canvas.isHardwareAccelerated()
如果返回true,因?yàn)橹鴆anvas在繪制的時(shí)候啟用了硬件加速,盡量采用此方法來判斷是否開啟了硬件加速。
分享文章:android總結(jié),android方法大全
文章位置:http://m.kartarina.com/article44/dsesghe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、ChatGPT、全網(wǎng)營(yíng)銷推廣、電子商務(wù)、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)