Android開發(fā)需要注意的坑

背景
此文純粹總結開發(fā)Android以來遇到的一些坑,一來為了防止再次掉坑,二來是希望后面的朋友能躲開這些坑手负。

包名重復問題
由于Google Palyer沒有在中國登陸拼卵,中國存在有非常多的Android應用商城,而且這些商城并沒有聯(lián)合起來對APP包名進行檢測问欠,所以你APP中使用的包名很有可能會跟別人的APP重復。那么小明手機裝了別人的應用,就裝不上你的應用了垮斯。
建議:
1.包名定義要有一定的技術,盡量避免太容易重復的包名只祠,如:com.digital.home兜蠕。
2.要確定包名前,可以將應用發(fā)到一些測試網站去測試抛寝,比如testin熊杨,它會將的你APP安裝到20臺機,看能否全部正常安裝墩剖。

textSize單位問題
Android Studio提示所有textSize的單位都應該使用sp猴凹,因為這樣該text就能夠隨用戶在系統(tǒng)setting里設置的字體大小的改變而改變。那么如果你使用了sp作單位岭皂,那么建議你調整setting字體至最大或最小后郊霎,看UI是否還能正常顯示。我個人使用了不規(guī)范的dp作為單位爷绘。

小米手機圖標異常問題
在別的手機顯示沒有這問題书劝,在小米手機顯示就有下圖的問題,解壓apk包也沒發(fā)現(xiàn)該圖標土至。其實這是小米手機的BUG购对,解決方法是將APP上傳至小米應用商城,它會要求你上傳一整套桌面圖標icon陶因,據說現(xiàn)在小米應用商城已經去掉了這部分功能骡苞。

圖標顯示異常

部分手機因權限問題無法安裝應用問題
一時記不起是什么手機,大概是中興還是樂視手機楷扬,只需要在AndroidManifest.xml里增加一個自定義權限就可以了解幽。

<permission android:name="cus.permission.com.xxx.xxx"
            android:protectionLevel="normal"/>

魅藍手機EditText的enabled屬性無用問題
在xml里面讓EditText不可編輯狀態(tài),是設置android:enabled="false"烘苹,但是發(fā)現(xiàn)在魅藍note2這樣設置后還是可以編輯躲株,再加上下面這句就可以了。

mPhoneNumEt.setEnabled(false);

百度更新與360更新沖突問題
之前應用集成了百度更新與360更新镣衡,然后上傳至360后臺發(fā)布霜定,但是審核不通過档悠,解決方法只需要把AndroidManifest.xml里百度相關的xml屏蔽再打包即可。

集成騰訊X5 WebKit無法讀取SD卡html文件問題
將html文件放到/data/data/com.example.demo/files/ 里面望浩,結果發(fā)現(xiàn)X5根本無法讀取辖所,后來通過跟騰訊工作人員溝通,原來舊版本的X5只允許讀取/sdcard 和私有目錄下的/data/data/com.example.demo/files/public目錄曾雕,其他目錄的調用都被禁止了奴烙。
我手機上的X5版本是2258,而新的版本如3321已經不再限制了剖张,所以要兼容低版本的X5內核切诀,還是需要把文件放在public目錄下。更詳細的集成方案請閱讀《集成第三方組件--Android APP集成騰訊X5 WebKit》

AsyncTask
AsyncTask只能執(zhí)行簡短任務搔弄,執(zhí)行長時間耗時任務會阻塞其他使用AsyncTask的任務幅虑。在項目中慎用,我踩過關于它的坑是在輪播圖里使用了它顾犹,導致其他AsyncTask阻塞倒庵,不能正常使用。比如集成七魚客服SDK無法獲取相冊圖片炫刷,比如獲取短信驗證碼倒計時無法正常倒計時擎宝。詳細可參考:AsyncTask 使用和缺陷

集成個推SDK的坑
個推最近推出了2.9.0版本的SDK,集成后打包apk文件浑玛,發(fā)現(xiàn)Android 5.0以上的系統(tǒng)都無法安裝绍申,顯示“應用未安裝”,只能使用之前的2.8.1.0的版本顾彰,這個問題在他們Demo也已經驗證過极阅,各位要注意。

簽名問題
生成簽名文件xxx.jks涨享,兩個StorePassword和KeyPassword都沒有錯筋搏,但是還是提示:Cannot recover key,后來刪掉xxx.jks 厕隧,重新生成奔脐,并設置StorePassword和KeyPassword為同一個密碼,然后就可以了吁讨。

奇葩所在:
沒來得及分析這是為什么帖族,因為我現(xiàn)在用的其他簽名文件兩個密碼不一致也沒問題。后面我再次嘗試使用不一樣的密碼挡爵,發(fā)覺原理問題不存在了。

可能的原因:
1.是IDE的BUG甚垦,重啟IDE就能搞定茶鹃;

WebView加載htm影響原生頁面工作
公司項目使用HyBrid方式開發(fā)涣雕,直到有個頁面需要使用動畫、設置View顯示隱藏闭翩、設置View的高度挣郭、刷新GridView數(shù)據,但是發(fā)現(xiàn)加載a.html后這些功能全部失效或異常了疗韵,而選擇加載b.html就沒問題兑障,而且這個只發(fā)生在我的4.3手機上。

奇葩所在:
不知道確切原因蕉汪,問題還沒解決流译。

可能原因:
1.htm某些功能影響了原生頁面?
2.加載這個頁面是否需要開啟某些功能者疤?

WebView加載html頁面后福澡,部分手機顯示頁面過大
兩臺手機加載同一個html頁面,一個正常顯示驹马,另一個頁面顯示不全革砸,可以左右滑動,這個問題已經解決糯累,問題是另一臺手機調整了系統(tǒng)字體大小導致算利。解決方法是設置WebView顯示為normal字體大小,代碼如下:

webSetting.setTextSize(WebSettings.TextSize.NORMAL);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

提示“應用未安裝”
手機連接usb線的時候可以安裝泳姐,但是下載apk安裝卻提示“應用未安裝”效拭,今天也發(fā)現(xiàn)支付寶出現(xiàn)了這個問題。原因是我們打包的apk不完整或路徑有問題導致仗岸,我這里發(fā)現(xiàn)的問題是在使用Gradle打包.so文件打包方式不對允耿,最后參考http://blog.csdn.net/wulianghuan/article/details/44567001

ListView中的CheckBox
若在ListView的Item中有CheckBox扒怖,而這個時候在Adapter中我們又設置了各個Item中OnCheckedChangeListener较锡,那么在ListView滑動過程中,或者加載過程中會不斷調用這個方法盗痒,正確的寫法是:

holder.cbItem.setOnCheckedChangeListener(null); //設置為空
if (mList.get(i).is_select()) { //設置其狀態(tài)
     holder.cbItem.setChecked(true);
} else {
     holder.cbItem.setChecked(false);
} 
//設置狀態(tài)變化監(jiān)聽事件
holder.cbItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           mItemContentClickListener.selectGoods(i, isChecked);
     }
});

需要注意的setOnCheckedChangeListener方法
該方法不僅在我們點擊的時候會調用蚂蕴,而且在調用setChecked的時候也會被調用,正如其名字的意思俯邓,但是我們在開發(fā)中經常會忽略掉setChecked會調用該方法的事情骡楼,導致系統(tǒng)出現(xiàn)Bug。

mSelectAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
         showLog("setOnCheckedChangeListener");
     }
});

如果只是需要在點擊的時候回調稽鞭,那還是設置setOnClickListener監(jiān)聽吧鸟整。

Adapter里數(shù)據引用改變導致數(shù)據不改變的問題
我們通過初始化Adapter設置mGoodList數(shù)據在ListView中顯示:

GoodsListAdapter goodsListAdapter=new GoodsListAdapter(this,mGoodsList);
mListView.setAdapter(goodsListAdapter);

當我們數(shù)據改變時,容易犯一下錯誤:

mGoodsList=mOtherList;
goodsListAdapter.notifyDataSetChanged();

正確的應該是:

mGoodsList.clear();
mGoodsList.addAll(mOtherList);
goodsListAdapter.notifyDataSetChanged();

原因是在我們new GoodsListAdapter(...)已將mGoodsList的引用傳遞給Adapter朦蕴,如果mGoodsList=mOtherList這種方法給mGoodsList賦值是不成功的篮条,賦給mGoodsList的是新的引用弟头,但Adapter卻還保留原來的引用。

SQLite里存儲INTEGER數(shù)據
在創(chuàng)建表時涉茧,將某一字段類型設置為INTEGER赴恨,如果存儲00311104035001這樣的數(shù)據,SQLite真正存儲的值會變?yōu)?11104035001伴栓。若要避免這種錯誤伦连,可選擇VARCHAR類型。

APP升級要留一條后路
即強制升級钳垮,因為開發(fā)中總會遇到這種需求惑淳;

浮點數(shù)或雙精度計算時要考慮保留小數(shù)點后的位數(shù)
之前做計算時沒有考慮這個,導致有些計算的結果是個無線循環(huán)小數(shù)扔枫,如:128.6999999...汛聚,以下是個方法:

public String getResult(double num){
    BigDecimal input = new BigDecimal(num);
    double result = input.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    return String.valueOf(result);
}

ListView設置setOnItemClickListener點擊沒反應
問題一般是由于ListView中的ItemView里有Button、Checkbox短荐、ImageView等控件倚舀,導致點擊ItemView時焦點其他控件攔截了,要解決此問題忍宋,只需要在控件上設置android:focusable="false"痕貌。

DatePickerDialog的顯示的問題
我們輸入的對話框初始日期是2017-4-2,但是顯示的對話框卻是2017-5-2糠排,而選出的日期是4月舵稠,這明顯會誤導用戶。所以我們需要做些處理入宦,在初始的月份-1哺徊,在回調的結果里+1,這就能達到我們想要的效果乾闰。

int yearParam=2017;
int monthParam=4;
int dayParam=2;

new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
       @Override
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
             String result = year + "-" + (monthOfYear+1) + "-" + dayOfMonth;
             textView.setText(result);
        }
}, yearParam, monthParam-1, dayParam).show();

待續(xù)......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末落追,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涯肩,更是在濱河造成了極大的恐慌轿钠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病苗,死亡現(xiàn)場離奇詭異疗垛,居然都是意外死亡,警方通過查閱死者的電腦和手機硫朦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門贷腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事花履⊙渴溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵诡壁,是天一觀的道長。 經常有香客問我荠割,道長妹卿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任蔑鹦,我火速辦了婚禮夺克,結果婚禮上,老公的妹妹穿的比我還像新娘嚎朽。我一直安慰自己铺纽,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布哟忍。 她就那樣靜靜地躺著狡门,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锅很。 梳的紋絲不亂的頭發(fā)上其馏,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音爆安,去河邊找鬼叛复。 笑死,一個胖子當著我的面吹牛扔仓,可吹牛的內容都是我干的褐奥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼翘簇,長吁一口氣:“原來是場噩夢啊……” “哼撬码!你這毒婦竟也來了?” 一聲冷哼從身側響起缘揪,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耍群,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后找筝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹈垢,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年袖裕,在試婚紗的時候發(fā)現(xiàn)自己被綠了曹抬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡急鳄,死狀恐怖谤民,靈堂內的尸體忽然破棺而出堰酿,到底是詐尸還是另有隱情,我是刑警寧澤张足,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布触创,位于F島的核電站,受9級特大地震影響为牍,放射性物質發(fā)生泄漏哼绑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一碉咆、第九天 我趴在偏房一處隱蔽的房頂上張望抖韩。 院中可真熱鬧,春花似錦疫铜、人聲如沸茂浮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽席揽。三九已至,卻和暖如春囱井,著一層夾襖步出監(jiān)牢的瞬間驹尼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工庞呕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留新翎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓住练,卻偏偏與公主長得像地啰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讲逛,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容