Android开发中的技术细节
1、PendingIntent的使用注意事项
public static PendingIntent getActivity (Context context, int requestCode, Intent intent, int flags)
Android开发中,通知栏消息点击事件和widget界面view点击事件都是设置PendingIntent,PendingIntent在系统中是一个Map,它的key是Intent和requestCode。如果PendingIntent的requestCode一样并且Intent一样,那么系统认为两个PendingIntent是一样的。而Intent是否一样系统只判断action、category、datauri,不判断extra。由此可知,当我们在开发中遇到使用PendingIntent开发导致Intent传入参数没有及时更新时,首先检查我们的Intent里面是不是只设置了extra数据,而没有添加其他action、category、datauri用于区别来源。
另外PendingIntent的第四个参数flags也需要引起我们的注意:
FLAG_CANCEL_CURRENT:
如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:
如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返null。
FLAG_ONE_SHOT:
该PendingIntent只作用一次,如果该PendingIntent对象已经触发过一次,那么下次再获取该对象并且再触发时,系统将会返回一个SendIntentException,在使用这个标志的时候一定要注意哦。
FLAG_UPDATE_CURRENT:
如果系统中已存在该PendingIntent对象,那么系统将保留该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。这个非常有用,例如之前提到的,我们需要在每次更新之后更新Intent中的Extras数据,达到在不同时机传递给MainActivity不同的参数,实现不同的效果。
2、关于Android HttpURLconnection获取ContentLength 的隐藏问题
(CTWAP网络环境下HTTP的GET方法获取网络数据时返回Content-Length与实际下载数据大小不一致)
问题分析
问题的诱因锁定为“ctwap/ctnet”和“获取ContentLength的方式”
经过抓包分析,当客户端用HttpURLconnection获取数据并且请求头RequestMethod为GET的时候,ctwap/ctnet网关会对数据进行过滤处理,进行Gzip压缩,而android apk包默认是Zip压缩格式,由 于Gzip压缩比高于Zip,导致网关对apk包压缩处理后,length会小于原先值,最后导致客户端通过HttpURLconnection.getContentLength()获取的length比apk实际大小要小。
解决方案
<1>获取ContentLength的时候,请求头RequestMethod设置成“HEAD”,这样网关不会对body进行Gzip压缩计算大小,而是直接返回原始大小。
<2>通过返回头ContentRange字段获取ContentLength信息,可作为临时替代方案,稳定性较差
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 04-21中国产品数字护照体系加速建设
- 04-21上海口岸汽车出口突破50万辆
- 04-21外媒:微软囤货GPU以发展AI
- 04-21苹果手表MicroLED项目停滞持续波及供应链
- 04-21三部门:到2024年末IPv6活跃用户数达到8亿