Intent使用规范:不要在Intent的中携带待会自动被提交的数据。
来源:互联网 发布:apache 官网下载64位 编辑:程序博客网 时间:2024/04/30 04:08
在开发一个聊天功能时,碰到一个消息转发的问题!
问题描述:在转发消息时(用户A转发消息text给用户B,此时进入了A与B的聊天界面ActivityAB,并且用户A会把消息text发送给用户B),如果内存紧张或者用户打开了不保留活动,当处于ActivityAB时用户切换界面,使得ActivityAB被切换到后台,再将ActivityAB切换到前台,此时消息text又会被发送一次!即刚才转发的消息text在每次界面ActivityAB被重新创建时都会被重现转发一次。
问题太长,总结下:在跳转到新的界面提交数据时,如果界面被重复创建,会导致数据被重复提交。
问题原因:在消息转发的逻辑中,待转发的消息携带在Intent中被传输到ActivityAB界面,在每次Activity被创建(不管是第一次创建或者重新创建。,即onCreate()方法被调用),都会尝试读取Intent中待转发的消息,如果读取到待转发的消息(假设为msg),那么会将msg发送到当前聊天对象。问题来了。系统内存紧张或者开启了不保留活动的设置。每次切换ActivityAB到后台时,ActivityAB都会被销毁,下次再将ActivityAB切换回前台时,ActivityAB会被重新创建,即onCreate()方法会把调用,所以此时又会发生Intent中待转发的消息,导致消息被重复发送。
原因太长,总结下:待提交的数据放在Intent中发送给新的Activity,新的Activity如果被重复创建,就会导致重复读取Intent中的数据并重复提交。
思考: 由于Intent无法更改,所以Intent里携带的信息一般只能用于获取某些信息,而不应该”写入”,比如提交表单操作或者发送信息,因为在同一个Activity会被重复创建的情况下,对于Intent的操作会被多次调用,从而导致多次“写入操作”。就像某些表单填写的网页中,刷新网页时,页面会警告数据会被重复提交,Activity中这里的情况也是一样的。
解决方法:对于Activity而已,其作用主要是实现与UI相关的操作,所以类似于表单提交或者发送消息等“写入”操作,本身就不应该交给Activity来做,对于需要提交的数据,也不应该使用Intent来传递给Activity,也不该在Activity中读取Intent中的数据并写入到某处(如本地数据库或者后台数据库)。
笔者认为合理的处理方法应该是:对于要写入或者提交的数据(假设为:data),应该先使用后台服务(Service或者或Thread)做提交或者写入操作,等该操作完了,在通知界面跳转,然后再Activiy中在显示刚刚上传或者写入的数据data。
前后两种处理方法的比较:
旧方法:1.data放在intent中 -> 2.使用该intent打开新的activity -> 3.在该activity中读取intent中的data -> 4.将data提交或者写入到某处。
新方法:1.使用后台服务提交data -> 2.data提交完成打开相关activity -> 3.相关activity再显示刚刚被提交的数据data。
区别:如上,旧方法的步骤 3->4可能会被重复调用,从而使数据被重复提交。
所以用新的方法会更合理些。
当然,比如所说data,是那种被携带到新界面就会被自带提交的数据,而不是需要用户手动提交的数据。
- Intent使用规范:不要在Intent的中携带待会自动被提交的数据。
- Intent携带额外的数据的方法
- Intent携带额外的数据的方法
- intent携带数据的集中方式
- 启动其他程序Intent携带的数据
- Notification中Intent携带数据重复问题
- Notification中Intent携带数据重复问题
- 监听电池变化的广播中携带的数据:Intent.ACTION_BATTERY_CHANGED
- Intent携带数据切换Activity
- Activity中Intent的使用
- Android中Intent的使用
- Activity中Intent的使用
- Android中intent的使用
- Android 中 Intent 的使用
- Android中Intent的使用
- android中Intent的使用
- Android中Intent的使用
- Android中Intent的使用
- cocos2dx中c++向lua传string的问题
- HDU 4059-容斥原理 +拉格朗日插值法
- Nginx平滑升级
- android的代码规范
- poj3239(深搜)
- Intent使用规范:不要在Intent的中携带待会自动被提交的数据。
- Mysql5.7究竟该如何安装
- centos下安装NS2
- 14LongestCommonPrefix
- 深度学习笔记5torch实现mnist手写数字识别
- POJ 3252 Round Numbers 组合数学
- Servlet详解
- ibatis中动态查询表返回用resultClass="java.util.HashMap" 的问题
- 如何用命令行实现数据库和表的创建、查看和修改