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,是那种被携带到新界面就会被自带提交的数据,而不是需要用户手动提交的数据

0 0
原创粉丝点击