解决Android5.0应用安装失败的问题

缘起 把手机OTA升级到Android 5.0(Android L)以后安装某打车软件失败,尝试了几次结果一样。 探究竟 最开始想到是软件和5.0的适配兼容问题,查下Log吧。 首先通过 adb logcat 监测log,然后重新尝试安装,没有发现特别醒目的信息。 然后通过adb install xxx.apk的方式安装,得到以下错误提示: ...

十一月 26, 2014

在ContentResolver中使用Group By

缘起 使用ContentProvider查询短信,希望可以在ContentResolver.query中使用Group By ,发现系统并没有提供接口或者可用字段。 ...

九月 25, 2014

通过StackTrace获取方法名

缘起 开发过程中经常需要获取当前正在执行的方法名,以前搜过,只是简单的知道可以调用Thread.currentThread().getStackTrace()来获取。就点到为止了。这次需要获取调用当前方法的方法的方法名(有点绕,我信你能看明白),所以详细跟了下。 ...

六月 27, 2014

WebSocket入门和应用

WebSocket介绍 WebSocket是一种协议,本质上和http,tcp一样。协议是用来说明数据是如何传输的。它的url前缀是ws:// 或者wss://,后者是加密的websocket。WebSocket没有试图在HTTP之上模拟server推送,而是直接在TCP之上定义了帧协议,因此WebSocket能够实现全双工通信。 WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 [RFC 6455][1],WebSocketAPI被W3C定为标准。 WebSocket解决了web实时化以及服务器端推送的问题,相比传统http有如下好处: 一个WEB客户端只建立一个TCP连接 Websocket服务端可以推送(push)数据到web客户端. 有更加轻量级的头,减少数据传送量 更详细内容请移步[维基百科][2] ...

十一月 7, 2013

小米手机AlarmManager失效的问题

问题描述 当我们需要周期性执行某操作时,就会用到AlarmManager,但是在小米的手机上(严格的说应该是小米Rom)执行周期太短的话,一旦系统休眠,AlarmManager就会失效。搜索结果来看,这个问题很普遍。发现是周期不能短于5分钟,否则不会唤醒系统。 解决方案 这个问题主要是因为我们大多数人使用了type=AlarmManager.RTC_WAKEUP,希望系统休眠后到达指定时间唤醒设备执行操作,而且周期短于5分钟。小米Rom的考虑节能省电,一旦系统休眠,不会频繁唤醒系统。 ...

九月 23, 2013

View Tag相关

View的tag方法可以让View附带很多信息,方便使用。最常用的一个例子:在Adapter中我们经常用到View的setTag()和getTag()方法,从而使用ViewHolder来提高效率。 问题1:当我们需要添加多个tag时该怎么做呢? View还有一个setTag(int key, final Object tag)方法,想添加多少tag都行。 问题2:直接调用方法View.setTag(1,"msg"),出现异常: java.lang.IllegalArgumentException: The key must be an application-specific resource id. 异常信息的意思是说:key必须是特定的资源id。 最直接的方法就是在资源文件中添加一条记录: <item type="id" name="tag_first"></item> 可以添加到res/values/strings.xml或者res/values/ids.xml中,然后调用View.setTag(R.id.tag_first,"msg")即可。 知道解决方法了,再来找一下原因。以下是View中相关源码: ...

七月 3, 2013

Android数据库事务处理

在数据库开发中,事务处理是非常重要的。 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度。 其次是保证数据的一致性,一个事务中的所有操作可以看作一个原子操作,成功或者失败。如果全部成功,则事务提交完成;而事务内部如果有失败操作,整个事务操作会回滚,从而保证数据的一致性。 Android中事务的调用: try { db.beginTransaction(); //在这里执行多个数据库操作 //执行过程中可能会抛出异常 db.setTransactionSuccessful(); //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作 } catch (Exception e){ } finally { //当所有操作执行完成后结束一个事务 db.endTransaction(); } 有2点需要注意的是: 一定要调用db.setTransactionSuccessful();事务才会成功提交完成 事务是可以嵌套的 以上2点也是自己开发中犯错了才觉察到的:没有调用db.setTransactionSuccessful();发现数据没有插入;想当然的认为事务不可以嵌套。而Android的源码中也很清楚的说明了这2点,所以究其根本原因是对事务处理不够熟悉,对Android中事务的处理不熟悉。在此记录警示自己! 以下贴出Android中相关连的源代码,来自android.database.sqlite.SQLiteDatabase: ...

五月 31, 2013

LayoutInflater丢失View的LayoutParams

View view = inflater.inflate(R.layout.item, null); 在使用类似以上方法获取view时会遇到的一个问题就是布局文件中定义的LayoutParams被忽略了。以下三个stackoverflow问题就是这样: http://stackoverflow.com/questions/5288435/layout-params-of-loaded-view-are-ignored http://stackoverflow.com/questions/5026926/making-sense-of-layoutinflater http://stackoverflow.com/questions/2738670/layoutinflater-ignoring-parameters 都说这样使用就可以了: View view = inflater.inflate( R.layout.item /* resource id */, parent /* parent */,false /*attachToRoot*/); 至此问题已经解决了,但是三个问题都没有提到为什么要这样调用才行。 感兴趣的我们到源码里来找答案,LayoutInflater的inflate方法,最后都是调用的同一个方法: public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 原因自然在这个方法里,大概意思就是只有ViewGroup root不为空才会读取View的LayoutParams。attachToRoot = true的时候,会把View添加到root中。而大多情况不希望被addView到root中,自然要赋值为flase,这样就是上面的解决方案了。 可以参看LayoutInflater的inflate方法相关的源码: ...

五月 6, 2013

一个逗号引发的惨案

根据判断条件组装建表的sql语句,有一处写成了全角的逗号,从而导致满足条件的字段后面都跟的全角逗号,sqlite认为直到遇到下一个半角逗号之前,都是上一个字段的类型声明,从而丢失了多个字段。 例如下面这样: create table card (userLevel TEXT,barCode TEXT,barCodeUrl TEXT,ucno TEXT,bigLogo TEXT,timeLineLink TEXT,blogLink TEXT) barCode 和 ucno类型后面是全角逗号,导致sqlite认为TEXT,barCodeUrl TEXT和TEXT,bigLogo TEXT是类型生命,丢失了这2个字段,但是建表成功,不会报任何错误,等到执行插入操作时才会提示没有该字段。 而由于插入操作只会针对遇到的第一个没有的字段进行提示,更进一步隐藏了问题的本质(建表字段较多,没有一一核对。。)。开始以为是sqlite的关键字,后来转念一想,关键字的话建表时就会报错了,而不是不报错直接建表成功。在多个sqlite工具下建表,结果是一样的。 最后在同事帮助下才通过删除几个字段的方式,最后细看组装出来的sql语句,终于发现是有多个全角逗号导致的。。 折腾了2个多小时,究其原因还是,浮躁,粗心。最开始引发的原因可能是写注释和代码时,中英文来回切换导致的。可见,写英语注释的重要性。。 当然,sqlite强大容错性也促成了这个bug。在此记录下,以警示自己!

五月 6, 2013

Android Shell命令dumpsys

dumpsys命令可以显示手机中所有应用程序的信息,并且也会给出现在手机的状态。 直接执行adb shell dumpsys会显示以下所有信息。 SurfaceFlinger, accessibility, account, activity, alarm, appwidget, audio, backup, battery, batteryinfo, bluetooth, bluetooth_a2dp, clipboard, connectivity, content, cpuinfo, device_policy, devicestoragemonitor, diskstats, dropbox, entropy, hardware, hdmi, input_method, iphonesubinfo, isms, location, media.audio_flinger, media.audio_policy, media.camera, media.player, meminfo, mount, netstat, network_management, notification, package, permission, phone, power, search, sensor, simphonebook, statusbar, telephony.registry, throttle, uimode, usagestats, vibrator, wallpaper, wifi, window dumpsys的参数可以跟以上信息的名字。例如: adb shell dumpsys activity 显示activity相关的信息 adb shell dumpsys statusbar 显示状态栏相关的信息 adb shell dumpsys meminfo $package_name or $pid 使用程序的包名或者进程id显示内存信息...

一月 24, 2013