谨慎在页面生命周期里使用全局静态变量

来源:互联网 发布:win10软件安装不了 编辑:程序博客网 时间:2024/06/06 10:43

项目开发中,个人贪图简便,在Activity的生命周期里使用了一个全局的布尔静态变量,而正是因为这个举动,差点导致版本转测block,在此记录以警醒自己(项目细节不谈)

原因探析

    Intent bindIntent = new Intent(context, BindActivity.class);    bindIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    bindIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    bindIntent.putExtra(AUTO_BIND, bean.isbAutoBind());    context.startActivity(bindIntent);

项目中使用了上述代码去启动一个BindActivity。当服务端发来一个Bind消息时(自定义的TCP消息),这段代码就会被程序执行。而Bind消息发送的次数取决于用户的操作行为,也就是说,这个Bind消息是可以发送多次的。

当第一次BindActivity已经呈现出来以后,此时内存驻留了其实例对象ActivityA,之后又收到一个Bind消息,由于使用了FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP的启动模式,此时在内存中又会创建出一个BindActivity实例ActivityB。

当ActivityB要覆盖ActivityA时,我们知道,这两个Activity会各自执行自己的生命周期流程,如下:

ActivityA-onPause()->ActivityB-onCreate()->ActivityB-onStart()->ActivityB-onResume()->ActivityA-onStop()->ActivityA-onDestroy()

悲催的是,在BindActivity的onCreate和onDestroy方法里面,执行了如下代码

public static boolean sIsRegistered = false;protected void onCreate(Bundle savedInstanceState) {    ...    sIsRegistered=true;    ...}protected void onDestroy() {    ...    sIsRegistered=false;    ...}

我们知道,静态变量在全局只有一份实例,且只初始化一次,其生命周期与程序的生命周期一致,这样就导致在ActivityB->onCreate方法里面该静态变量被设置成true后,又马上被ActivityA->onDestroy()方法设置成了false。这并不是期望得到的结果,也就导致了一些重要的问题(细节这里不透露)。

因此,写下这篇文章,用来警醒自己,日后不要再犯同样错误,同时,也想将个人的教训分享给广大读者,希望你们也可以有所收获。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 全棉衣服有异味怎么办 羊剪绒毛领褪色怎么办 篮球鞋买大2码怎么办 新鞋穿着脚累怎么办 买了国产乔丹怎么办 跑完1000米吐了怎么办 翻毛鞋脚染色了怎么办 翻毛皮被染色了怎么办 防鹿皮绒鞋染色怎么办 亚瑟士跑鞋挤脚怎么办 亚瑟士跑鞋很紧怎么办 飞线鞋面破了怎么办 新袜子穿了很滑怎么办 鞋底硬脚底板疼怎么办 新鞋前面太硬怎么办 新鞋子鞋底太硬怎么办 不到一米八的身高想扣篮怎么办 鞋胶粘在鞋面上怎么办 鞋子上沾了胶怎么办 休闲鞋号码大了半码怎么办 高跟鞋大了一码怎么办 浅口单鞋买大了怎么办 新鞋子磨大脚趾怎么办 鞋前面磨大脚趾怎么办 白鞋子蹭黑了怎么办 夏天穿皮鞋捂脚怎么办 耐克赤足掉漆怎么办 鞋子买回来小了怎么办 布鞋大了一码怎么办 鞋子买小了一码怎么办 运动鞋小了一码怎么办 帆布鞋小了一码怎么办 脚踝骨韧带断了怎么办 咖啡喝多了失眠怎么办 奥迪q7电瓶没电怎么办 一岁宝宝坐不稳怎么办 2岁宝宝不肯把尿怎么办 踢足球上肢和下肢不协调怎么办 ppt文字放映时重叠怎么办 月子8天腰背疼怎么办 生完五天腰背疼怎么办