Android開發需要注意的坑

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

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

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

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

圖標顯示異常

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

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

魅藍手機EditText的enabled屬性無用問題
在xml里面讓EditText不可編輯狀態,是設置android:enabled="false",但是發現在魅藍note2這樣設置后還是可以編輯,再加上下面這句就可以了。

mPhoneNumEt.setEnabled(false);

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

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

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

集成個推SDK的坑
個推最近推出了2.9.0版本的SDK,集成后打包apk文件,發現Android 5.0以上的系統都無法安裝,顯示“應用未安裝”,只能使用之前的2.8.1.0的版本,這個問題在他們Demo也已經驗證過,各位要注意。

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

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

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

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

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

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

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

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

提示“應用未安裝”
手機連接usb線的時候可以安裝,但是下載apk安裝卻提示“應用未安裝”,今天也發現支付寶出現了這個問題。原因是我們打包的apk不完整或路徑有問題導致,我這里發現的問題是在使用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()) { //設置其狀態
     holder.cbItem.setChecked(true);
} else {
     holder.cbItem.setChecked(false);
} 
//設置狀態變化監聽事件
holder.cbItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           mItemContentClickListener.selectGoods(i, isChecked);
     }
});

需要注意的setOnCheckedChangeListener方法
該方法不僅在我們點擊的時候會調用,而且在調用setChecked的時候也會被調用,正如其名字的意思,但是我們在開發中經常會忽略掉setChecked會調用該方法的事情,導致系統出現Bug。

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

如果只是需要在點擊的時候回調,那還是設置setOnClickListener監聽吧。

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

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

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

mGoodsList=mOtherList;
goodsListAdapter.notifyDataSetChanged();

正確的應該是:

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

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

SQLite里存儲INTEGER數據
在創建表時,將某一字段類型設置為INTEGER,如果存儲00311104035001這樣的數據,SQLite真正存儲的值會變為311104035001。若要避免這種錯誤,可選擇VARCHAR類型。

APP升級要留一條后路
即強制升級,因為開發中總會遇到這種需求;

浮點數或雙精度計算時要考慮保留小數點后的位數
之前做計算時沒有考慮這個,導致有些計算的結果是個無線循環小數,如: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();

待續......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容