編輯:關於Android編程
一、ANR異常(Application Not Responding)應用程序無響應
ANR定義:一個流暢的合理的應用程序中不能出現anr,而讓用戶每次都要處理這個對話框。在程序裡對響應性能的設計很重要,這樣系統不會顯示ANR給用戶。
默認情況下,在android中Activity的最長執行時間是5秒,BroadcastReceiver的最長執行時間則是10秒。
第一:什麼會引發ANR?(主要原因歸結為一句話:在主線程裡面做了耗時操作)
在Android裡,應用程序的響應性是由Activity Manager和WindowManager系統服務監視的 。當它監測到以下情況中的一個時,Android就會針對特定的應用程序顯示ANR:
1.在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)
2.BroadcastReceiver在10秒內沒有執行完畢
造成以上兩點的原因有很多,比如在主線程中做了非常耗時的操作,比如說是下載,io異常等。
潛在的耗時操作,例如網絡或數據庫操作,或者高耗時的計算如改變位圖尺寸,應該在子線程裡(或者以數據庫操作為例,通過異步請求的方式)來完成。
第二:如何避免ANR?
1、運行在主線程裡的任何方法都盡可能少做事情。特別是Activity應該在它的關鍵生命周期方法(如onCreate()和onResume())裡盡可能少的去做創建操作。(可以采用重新開啟子線程的方式,然後使用Handler+Message的方式做一些操作(使用消息機制),比如更新主線程中的ui等)
2、應用程序應該避免在BroadcastReceiver裡做耗時的操作或計算。
總結:anr異常也是在程序中自己經常遇到的問題,主要的解決辦法自己最常用的就是不要在主線程中做耗時的操作,而應放在子線程中來實現,比如采用Handler+mesage的方式,或者是有時候需要做一些和網絡相互交互的耗時操作就采用asyntask異步任務的方式(它的底層其實Handler+mesage有所區別的是它是線程池)等,在主線程中更新UI。
二、具備良好的編碼風格, 重視代碼結構.
抽取是屬於編碼風格這一塊的內容的
要具備良好的編碼風格,抽取必不可少。
抽取是為了保證代碼的結構清晰,便於後期維護。
代碼首先是給人看的,然後才是給機器看的。
良好的編碼風格包括:
1)代碼與代碼之間的空行(如果代碼塊之間的關聯不是很大)。
2)方法一定要寫注釋,特別是方法的功能和參數。
3)方法抽取到一個單獨的工具類中,把常量抽取到一個單獨的類中
4)多個頁面之間對相同的部分進行抽取,一般抽取成一個抽象類。
5 )Android界面中字符串常量、色彩、尺寸的抽取。
6 )務器端開發中 數據操作接口的抽取(三層架構) (對接口的抽取是一種解耦的方式)
7)業務邏輯的過程中,可能要抽取接口,實現接口回調 。
8)類、方法、變量的命名要規范 做到見名知意。
9)代碼的縮進,格式化;代碼格式化一定要提交一個版本。
三、服務器端的開發特點:
Servlet------->dao(對數據庫進行增刪改查)------->dao.imlp------->數據庫的創建和組織
服務器端三層架構:
1:數據訪問層:是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據.
2:業務邏輯層:主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理。
3:表示層(api):主要表現為WEB方式,如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。表示層:主要對用戶的請求接受,以及數據的返回,為客戶端提供應用程序的訪問。
四、移動互聯網產品的特點:
1、用戶體驗:
1)視覺設計:Android UI設計規范,界面設計友好。
2)手機卡頓:a手機本身響應性能差、b從服務期端獲取數據慢。
3)發熱:CPU計算過多導致的,比如短時間內加載大量圖片。(文件讀寫操作)
4)耗電量:硬件(單核到多核、手機屏幕變大)、app功能。
5)重量大小:體現在在電池大小和外殼材質。
2、安全性:存儲空間足夠大,能夠存儲大量的個人信息,如何確保信息的安全性,這是我們急需解決的問題----好萊塢明星艷照洩露事件。
手機中存儲了大量的個人信息數據,如何進行保護?
五、產品設計理念:
產品設計要以用戶為中心,設計要滿足用戶的需求。准確定位用戶,用戶用你的產品能做什麼?
就如同玩游戲,一定要給用戶帶來快樂,讓用戶高興。
用戶關注的是(用戶體驗):耗電、發熱量、(用戶體驗最直觀的是視覺設計)、響應速度(卡頓)。
降低耗電和發熱量,手機用戶很在意這兩點。
總而言之,在移動設備的開發上,三大類問題
1)性能的問題,
2)界面響應的問題
3)產品的穩定性問題,是移動開發人員需要最為注意和保障的。
對於耗電量的理解:
1)手機硬件的變化是導致耗電量增加的一個主要原因,隨著智能手機的發展,手機內部已經發生了翻天覆地的變化,從單核手機到雙核手機,一直發展到八核手機,手機運算速度的提升也意味著需要更強的電力。
2)手機屏幕也紛紛向著大屏發展,從3.5寸到現在的7寸,巨大的手機屏幕也是造成手機耗電量增加的一個主要原因。
3)功能增加造成耗電增加。現在的手機發展已經將人們帶入了一個全新的移動互聯網世界,WIFI、藍牙、高達百兆的4G網絡、海量的應用軟件,這些功能的使用無不需要電力的支持,尤其是在手機上觀看互聯網視頻、玩游戲等行為,異常耗費手機電量。
許多功能的使用需要電力的支持,在手機上觀看互聯網視頻、玩游戲等行為異常耗電。
4)手機用戶沒有養成良好的使用習慣也是耗電量大的重要原因。手機智能化意味著可以同時啟動多個任務,不少用戶在使用過程中,沒有及時關閉後台程序,導致多個後台程序同時運行,手機後台在持續高強度運作的過程中,耗電量自然就會加大。
同時啟動多個任務,沒有及時關閉後台程序,多個後台程序同時運行。
網絡保持在線也需要耗費一定的電量。
深色壁紙要比淺顏色的壁紙更省電。
在聲音優化方面,一般情況下應該盡量把電鈴調低。
在工具使用方面,可以通過一些工具軟件幫助我們優化手機節能。
任何App包括後台Service應該盡可能減少喚醒CPU的次數,Android的預加載機制。
那麼如何優化耗電量呢?
1)第一,不要設計復雜算法。
在開發一個模塊前先想想會不會費電,如果會,就不要去做。代碼是為了服務用戶,而不是折騰用戶。在手機上實現精巧的算法
2)第二,不要在後台濫用Service。Android非常開放,開發者可在後台觸發任何處理邏輯,肆意占用CPU和內存。
3)第三,網絡請求不要太頻繁。系統組件中最耗電的是屏幕,其次就是網絡。
☆通過代碼優化耗電量:(至少能給面試官講出來)
BatteryManager;EXTRA_LEVEL電池當前的電量狀態。
1)如果電池在充電,發揮app的刷新率
2)如果電池電量低,禁止後台服務更新
<-------------------------------------------------------------->
手機重量:對於女士來說,手機還是輕一點比較好。
<--------------------------------------------------------------->
1)手機發熱的根本原因是:Cpu運算過多導致、手機使用時間太長、運行的軟件太多。
2)手機發熱最明顯的危害就是:
加速手機裡面配件的老化;手機如果發熱的很厲害也有可能有爆炸危險;有些手機發熱,會有可能自動重啟或者卡機。
3)A:一般非正常情況下(包括打游戲,打電話)高頻運轉的時候就會出現手機明顯的發熱現象,有些游戲需要超頻的cpu支持。當然處理器運行得越快,手機產生的熱量就越多;
B:手機的內部空間比較狹小,而且普遍手機散熱比較的差。
手機功耗越大,就需要電池放電快,電池快速放電也會發熱,從而導致手機CPU和電池的溫度較高。
性能越好,功耗就越大。性能指:cpu的運算速度。
4)如何散熱呢?減少cpu的運算次數,降低耗電量耗電就是散熱最根本的原因.
最好下載一個手機溫度檢測工具。
<--------------------------------------------------------------->
從服務期端獲取數據慢:這種現象產生的原因有哪幾點,如何解決呢?
1)可能是因為服務器端有連接人數限制的導致,使用負載均衡技術進行解決。
2)對服務器端數據進行查詢的時候,sql語句比較臃腫;要通過優化sql語句,來提高數據庫的性能。
<--------------------------------------------------------------->
六、Android安全性:
1)應用程序簽名達到保護軟件的目的。
2)權限拒絕。
3代碼混淆。
權限是 Android 平台的一種安全機制,以允許或限制應用程序訪問受限的 API和資源。
默認情況下,Android 應用程序沒有被授予任何權限,不允許它們訪問設備上受保護的 API或資源,從而保證了它們的安全。權限必須被請求,定義了定制的權限,文件和內容提供者就可以受到保護。確保在運行時檢查、執行、授予和撤銷權限。
創建Android 應用程序時可以考慮采用調試模式和發布模式。
七、視覺設計:主要體現在app的界面上
App設計應該以用戶為中心,滿足用戶的需求。產品好不好,是用戶說了算。
視覺設計:1)應該把握細節。
2)界面上的元素應該分清主次,讓視覺層級清晰,提高界面的易讀性。
3)重視留白:留白能讓頁面充滿更多的呼吸空間。讓段落和句子更加清爽利落,讓重要的視覺元素更加突出。
4)設計界面時,盡量多畫草圖。
5)視覺設計最根本的目的是:去掉界面上一些花哨、不能解決實際問題的功能和元素,從而讓頁面更具功能性。界面上每一個存在的元素都應該有其意義。
八、內存洩露:該釋放的資源沒有釋放
1、萬惡的static
static是個好東西,聲明賦值調用就是那麼的簡單方便,但是伴隨而來的還有性能問題。由於static聲明變量的生命周期其實是和APP的生命周期一樣的,有點類似與Application。如果大量的使用的話,就會占據內存空間不釋放,積少成多也會造成內存的不斷開銷,直至掛掉。
2、Cursor及時關閉
在查詢SQLite數據庫時,會返回一個Cursor,當查詢完畢後,及時關閉,這樣就可以把查詢的結果集及時給回收掉。
3、BroadCastReceiver、Service
綁定廣播和服務,一定要記得在不需要的時候給解綁。
4、I/O流
I/O流操作完畢,讀寫結束,記得關閉
5、構造Adapter時,沒有使用緩存的convertView 3
6、Bitmap對象不在使用時調用recycle()釋放內存4
九、屏幕適配:(代碼適配)
這篇博客主要介紹的是 Android 主流各種機型和各種版本的懸浮窗權限適配,但是由於碎片化的問題,所以在適配方面也無法做到完全的主流機型適配懸浮窗適配懸浮窗適配有兩種方
在前幾天寫過一個使用glide-transformations的方法實現高斯模糊的方法,今天偶然間有發現一個大神寫的另一個方法,感覺挺不錯的,分享一下:效果圖:原文鏈接:
文件存儲是 Android 中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式化處理,所有數據都是原封不動的保存到文件當中的。概述文件存取的核心就是輸入流和輸出流
SwipeBackLayout其實github上已經有這個開源庫了,我是個菜鳥,我喜歡用開源庫,同時也非常好奇它的實現原理。很多大神寫的代碼注釋都特別少,可能是他們覺得很