Android 重启Acticity以及重启后的生命周期变化

先直接贴出chon重启的代码:

Intent intentReStrat = getIntent();
finish();
startActivity(intentReStrat);

代码就这么简单实际上就这三行,可是当我们实际用的时候会发现有一些不对劲,比如果我在onDestory等生命周期做了什么的时候,所以我们在每个生命周期打上Log看一下

LogUtil.chunyLog().d("onCreat"+ this);

在Activity的每个生命周期都有这个log(后面加this是为了看不同的Activity,因为重启是有新生成新的和销毁上一个两个步骤的)

OK,剩下的就是弄一个按钮在点击事件里把最开始的重启代码写上去

加些来运行。。。

先会出现如下情况:

可以看到先是走了onCreat  onStart onResume  这些不用说了,houm后面我们看到

@1ecbcf6f  这个就是这个Activity特有的

接下来点击按钮,重启Acticity:

接下来就要认真看一下了,我们为了方便把前面的Activity(@1ecbcf6f ) 说成Aty1  

把后来新建的@2005b14f  dang当成新的Aty2   这样就好理解了

OK,接下来复原一下发生了什么

当我们点击按钮之后,Aty1走了onPause 先暂停了

然后Aty2 走了 onCreat onStart onResume 三个创建成功

加下来Aty1  走了onStop  onDestory 被杀死了

可以看到当新的Aty创建后还走了上一个Aty的onStop 和onDestory  这里就会出现一点we

问题了,每个情况不一样,我的是因为绑定Service了,

在onDestory里面 调用了Service里面一个恢复默认的方法 ,这样就会造成一个问题,当我重启Aty之后在后调用的是上一个Aty的onDestory 恢复默认了就会变成重启Aty后没有执行一进来做的事情,所以不对

解决方法:

每个人的解决方法不一样,我的是用SP,在点击按钮的时候把存SP里面的boolean变量(叫asd把)存成true

然后在调用Service方法那里 就是onDestory 取出asd , 如果是true就不调用Service方法,并且把asd赋值false

然后else里面执行退出的方法,这样我们可以模拟一下

一进来Aty直接退出的时候asd是false(默认)所以走else 直接退出调用Service退出方法复原,如果是点击按钮了,就是先把

asd存成true  然后就没有走service 复原方法,这就是我的解决方法,如果有更好的,麻烦评论告诉我一下共同进步。

发布了124 篇原创文章 · 获赞 141 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_36838630/article/details/83622926
今日推荐