Android 开发,那些奇葩的问题

开发过程中,总会遇到一些让人棘手又意外的问题。代码明明”没有问题”,怎么就是不对呢?本帖就用来记录作者在开发过程中遇到的那些意想不到的问题。


1、Intent中携带的数据错位了

使用Intent携带数据再平常不过了,谁会想到这都会出问题。简单描述如下:

Intent中携带的数据本来是

"key1":"value1"
"key2":"value2"
"key3":"value3"

但是接收到后变成了:

null:"key1"
"value1":"key2"
"value2":"key3"

太奇葩了!!

最后发现是一个疏忽引起的,其中一个对象在序列化的时候出了问题,writeParcel的时候漏写了一个变量。而Bundle是用ArrayMap保存数据的,猜测是读错该对象了,导致其他的数据也出了问题。


2、程序前后台的判断出了问题

先上判断前后台的代码:

    public static boolean isAppOnForeground(Context applicationContext) {
        if (null == applicationContext) return false;
        ActivityManager activityManager = (ActivityManager) applicationContext.getSystemService(Context.ACTIVITY_SERVICE);
        String packageName = applicationContext.getPackageName();

        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        if (appProcesses == null) return false;

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            // The name of the process that this object is associated with.
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }
        return false;
    }

在BaseActivity的onStart()和onStop()方法中各自判断一次。我们的程序中,这段代码在其他手机上都没有问题,唯独在MIUI7.3.2.0上失效了,一直显示在前台呀!!但是把这段程序单独拿出来在Demo中跑,结果又是正确的,懵了有没有??

N久后,终于在我们程序的DaemonService上找到了端倪。DaemonService运行在其他进程,启动的时候用到了

public boolean bindService(Intent service, ServiceConnection conn,int flags)

这个方法,其中最后一个参数flags设置的是

Context.BIND_AUTO_CREATE

程序在后台的时候,主进程和守护进程在的importance字段在其他手机上是130,但在MIUI7.3.2.0上是100(即前台)。改成

Context.BIND_NOT_FOREGROUND

在MIUI7.3.2.0上变成了130。

不知道是不是很好地解决方案,但找到原因了,还愁没有好的解决方法吗?


3、网上发现的一个问题:

If Android decides to update the system’s Webview while your app is running, it might crash your app: http://stackoverflow.com/questions/29575313/namenotfoundexception-webview


4、图片在特定的api版本中显示异常

刚分配的任务,问题是来消息显示系统通知时,默认的App图标在android5.0系统显示的不对。当时就懵了,难道图片还会选择版本自动变换不成?没想到结果真是如此。resw文件夹下,新建drawable-hdpi-v21就会在api版本为21时,显示这里面的图片。


5、通过Arrays.asList()函数产生的List不可更改。

查看源码可知,该函数返回的ArrayList对象是Arrays类的私有静态内部类,不同我们一般使用的ArrayList。该类只提供了少数几个函数的支持,不提供add、remove方法


6、使用MVVM模式编写的UI,在一次提交后,可编译不可运行,报空指针异常。

被DataBinding害惨了。查了好久,最后发现有同事在getWindow().getDecorView().findViewById(android.R.id.content)这个View上添加了一个View,然后DataBinding解析出错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值