activity的生命周期以及数据的保存

对于Android开发来说activity的生命周期以及fragment的生周期这些问题都是必须了解和知道的。但是许多人却不是对他们的执行流程不是很了解。仅仅知道他们的生命周期包含那几个方法。以及使用过程中如果进数据的调用和网络的请求。接下来我就针对我写的一个demo进行一下生命周期的论述。

我的代码主要包含两个activity。以及主要的生命周期方法首先我把activity的生命周期的框架图展示给大家:


基本的生命周期在图中都有显示。但是对于onSaveInstanceState方法。这个不属于生命周期的方法很少有人用到。一般的项目不会用到这个方法。但是对于这个方法是如果被执行的?什么时候执行的?网上有很多的说话。这个地方我就针对我实践过程中的调用过程进行一次描述。主要代码:

secondActivity:

@Override
protected void onPause() {
    super.onPause();
    LogUtils.i("test....onPause");
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    LogUtils.i("testf....onSaveInstanceState2");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    LogUtils.i("testf....onSaveInstanceState");
}
firstactivity点击事件:

@OnClick(R.id.tv_first)
public void onViewClicked() {
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);
}

@Override
protected void onStop() {
    super.onStop();
    LogUtils.i("test..f..onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    LogUtils.i("test....onDestroy");
}

@Override
protected void onResume() {
    super.onResume();
    LogUtils.i("test..f..onResume");
}

这个地方我基本都是拷贝一部分。因为都是打印的log。下面我们首先执行的就是进入firstactivity页面,观察生命周期执行的过程:

01-05 11:12:21.742 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onCreate
01-05 11:12:21.742 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStart
01-05 11:12:21.742 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onResume

启动页面后执行的是firstActivity的三个方法;然后我们点击进入second页面:

01-05 11:13:36.692 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onPause
01-05 11:13:36.702 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onCreate
01-05 11:13:36.702 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onStart
01-05 11:13:36.702 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onResume
01-05 11:13:37.122 26234-26234/com.example.administrator.newnet I/GooglePlay: testf....onSaveInstanceState
01-05 11:13:37.122 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStop

这时候我们能够看出在进入第二个页面的时候首先执行的是第一个页面的onpause方法然后才是一次执行第二个页面的生命周期,当second生命周期执行到onResume的时候开始执行first页面的onSaveInstanceState和onstop方法(这个地方说一下我的second页面是将first页面给覆盖的,如果是透明的就不一样了),这个地方执行的onSave..方法是参数为一个的。然后有个朋友在实验的过程中会说我跳转页面的时候。为啥没有执行这个方法,这时候你需要看看你写的方法是几个参数的了。其实这个时候如果你害怕你的数据丢失问题可以在onSave..方法中进行数据的保存。

这时候如果我们点击home键观察生命周期会有什么变化:


01-05 11:26:19.202 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onPause
01-05 11:26:19.722 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onSaveInstanceState
01-05 11:26:19.722 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onStop

这个地方是在第二个页面退出的。因此执行的依次是上面3个方法。这时候页面并没有被销毁。所以没有调用ondestroy方法。同时我们也能看出onSave..方法是在onpause之后。onstop之前被执行。当我们重现点击进入页面观察执行的过程:

01-05 11:28:44.842 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onStart
01-05 11:28:44.842 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onResume

这时候执行的是这两个方法。可以看到并没有执行oncreate方法。表明页面并没有被系统销毁。通过这个地方我们可以在网络请求以及数据初始化清空等地方有了详细的了解。如果你想要页面每次显示都加载一次页面。那么就需要在onresume里面进行网络请求。如果你想在页面显示的时候加载一次那么就在oncreate进行加载。对于对象的初始化和清空。应该根据你们需求进行判断。(这个地方有个分支。如果当系统把你的项目给自动的销毁掉那么就会执行onSave..方法。同时再次进入页面会重写走生命周期流程。我这个地方用你的是模拟器。如果你想要更快的测试可以选择小米模拟器。小米对后台进程的销毁相对来说比较快大概2分钟),当我们关闭页面的时候执行的流程:

01-05 11:35:18.712 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onPause
01-05 11:35:18.722 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStart
01-05 11:35:18.722 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onResume
01-05 11:35:19.122 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onStop
01-05 11:35:19.122 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onDestroy

这个时候second页面就已经关闭掉了。回到了第一个页面,这时候我们可以看到执行流程是当第一个页面重启后才将第二个页面给关闭掉。并不是先关闭第二个页面在加载第一个页面。

如果我进行横竖屏切换观察执行流程:

01-05 11:38:54.962 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onPause
01-05 11:38:54.962 26234-26234/com.example.administrator.newnet I/GooglePlay: testf....onSaveInstanceState
01-05 11:38:54.962 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStop
01-05 11:38:54.962 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onDestroy
01-05 11:38:54.982 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onCreate
01-05 11:38:54.982 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStart
01-05 11:38:54.982 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onResume

这个地方首先先将页面给关闭掉。同时执行了onSave..方法。然后将页面重新启动。这个地方可以看到从新执行了oncreate方法。所以说如果你的项目没有做横竖屏的屏幕适配那么赶紧把横竖屏给禁止了吧。防止测试人员挑你bug.

如果我们把项目置于后台然后进入其他项目那么生命周期会如何执行呢?

01-05 11:41:39.172 26234-26234/com.example.administrator.newnet I/GooglePlay: test....onPause
01-05 11:41:39.562 26234-26234/com.example.administrator.newnet I/GooglePlay: testf....onSaveInstanceState
01-05 11:41:39.562 26234-26234/com.example.administrator.newnet I/GooglePlay: test..f..onStop

执行还是这3个方法onsave..方法的数据保存在这个地方你大概也知道了。同时也知道了执行流程

那么对于进入第二个页面是透明状态生命周期如果执行呢?

这个地方就不粘贴打印的log了。显示并没有执行到onstop方法。由此可以如果你进入的页面并没有将你的第一个页面给覆盖掉那么将不会执行onstop方法.分析到这里了

总结:

对于生命周期和onsave..方法的执行。我这里提供了3个方法。一个是在跳转页面的时候进行数据的打印,发现方法被打印。在页面切换的时候进行打印。同时生命周期从新创建并执行流程。在进入后台时。进入其他项目。也会执行到onsave方法。由于是模拟器。不能执行关屏操作所以这个没办法分享。如果我那个地方有错误请大神指出。同时我这些实验都是通过模拟器操作。当前没有真机抱歉。如果不太明白的朋友还是自己流程跑一边。会更加清楚明了。面试这个地方也会经常遇到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值