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阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容