每天一點小知識(3)

以下是本人在工作過程中用過或者涉及到的一些知識點,在這裏分享和記錄一下。

1、Android中圖片佔用內存

Android中一張圖片(BitMap)佔用的內存主要和以下幾個因數有關:圖片長度,圖片寬度,單位像素佔用的字節數。
一張圖片(BitMap)佔用的 內存 = 圖片長度 * 圖片寬度 * 單位 像素佔用的字節數。而和圖片本身的大小沒有關係。
注 : 圖片長度和 圖片寬度的單位是像素。

2、Bitmap內存位置

在Android4.0之前,Bitmap的內存是分配在Native堆中,調用recycle()可以立即釋放Native內存。
從Android4.0開始,Bitmap的內存就是分配在dalvik堆中,即JAVA堆中的,調用recycle()並不能立即釋放Native內存,但是調用recycle()是一個良好的習慣。

3、編譯類和原來的類源碼的區別

已編譯類和原來的類源碼區別在於,已編譯類只包含類本身,內部類不會在已編譯類中出現,而是生成另外一個已編譯類文件;其二,已編譯類中沒有註釋;其三,已編譯類沒有package和import部分。

4、Activity的moveTaskToBack方法

大家可能不知道Activity有moveTaskToBack這樣一個方法。應用場景是有些activity諸如引導圖之類的,用戶在按返回鍵的時候你並不希望退出(默認就finish了),而是隻希望放置到後臺,那就可以調這個方法。
public boolean moveTaskToBack(boolean nonRoot)
參數說明如下:
nonRoot=false→ 僅當activity爲task根(即首個activity例如啓動activity之類的)時才生效
nonRoot=true→ 忽略上面的限制
這個方法不會改變task中的activity中的順序,效果基本等同於home鍵。

5、設置背景圖片的方法

android 16以下不支持setBackground函數,會導致異常,應該使用,setBackgroundDrawable或者 setBackgroundResource。

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.item_selector_border));
} else {
    convertView.setBackground(getResources().getDrawable(R.drawable.item_selector_border));
}

或者直接使用setBackgroundResource方法:

convertView.setBackgroundResource(R.drawable.item_selector_border);

6、minSdkVersion、maxSdkVersion、targetSdkVersion、target,compileSdkVersion,buildeToolVersion六個屬性分別是什麼意思?有何區別?

minSdkVersion與maxSdkVersion比較容易理解,就是在安裝程序的時候,如果目標設備的API版本小於minSdkVersion, 或者大於maxSdkVersion,程序將無法安裝。一般來說沒有必要設置maxSdkVersion。
targetSdkVersion相對複雜一些,如果設置了此屬性,那麼在程序執行時,如果目標設備的API版本正好等於此數值, 它會告訴Android平臺:此程序在此版本已經經過充分測,沒有問題。不必爲此程序開啓兼容性檢查判斷的工作了。 也就是說,如果targetSdkVersion與目標設備的API版本相同時,運行效率可能會高一些。 但是,這個設置僅僅是一個聲明、一個通知,不會有太實質的作用, 比如說,使用了targetSdkVersion這個SDK版本中的一個特性,但是這個特性在低版本中是不支持的 ,那麼在低版本的API設備上運行程序時,可能會報錯:java.lang.VerifyError。也就是說,此屬性不會幫你解決兼容性的問題。 你需要在minSdkVersion這個版本上將程序完整的跑一遍來確定兼容性有沒有問題。
project.properties中的target是指在編譯的時候使用哪個版本的API進行編譯。compileSdkVersion是選擇的SDK的版本號,也就是API Level。和project.properties相同。
buildeToolVersion是你構建工具的版本,其中包括了打包工具aapt、dx等等。

7、按鈕快速點擊出現兩個activity的問題

當快速點擊按鈕調用activity時,如果activity在Manifest中的註冊方式爲android:launchMode=”normal”,則會出現彈出兩個甚至多個的activity,可以將其launchMode修改爲singleTask解決此問題。
但是如果啓動的activity需要調用onActivityResult方法,而使用singleTask時,就不能調用到onActivityResult函數了,解決的方案是launchMode依舊爲normal,但是啓動時,可以傳遞一個參數,
FLAG_ACTIVITY_BROUGHT_TO_FRONT,這樣可以起到啓動一個activity的作用。

8、關於LayoutInflater

獲取LayoutInflater有三種方法,

(1)、

LayoutInflater inflater=(LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);

(2)、

LayoutInflater inflater = LayoutInflater.from(Activity.this);

(3)、

LayoutInflater inflater = getLayoutInflater();

這三種方法得到的結果是相通的。

9、使用adb shell pm安裝程序

(1)、先push apk到手機:

adb push xxx.apk /data/local/tmp/com.xxx.xxxx

(2)、安裝apk:

adb shell pm install -r “/data/local/tmp/com.xxx.xxxx”

10、獲取android系統版本號等信息

String phoneInfo=
"手機型號:" + android.os.Build.MODEL + 
",SDK版本:" + android.os.Build.VERSION.SDK + 
",系統版本:" + android.os.Build.VERSION.RELEASE+
",軟件版本:"+getAppVersionName(this); 

這裏寫圖片描述

歡迎您掃一掃上面的微信公衆號,訂閱我的個人公衆號!
本公衆號將以推送Android各種碎片化小知識或小技巧,以及整理Android面試知識點爲主,也會不定期將開發老司機日常工作中踩過的坑,平時自學的一些知識總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章