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信息,可作为临时替代方案,稳定性较差



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章