編輯:關於Android編程
本文實例講述了Android編程之Sdcard相關代碼。分享給大家供大家參考,具體如下:
1. 檢測Sdcard是否可用:
public static boolean sdCardIsAvailable() { String status = Environment.getExternalStorageState(); if (!status.equals(Environment.MEDIA_MOUNTED)) { return false; } return true; }
2. 獲得程序在sd卡上的cahce目錄:
private static boolean hasExternalCacheDir() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; } /** * @param context 上下文 * @return The external cache dir SD卡路徑 */ private static String getExternalCacheDir(Context context) { // android 2.2 以後才支持的特性 if (hasExternalCacheDir()) { return context.getExternalCacheDir().getPath() + File.separator + "gesture"; } // Before Froyo we need to construct the external cache dir ourselves // 2.2以前我們需要自己構造 final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/gesture/"; return Environment.getExternalStorageDirectory().getPath() + cacheDir; }
3. 獲取Sdcard的實際空間大小:
public static long getRealSizeOnSdcard() { File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize; }
----->檢測Sdcard是否有足夠的空間:
/** * @param updateSize 指定的檢測空間大小 * @return True 空間足夠返回true,不足返回false */ public static boolean enoughSpaceOnSdCard(long updateSize) { String status = Environment.getExternalStorageState(); if (!status.equals(Environment.MEDIA_MOUNTED)) return false; return (updateSize < getRealSizeOnSdcard()); }
4. 獲取手機的存儲大小:
public static long getRealSizeOnPhone() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); long realSize = blockSize * availableBlocks; return realSize; }
---->檢測手機存儲是否有足夠的空間:
/** * @param updateSize 指定的檢測空間大小 * @return 空間足夠返回true,不足返回false */ public static boolean enoughSpaceOnPhone(long updateSize) { return getRealSizeOnPhone() > updateSize; }
附帶點很久之前的記憶小贈品:
1. 在Android.mk中加入LOCAL_CERTIFICATE := platform就可以使用系統隱藏api(@hide)。
2.Activity的啟動模式總結:
1). standard:
堆棧(task):與應用程序的其他已啟動過的Activity在同一個堆棧
實例創建:每次啟動都會創建新的實例
2). singleTop:
堆棧(task):與應用程序的其他已啟動過的Activity在同一個堆棧
實例創建:啟動時,檢查是否有該Activity的實例在當前的棧頂(啟動過的記錄)。若有,則不再創建新實例,若無,則重新創建新實例,置於棧頂。
3). singleTask:
堆棧(task): 與應用程序的其他已啟動過的Activity在同一個堆棧
實例創建:啟動時,檢查task中是否有該Activity的實例。若有,則將task中在該Activity實例之上的所有其他Activity實例統統出棧(pop),
使其在棧頂。若無,則重新創建該Activity實例,置於棧頂。
4). singleInstance:
堆棧(task):與另外其他三種模式不同,會新建一個task,將Acitvity放置於這個新的task中,並保證不再有其他Activity實例進入.
實例創建:第一次創建時,會新建一個task,將其至於新的task中。若實例已存在,在啟動時,無需再創建新實例,復用之前已創建的實例。
3.設置Activity的背景為手機桌面的背景:
在setContentView方法之前添加getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER),
然後在AndroidManifest.xml文件中添加android:theme="@android:style/Theme.Translucent"屬性,實現將該Activity設置為透明。
4.查看手機內存空間代碼long freeMemory = Runtime.getRuntime().freeMemory();
5.關於Android主線程:
android中的主線程是UI線程,它是針對android中的UI組件操作的線程,而android中UI組件操作要求是非線程安全的,
畢竟UI組件的更新操作要求快速響應,如果更新時考慮線程安全,同步鎖等待響應之類的,那麼UI組件的更新響應就有可能會延遲,
這樣話就不符合Android要求盡可能規避的ANR異常。
6.Android4.4系統發布了一個ART運行時,准備用來替換掉之前一直使用的Dalvik虛擬機,希望籍此解決飽受诟病的性能問題。
7. 引用相關:
SoftReference<T>:軟引用-->當虛擬機內存不足時,將會回收它指向的對象;需要獲取對象時,可以調用get方法。
WeakReference<T>:弱引用-->隨時可能會被垃圾回收器回收。
softReference多用作來實現cache機制,weakReference一般用來防止內存洩漏,要保證內存被VM回收 .
8.TCP和UDP
由於面向連接的TCP協議在發生數據丟包時,會要求重傳,這會
影響視頻的實時性。UDP由於其是面向事務的,且簡單不可靠的傳輸協議,
在傳輸視頻數據當中具有快捷,消耗資源小的特點,簡單的傳輸過程中產生的
丟包和亂序是可以在視頻接收端處理的。所以一般采用UDP協議作為多媒體通信的傳輸層協議。
9.內存相關:
1). 一個進程的內存可以由2個部分組成:java 使用內存 ,C 使用內存 ,
這兩個內存的和必須小於16M(16M是怎麼來的?算是實驗來的吧,每個機型不一樣,模擬器不同版本也不一樣,可以通過:
Runtime.getMaxMemory() 來查看。),不然就會出現大家熟悉的OOM,這個就是第一種OOM的情況。
2). 更加奇怪的是這個:一旦內存分配給Java後,以後這塊內存即使釋放後,也只能給Java的使用,這個估計跟java虛擬機裡把內存分成好幾塊進行緩存的原因有關,反正C就別想用到這塊的內存了。
10.獲取底部虛擬按鍵高度(針對沒有物理按鍵的手機):
/** * 獲取底部虛擬按鍵高度(針對沒有物理按鍵的手機) * @return */ private int getNavigationBarHeight() { int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { return getResources().getDimensionPixelSize(resourceId); } return 0; }
希望本文所述對大家Android程序設計有所幫助。
AIDL是Android實現IPC的一種重要的方式,理解它的原理對理解Android進程間通信有很大的幫助。AIDL的定義,已經有很多介紹的文章了,這裡就不做詳解了。我們
前言由於Android自帶的TextView控件沒有提供傾斜的(我暫時沒有找到),我們可以自定義控件來實現,下面首先來看我們實現的效果圖。TextView文字傾斜其實實現
先看看效果圖:這裡介紹的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一轍,因為這個開源項目模塊化很棒
SlidingMenu是一個第三方的開源的側滑控件。是一種很好的交互邏輯。有很多優秀的應用使用了SlidingMenu例如QQ和CSDN的安卓客戶端 其gith
折騰一下午,遇到若干問題:如,設置水平HORIZONTAL時,占用多個跨