簡介:這是[Android底層開發]Android開發問題集錦,介紹了和java,有關的知識、技巧、經驗,和一些java源碼等。 1、Android Market上發軟體要注意哪些問題 很多網友可能都註冊了Android Market賬戶,但發布一款軟體如果要做到很周全需要考慮哪些問題呢? (一)、相容性 對於目前市面上Android裝置品牌種類定位繁多,這裡教程之家大致將這些分為幾類: (1). 按作業系統區分,Android 1.5,1.6和Android 2.0,2.1或2.2等幾個版本。 (2). 按螢幕解析度區分,目前WVGA是主流即480×800目前佔了近一半,當然還有一部分HVGA的320×480大概有45%的份額,至於QVGA的一些低端機相對較少比如Moto ME511、HTC Tattoo、HTC Aria和HTC Bee這幾款機型還是240×320的解析度比較少。 (3). 硬體或擴充庫,比如需要擴充包WiFi、GPS、GSM/GPRS模組、OpenGL 3D硬體加速器的。 面對上面的三種問題,這裡eoe社區可以告訴大家一個簡單的方法來處理比如說直接在androidmanifest.xml中設定,這樣Google的Android Market就可以自適應了。面對以上問題,解決方案分別為 (1). 重新設定use-sdk節點,比如僅僅讓android 2.0到2.1之間的使用者使用而2.2的使用者無法使用,可以設定為 其中中間數字代表API Level,而maxSdkVersion屬性在較早的SDK中不支援,可能ADT無法編譯通過。 (2). 解析度我們可以添加supports-screens節點,比如相容hvga和wvga的,可以這樣寫 這裡small代表qvga,normal就是hvga,而large是wvga或fwvga,最後的密度還牽扯到LCD螢幕問題 (3). 擴充庫,比如我們用到google maps包,或中移動的oms庫,可能需要 的字樣,當然硬體的問題還可以引入特性節點 比如 < android:glEsVersion=”0×00020000″> android:name=”android.hardware.camera” android:required=”true”/> 這裡就是我們的遊戲需要OpenGL ES 2.0的版本,如果需要2.1則值為0×00020001,需要更高的韌體才能支援,同時還必須要系統的網路攝影機硬體。 詳細的教程之家在這裡給大家列出來: android.hardware.camera.autofocus android.hardware.camera.flash android.hardware.sensor.light //光線感應器 android.software.live_wallpaper //動態壁紙 android.hardware.sensor.proximity 距離感應器 android.hardware.touchscreen.multitouch //多點觸控 android.hardware.telephony android.hardware.telephony.cdma android.hardware.telephony.gsm (二)、軟體的隱私問題 盡量不要聲明過多危險的permission,比如需要訪問使用者資訊,連絡人、簡訊、通話記錄、定位資訊等等,對於一般的程式調試反饋,Google已經在Android 2.2的韌體中加入了自動反饋和自己程式的logcat stack print功能,可以在Android Market的console後台查看。
2.MATCH_PARENT是什麼類型的布局 有網友表示對於很多工程中的MATCH_PARENT出現在layout中感到不明白,過去只有FILL_PARENT和WRAP_CONTENT那麼 match_parent到底是什麼類型呢? 其實從Android 2.2開始FILL_PARENT改名為MATCH_PARENT ,從APILevel為8開始我們可以直接用MATCH_PARENT來代替FILL_PARENT,最後教程之家提醒大家,他們的定義本質是一樣均為 -1,只是換了個別名,可能為了更準確些,比如最終在SDK中的定義為: fill_parent -1 The view should be as big as its parent (minus padding). This constant is deprecated starting from API Level 8 and is replaced by match_parent. match_parent -1 The view should be as big as its parent (minus padding). Introduced in API Level 8. wrap_content -2 The view should be only big enough to enclose its content (plus padding).
3.Android分行符號變成方框的解決方案 我們都知道Android是基於Linux核心的,在處理分行符號時使用的是\n而Windows伺服器處理分行符號為\r\n這樣的方式,對於顯示\r 即斷行符號符在Android上面可能就變成了黑色的方框或者說方塊,我們在Android的TextView或EditView等文本顯示控制項上將\r\n 替換成\n即可。
4.View的顯示狀態GONE,VISIBLE和INVISIBLE區別 很多網友可能會發現View類的設定顯示狀態setVisibility方法有三種情況,分別為GONE、VISIBLE和INVISIBLE,它們之間到底有哪些區別呢? 教程之家給大家舉個簡單的例子。可能很多網友會發現有些Android應用的下麵包含了AdMob或Adsense廣告條,如果這個View 我們設定為GONE則消失,該廣告條看不見也不佔用位置。而INVISIBLE則代表廣告條那塊是空白,但仍然沾著他布局高和寬的位置,而VISIBLE 就是標準顯示時的狀態。
5.android單一實例運行方法 我們都知道Android平台沒有工作管理員,而內部App維護者一個Activity historystack來實現視窗顯示和銷毀,對於常規從捷徑運行來看都是startActivity可能會使用FLAG_ACTIVITY_NEW_TASK標記來開啟一個新視窗,比如Launcher,所以考慮單任務的實現方法比較簡單,首先教程之家糾正下大家一種錯誤的方法就是直接在androidmanifest.xml的application節點中加入android:launchMode=”singleInstance”這句,其實這樣將不會起到任何作用,Apps內部維護的曆史棧作用於Activity,我們必須在activity節點中加入android:launchMode=”singleInstance” 這句才能保證單一實例,當然一般均加在主程式啟動視窗的Activity。
6.Droid2無法識別ADB問題解決方案 目前來說Motorola Droid2手機無法識別ADB,雖然通過Moto內建的驅動安裝可以在Windows XP/7上安裝裝置驅動,但在Eclipse中可以看到DDMS的Device Manager無法識別,這問題問題以往也出現過,主要原因是你當前的ADT外掛程式版本太低,一般Google每次推出一個高版本的韌體,比如 Android 2.2則對於ADT外掛程式也將會升級使其一些特性將支援。
7.ListView和ScrollView同時使用Bug 很多網友可能發現ListView或ScrollView這樣的組件放在一起套嵌會出現無法正常顯示的bug,比如典型的例子就是ScrollView 中包含的ListView只能顯示2行左右,而ListView中的資料肯定遠大於2個,這樣的問題教程之家推薦大家可以通過重寫ListView的onMeasure方法來重新設定控制項的顯示高度,在onMeasure中我們使用setMeasuredDimension方法重新設定控制項的顯示尺寸。同樣對於部分網友提到的水平滾動ListView仍然適用,當然可能還有一部分網友可能使用HorizontalScrollView來實現。
8.px像素如何轉為dip裝置獨立像素 最近有網友問如何將px像素轉為dip獨立裝置像素,由於Android的裝置解析度眾多,目前主流的為wvga,而很多老的裝置為hvga甚至低端的qvga,對於相容性來說使用dip無非是比較方便的,由於他和解析度無關和螢幕的密度大小有關,所以推薦使用,不過這裡教程之家提示大家,ophoneos的手機對於dip的支援糟糕透了,顯示的結果會放大很多,同時黑色的主題會導致常規的黑色文字讓使用者無法分辨。 px= (int) (dip*density+0.5f) //這裡eoe社區提示大家很多網友擷取density的方法存在問題,從資源中擷取的是靜態定義的,一般為1.0對於HVGA是正好的,而對於wvga 這樣的應該從WindowsManager中擷取,WVGA為1.5
9.Android的Btimap處理大圖片解決方案 我們都知道Android的Dalvik VM為一個應用提供了大約16MB的記憶體,一般我們處理超過8MB的圖片將會出現OutOfMemoryError異常,我們解碼一個圖片為了防止記憶體不足的異常我們可以使用BitmapFactory.Options 的udeinTempStorage屬性解決,代碼如下:
BitmapFactory.Options cwj = new BitmapFactory.Options(); cwj.inTempStorage = new byte[1024*1024*5]; //5MB的臨時儲存空間 Bitmap bm = BitmapFactory.decodeFile(inputStream,cwj); //這裡cwj為Options屬性 10.android下解析xml檔案遇到中文問題 很多Android開發人員可能一直抱怨xml解析庫不夠完善,對於國內很多server並不是標準的utf-8編碼,遇到中文時可能解析器會停止或解析出來的是亂碼。這裡教程之家給大家說下常見的解決方案: (一)、android sax庫遇到gbk或gb2312編碼時
方法1. 可以顯示的指明編碼比如: InputSource is = new InputSource(inputStream); is.setEncoding(“UTF-8″); 方法2. 使用InputStreamReader轉換 在SDK中可以查看有這樣執行個體化方法,參數二為字元集 InputStreamReader(InputStream in,Charset charset)
具體使用可以是 InputSource is=new InputSource(new InputStreamReader(inputStream,”gb2312″)); 有關InputSource的細節,我們遵循如果有字元流可用,則解析器將直接讀取該流,而忽略該流中找到的任何文本編碼聲明。如果沒有字元流,但卻有位元組流,則解析器將使用該位元組流,從而使 用在InputSource 中指定的編碼,或者另外(如果未指定編碼)通過使用某種諸如 XML 規範 中的演算法演算法自動探測字元編碼。如果既沒有字元流,又沒有位元組流可用,則解析器將嘗試開啟到由系統標識符標識的資源的 URI 串連 。
|