版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Android應(yīng)用開發(fā)兼容性問題整理(僅供內(nèi)部使用)Android應(yīng)用開發(fā)兼容性問題整理目錄TOC\o"1-5"\h\z\o"CurrentDocument"案例描述 2\o"CurrentDocument"案例分析 2\o"CurrentDocument"解決兼容性問題的利器 2\o"CurrentDocument"Dialog.setMessage(Stringstr) 3\o"CurrentDocument"不要用AutoCompleteBox組件 4\o"CurrentDocument"快捷方式 5\o"CurrentDocument"Android類庫中.InetAddress的差異 8\o"CurrentDocument"手機(jī)廠商兼容性評(píng)分 9總結(jié) 10關(guān)鍵詞:Android,兼容性問題摘要:Google的戰(zhàn)略造成Android生態(tài)系統(tǒng)的混亂,混亂給Android應(yīng)用開發(fā)帶來阻力,本案例總結(jié)了幾個(gè)本人工作中遇到的Android兼容性問題,提供一些解決思路,避免浪費(fèi)時(shí)間。由于本人工作是Android的應(yīng)用開發(fā),本案例不討論硬件方面的問題。模板編號(hào):模板版本:V1.0Beta1.0第1頁共13頁1案例描述Android應(yīng)用開發(fā)的同學(xué),在工作中一定會(huì)經(jīng)常遇到這樣的場景:測試人員拿著手機(jī),氣勢洶洶的過來,“這個(gè)bug剛改好,怎么又有了?”,開發(fā)的同學(xué)皺起眉頭找原因,同樣的程序在三星手機(jī)上策馬奔騰,卻在魅族手機(jī)上折戟沉沙。做web開發(fā)的尤其做前端的同學(xué),都知道各瀏覽器之間存在兼容性問題。Android應(yīng)用開發(fā)中同樣存在令人頭疼的兼容性問題,如鬼魅一般如影隨形,隱匿在開發(fā)的各個(gè)角落。本篇案例,就以本人艱苦卓絕的一年Android應(yīng)用開發(fā)經(jīng)驗(yàn)為基礎(chǔ),整理出一些Android兼容性問題。希望能夠?yàn)殚_發(fā)人員提供一些解決思路,少走彎路。需求人員可以以此為參照,在做需求的時(shí)候避免一些兼容性問題頻發(fā)的地方,不要折騰。測試人員也可以閱讀此案例,做好測試Android應(yīng)用的思想準(zhǔn)備。在案例最后,也會(huì)總結(jié)一下幾個(gè)廠商的手機(jī)在兼容性上的表現(xiàn),需求、開發(fā)、測試人員在做Android應(yīng)用相關(guān)工作的時(shí)候,多加注意。2案例分析2.1解決兼容性問題的利器Android操作系統(tǒng)由于Google的開源推廣,慘遭各大手機(jī)生產(chǎn)廠商修改折騰,同一版本號(hào)的Android系統(tǒng)在不同的手機(jī)上會(huì)出現(xiàn)差別。再者,Android一出世便身負(fù)重任,版本更新的速度非??欤@也導(dǎo)致了不同Android版本會(huì)有差別。甚者,同一家手機(jī)廠商推出不同型號(hào)的手機(jī)采用不同的Android系統(tǒng)版本、是否修改Android源碼,都會(huì)引起應(yīng)用程序的一些表現(xiàn)差異。所以,我們在碰到了兼容性問題的時(shí)候,找尋的直接原因要從系統(tǒng)版本、手機(jī)廠商、手機(jī)型號(hào)等方面入手。幸好,Androidapi提供的android.os.Build類能夠?yàn)槲覀兲峁┻@些信息,從而根據(jù)這些信息對(duì)應(yīng)用程序做適當(dāng)?shù)奶幚?。下面列舉了,android.os.Build類中比較常用的靜態(tài)成員變量。android.os.Build.MANUFACTURER :生產(chǎn)廠商android.os.Build.MODEL:設(shè)備名android.os.Build.VERSION.SDK:sdk版本號(hào)android.os.Build.VERSION.SDK_INT:sdk版本號(hào),int類型
2.2Dialog.setMessage(Stringstr)貼代碼:publicvoidopenVersionDialog(finalContextcontext,finalStringmessage,StringfileName,StringfileSize)(AlertDialog.Builderdialog=newAlertDialog.Builder(context);dialog.setTitle(context.getString(R.string.new_version));Stringmsg=context.getString(R.string.version_info)+message+context.getString(R.string.install_package,fileSize);dialog.setMessage(msg);dialog.create();dialog.show();}上面的代碼,是為了進(jìn)行一個(gè)彈出框提示,同樣的代碼,不同手機(jī)上dialog.setMessage(msg)的表現(xiàn)不同。圖2-2-1Meizu手機(jī)dialog.setMessage(msg)的表現(xiàn)不同。圖2-2-1Meizu手機(jī)圖2-2-2Philips手機(jī)對(duì)于dialog.setMessage(msg對(duì)于dialog.setMessage(msg)的處理,Meizu手機(jī)中的字段是居中對(duì)齊的,而目前測試到別的廠商的手機(jī)都是左對(duì)齊,三星、Philips、Htc都是左對(duì)齊。如果開發(fā)人員被要求修改MeizuAndroid應(yīng)用開發(fā)兼容性問題整理手機(jī)的表現(xiàn),有兩種解決思路。一種思路是:通過android.os.Build.MANUFACTURER判斷是否是Meizu手機(jī),如果是Meizu手機(jī)則不用dialog.setMessage(Stringmsg)方法,而創(chuàng)建一個(gè)顯示文字的view,然后用dialog.setView(Viewlayout)方法。第二種思路是不采用dialog.setMessage(Stringmsg)方法,全部米用dialog.setView(Viewlayout)方法。第三種思路則不用Dialog類,彈出框采用自定義Activity。不要用AutoCompleteBox組件大家在平時(shí)上網(wǎng)的時(shí)候,都會(huì)有這樣的經(jīng)歷,在Baidu的搜索框中,輸入字符串,Baidu會(huì)彈出一個(gè)下拉框,下拉框中有跟你輸入的字符串相聯(lián)系的一些字符串。這在web中是一個(gè)常見的應(yīng)用,你輸入一個(gè)字符,頁面發(fā)送ajax請(qǐng)求給后端,后端經(jīng)過處理,返回相關(guān)的字符串,然后顯示在前端頁面。那么有人,就會(huì)問,能不能把這種應(yīng)用搬到手機(jī)應(yīng)用上。答案是可以的,而且Google也給我們提供這樣的組件。但只能說,這人有聯(lián)想,但沒經(jīng)驗(yàn)。2.2中介紹的問題,目前測試只Meizu手機(jī)出現(xiàn),如果是AutoCompleteBox組件,則多種手機(jī)會(huì)出現(xiàn)不同的癥狀。dropdowndropdownselection圖2-3-1AutoCompleteBox示例如圖2-3-1,AutoCompleteBox組件包括textbox、drop-down、selectionadapter三個(gè)部分。圖中,adapter中有四個(gè)Item,Item中可以設(shè)置背景圖片。單獨(dú)的一個(gè)AutoCompleteBox組件感覺不錯(cuò),但在實(shí)際的測試中,同一代碼在不同的機(jī)型會(huì)出現(xiàn)各種差異,這些差異存在于組件的不同的地方。例如:1)Item與selectionadapter左邊框、右邊框的距離。2)只有一個(gè)Item時(shí),selectionadapter的上下邊框遮住一個(gè)Item。3)selectionadapter的邊框與drop-down邊框的距離。4)textbox的位置表現(xiàn)影響到當(dāng)軟件盤彈出時(shí)drop-down是在textbox的上方還是下方,如圖2-3-2。5)如果Item中有背景圖片,那么背景圖片的透明度可能引起別的問題。解決這些問題,是耗費(fèi)時(shí)間精力體力的,組件的每個(gè)屬性都要試,據(jù)測試修改的經(jīng)驗(yàn),越老版本的系統(tǒng)、越老型號(hào)的手機(jī)問題越多。這里就不一一貼圖,往事不堪回首。所以,在應(yīng)用中,快刀斬亂麻,大膽去之。TOC\o"1-5"\h\z?. IhH|跖1 ?fihLuhiVAc Ihrt陽心心"便mnVAccumsan HhttpWmw.miniraiF玖wnVHu「召血efA.卻心■圖2-3-2drop-down在上方的AutoCompleteBox2.4快捷方式應(yīng)用程序有了創(chuàng)建快捷方式的功能,經(jīng)常有人抱怨自己手機(jī)上出現(xiàn)多個(gè)桌面圖標(biāo)。且聽本人娓娓道來。不同于iOS,Android操作系統(tǒng)在安裝一個(gè)軟件安裝包的時(shí)候,并不會(huì)為軟件包創(chuàng)建桌面快捷方式,要實(shí)現(xiàn)創(chuàng)建桌面快捷方式的功能,只能在程序安裝成功后第一次運(yùn)行的時(shí)候創(chuàng)建快捷方式。而且,Android系統(tǒng)是允許系統(tǒng)啟動(dòng)后選擇桌面的,區(qū)別于其他系統(tǒng)在啟動(dòng)后是默認(rèn)桌面,這也就導(dǎo)致7qq桌面、91桌面等各種桌面應(yīng)用的叢生。再者,Android的開源性,某些自稱國際品牌的手機(jī)廠商標(biāo)新立異,不僅修改桌面,而且修改與桌面相關(guān)的java類。1)添加桌面快捷方式的代碼://添加當(dāng)前應(yīng)用的桌面快捷方式publicstaticvoidaddShortcut(Contextcontext,inticonld,intappId,Classtarget,模板編號(hào):模板版本:V1.0Beta1.0第5頁共13頁booleanmany)(Intentaddintent=newIntent("com.android.launcher.action.INSTALL_SHORTCUT");〃獲取快捷鍵的圖標(biāo)Parcelableicon=Intent.ShortcutIconResource.fromContext(context,R.drawable.icon);Stringlabel=context.getString(appId);IntentmyIntent=newIntent(Intent.ACTION_MAIN);myIntent.addCategory(Intent.CATEGORY_LAUNCHER);if(target!=null)(myIntent.setClass(context,target);}"快捷方式的標(biāo)題addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,label);"快捷方式的圖標(biāo)addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon);//是否允許重復(fù)創(chuàng)建--fase-->否addIntent.putExtra("duplicate”,false);myIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);myIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);"快捷方式的動(dòng)作addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,myIntent);〃發(fā)送廣播context.sendBroadcast(addIntent);}添^口<uses-permissionandroid:name=〃com.android.launcher.permission.INSTALL_SHORTCUT"/>許可。這段代碼就是創(chuàng)建桌面快捷方式的代碼,做為應(yīng)用開發(fā)人員,能做的事情只是調(diào)用Android提供的api。而且,已經(jīng)用addIntent.putExtra("duplicate”,false)方法,設(shè)置創(chuàng)建方式的時(shí)候不重新創(chuàng)建,即如果桌面上已經(jīng)有了桌面,那么就不創(chuàng)建新的桌面快捷方式。在實(shí)際的測試中,有的手機(jī)addIntent.putExtra("duplicate”,false)方法是沒效果的,即已經(jīng)有快捷方式,仍會(huì)創(chuàng)建快捷方式,桌面上出現(xiàn)多個(gè)快捷方式。如果一個(gè)手機(jī)上安裝了多個(gè)桌面應(yīng)用的話,有的桌面對(duì)模板編號(hào):模板版本:Vl.OBetal.O第6頁共13頁addIntent.putExtra("duplicate”,false)方法也是沒效果。既然創(chuàng)建桌面快捷方式的代碼產(chǎn)生多個(gè)快捷方式,那么能否有方法先判斷是否已經(jīng)創(chuàng)建快捷方式,如果有快捷方式,則不創(chuàng)建快捷方式。下面是判斷是否已經(jīng)創(chuàng)建快捷方式的代碼:判斷是否創(chuàng)建快捷方式的代碼:try{Uriuri=null;Stringspermi;if(android.os.Build.VERSION.SDK_INT<8){spermi="com.android.launcher.settings";}else{spermi="com.android.launcher2.settings";}uri=Uri.parse("content://"+spermi+"/favorites?notify=true");finalContentResolvercr=context.getContentResolver();Cursorcursor=cr.query(uri,newString[]{"title","iconResource"},"title=?",newString[]{context.getString(R.string.app_name).trim()},null);if(cursor!=null&&cursor.getCount()>0){cursor.close();returntrue;}else{returnfalse;}}catch(Exceptione){Log.e("ShotCutUtil","ShotCutUtilException",e);returnfalse;}添^口<uses-permissionandroid:name=〃com.android.launcher.permission.READ_SETTINGS〃/>權(quán)限。從這段代碼可以看出,Android系統(tǒng)為每個(gè)快捷方式指定的app的名字、圖標(biāo)等存在本地的數(shù)據(jù)庫中,我們可以通過查詢app的名字,如果查詢的結(jié)果集數(shù)量大于0,則說明app的快捷方式已經(jīng)創(chuàng)建。對(duì)于android.os.Build.VERSION.SDK_INT<8即版本號(hào)低于2.2的Android系統(tǒng),存放于com.android.launcher.settings”中,對(duì)于android.os.Build.VERSION.SDK_INT>=8的版本,存放于〃com.android.launcher2.settings〃h而在實(shí)際的測試中,Zte、Meizu、Huawei等國產(chǎn)手機(jī)是遵守這一規(guī)則的。三星手機(jī)有的機(jī)型在版本號(hào)的數(shù)字上即是否為8略有差別。而Htc手機(jī)重寫桌面的同時(shí),也將launcher修改,并修改了這一規(guī)則,Htc命名為"com.htc.launcher.settings”,在進(jìn)行查詢的時(shí)候,需要添加<uses-permissionandroid:name="com.htc.launcher.permission.READ_SETTINGS”/>,這或許與Htc招聘有大量Android驅(qū)動(dòng)、應(yīng)用開發(fā)人員瞎折騰有關(guān),有的型號(hào)的Htc手機(jī)依舊是查不到的。3) 手機(jī)上存儲(chǔ)是否第一次運(yùn)行的標(biāo)志為解決上面的問題,采用應(yīng)用程序在手機(jī)上保留存儲(chǔ)一個(gè)標(biāo)識(shí),記錄是否是第一次運(yùn)行應(yīng)用程序。存儲(chǔ)標(biāo)識(shí)的方式可以自由選擇。如果是第一次運(yùn)行,調(diào)用1)中創(chuàng)建快捷方式的代碼;如果不是第一次運(yùn)行,則不創(chuàng)建快捷方式。但這樣會(huì)產(chǎn)生另一個(gè)問題,即如果在手機(jī)的應(yīng)用管理器中選擇該app,然后清理數(shù)據(jù)的話,會(huì)把標(biāo)識(shí)清空的,再次運(yùn)行程序,會(huì)認(rèn)為是第一次運(yùn)行,調(diào)用1)代碼創(chuàng)建,就會(huì)出現(xiàn)1)中的問題,可能出現(xiàn)多個(gè)快捷方式。4) 綜合方案最后采用查詢數(shù)據(jù)庫+本地標(biāo)識(shí)結(jié)合的方案,可以有效的減小出現(xiàn)多個(gè)快捷方式的概率。如果標(biāo)識(shí)不是第一次運(yùn)彳亍或者”com.android.launcher.settings”、"com.android.launcher2.settings”、"com.htc.launcher.settings"任意一個(gè)能夠查詢獲得結(jié)果集,則不創(chuàng)建快捷方式;反之,創(chuàng)建快捷方式。2.5Android類庫中.InetAddress的差異在Androidapp開發(fā)中,可能會(huì)需要進(jìn)行dns的解析,用到.InetAddress,那么要注意下面的差異。目前測試中,android.os.Build.VERSION.SDK_INT<15即低于4.0的Android版本中,域名和ip鍵值對(duì)存放的位置是.InetAddress類的私有靜態(tài)變量addressCache中的map變量;publicclass.InetAddress{privatestaticfinal.AddressCacheaddressCache=new.AddressCache。;.}
publicclass.AddressCache(privatefinaljava.util.Mapmap;}在android.os.Build.VERSION.SDK_INT>=15即不低于4.0的Android版本中,.AddressCache類的內(nèi)部結(jié)構(gòu)有所不同,加入了libcore.util.Ba
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中開學(xué)第一課老師講話5篇
- 音樂教師知識(shí)培訓(xùn)的總結(jié)范文5篇
- 綠色低碳節(jié)能環(huán)保演講稿(3篇)
- 健康知識(shí)小調(diào)查
- 山地占用協(xié)議書
- 上海固定勞動(dòng)合同續(xù)簽規(guī)定
- 銷售業(yè)務(wù)員工作總結(jié)范文
- 商業(yè)建筑機(jī)械施工合同模板
- 政府機(jī)關(guān)計(jì)劃生育承諾書樣本
- 汽車制造商品混凝土施工協(xié)議
- 2024-2025學(xué)年二年級(jí)上學(xué)期數(shù)學(xué)期中模擬試卷(蘇教版)(含答案解析)
- 入團(tuán)志愿書(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- (完整版)六年級(jí)下冊體育教學(xué)計(jì)劃與教案
- 北京地鐵受電弓的維護(hù)與故障檢修-畢業(yè)設(shè)計(jì)說明書
- 幼兒園教育和家庭教育的有效結(jié)合研究
- 集團(tuán)公司兩金管理評(píng)價(jià)辦法
- 電影的聲音分析PPT課件
- “三措一案”實(shí)施規(guī)范標(biāo)準(zhǔn)
- 【全面解讀《國有建設(shè)用地使用權(quán)出讓地價(jià)評(píng)估技術(shù)規(guī)范【2018】4號(hào)文》
- 案件移交清單模板
- 等差數(shù)列及其通項(xiàng)公式
評(píng)論
0/150
提交評(píng)論