原创 2017-07-22 认真的 小苏
技术前沿
今天给大家推荐一篇文章,Android 你可能忽略的提高敲代码效率的方式, 你忽略的快捷键,掌握了这些可以让你的编码效率提高20%。
来个段子
老丈人真体贴,我和女友去她家见她爸妈,老丈人说:我不会像卖肉一样卖女儿,你只需要在十月份第一天给我一分钱,第二天两分,第三天四分,就这样以二的倍增给我一个月,我就把女儿嫁给你。我心想老丈人真好,这不跟白送一样吗?哈哈……… (总感觉哪里不对,编个程序算算一个月给老丈人多少钱呢?)
作为一个程序员我们当然不能用计算器来计算了,我是这样计算的:
public static void main(String[] args) {
int money = 1;
for (int i = 1; i < 31; i++) {
money = money * 2;
}
System.out.println("给老丈人的钱:" + money);
}
得出的结果是: 给老丈人的钱:1073741824 (分)额,貌似被老丈人坑了。
思考
本文主要详细讲解Activity 的内容,Activity 是四大组件之一,不管我们开发什么应用,activity 都是使用最为频繁的一个组件,另外Fragment 也是最常使用的一个组件,下一篇文章我们在讲解fragment,本文主要讲解Activity的生命周期。
Activity 生命周期解析
Activity 生命周期分为两部分:
- 正常情况下的生命周期,即Activity 创建销毁所经过的正常生命周期的改变。
- 异常情况下的生命周期,即Activity 被系统回收或意外终止销毁、屏幕方向发生改变Activity 被销毁重建。
正常情况下的生命周期
下面我们根据这张图来分析Activity 生命周期的每个方法。
Activity生命周期创建和销毁的过程
- onCreate:Activity 被创建,在此方法中主要做一些初始化操作,加载布局文件、加载所需要的数据等。
- onStart : Activity 正在被启动,这时Activity已经可见了,但是没有出现在前台显示,不能和用户交互,在此方法中尽量不要做一些耗时的操作。
- onRestart: 表示activity 正在被重新启动。一般情况下,A 启动 B,B 返回 A,这是生命周期方法会走,onRestart -> onStart -> onResume,B 的生命周期会走 onPause -> onStop。
- onResume: Activity 已经可见并且出现在前台,这时activity 已经可以和用户交互了,与onStart的区别是:onStart 的时候Activity 还在后台,onResume 的时候Activity 在前台。
5.onPause: Activity 正在停止,正常情况下onStop紧接着会被调用,在此方法中,我们可以做一些停止动画、音视频的播放停止、存储一些数据等,需要注意的是Activity的生命周期方法中,除了onStop、onDestory 可以做一些耗时操作但不能太耗时,其他生命周期方法中都禁止做太耗时的操作,否则会影响 Activity的显示,具体的我们可以写一个例子来看一下。
6.onStop: Activity 即将停止,可以做一些回收和资源释放操作。
7.onDestory:Activity即将被销毁,可以做一些回收和资源释放操作。
以上就是Activity 所有的生命周期方法。
我们通过一个例子,来看一些生命周期的方法是如何运行的。
首先我们将A Activity所有的生命周期方法写出来
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
- 当Activity被创建时,会调用哪些方法? 看log
07-22 22:24:45.651 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onCreate
07-22 22:24:45.672 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onStart
07-22 22:24:45.672 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onResume
由此证明Activity 第一次启动时调用如上所示:onCreate -> onStart -> onResume
- 当打开新的Activity 或者到后台运行时,调用那些方法,这个很重要
07-22 22:27:28.165 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onPause
07-22 22:27:28.750 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onStop
如上所示,调用:onPause -> onStop 这两个方法
注: 如果打开的新Activity 采用透明主题,是不会调用当前Activity的onStop 方法的。
- 当从新的Activity回到原来的activity 或者从后台进入前台,调用哪些方法,这个很重要,在开发中经常遇到一些问题,比如:用户切换到后台时,停止音视频的播放,再次进入前台是开始音视频的播放、或者从新刷新数据、恢复数据等操作
07-22 22:29:03.052 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onRestart
07-22 22:29:03.052 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onStart
07-22 22:29:03.052 12699-12699/ipctest.linksu.com.androidipc E/MainActivity: onResume
如上所示,调用:onRestart -> onStart -> onResume
onRestart 只有重新启动Activity 或者 从后台进入前台 才会调用的,这个方法可以解决我们常遇到的问题,比如:Activity 是不是重新启动了,需要做一些操作等,或者从后台进入前台进行一些操作等,而 onStart 和 onResume 就无法判断,可能有些人会在onResume进行数据刷新的操作,这样可能会多执行一些不必要的操作,影响性能问题。
- 当在当前Activity 调用finish方法时,调用 onPause -> onStop -onDestory 方法。
- 当activity 被回收后再次打开,生命周期过程和创建Activity生命周期过程一样。
以上就是Activity 正常情况下的生命周期方法执行过程。
注 : A Activity 启动 B Activity 时,生命周期方法执行顺序是:A onPause -> B onCreate -> B onStart -> B onResume -> A onStop ,在onPause 中一定不要做重量级的操作,否则会影响新的Activity 显示。
异常情况下的生命周期
- 大多数情况发生在竖屏和横屏之间的切换,如下图所示,当竖屏切换为横屏的时候Activity 会回调哪些方法:
如上图所示
- 当Activity 异常情况下,其中 onPause、onStop 、onDestory 都会被调用,调用顺序为: onPause ->onSaveInstanceState -> onStop ->onDestory , Activity会调用 onSaveInstanceState 保存当前Activity的状态,这个方法只有在异常情况下被调用,正常情况下是不会调用onSaveInstanceState方法的,但是按Home键或启动新的Activity会单独触发onSaveInstanceState的调用。
- 异常情况下Activity 被重新创建后,系统不会调用onStart、onResume 方法,会调用onRestoreInstanceState,并把Activity销毁时onSaveInstanceState 方法所保存的Bundle 对象传给 onRestoreInstanceState 和 onCreate ,这样我们就可以通过onRestoreInstanceState 和 onCreate 方法来判断是否被重建,如果被重建了,取出Bundle 保存的数据并恢复,onRestoreInstanceState 调用时机在 onStart 之后。
注: 我们也可以禁止Activity 屏幕旋转,只需要设置:android:configChanges = "orientation"
2 . 内存不足导致低优先级的acitivity 被杀死,不常见的情况
- 这种情况下的,数据存储和恢复过程和上述一致。Activity 的优先级,由高到低:前台Activity --> 可见但非前台Activity(比如activity 中弹出一个对话框) --> 后台activity.
至此,Activity的生命周期我们已经分析完毕,合理运用生命周期中的方法,可以帮助我们解决项目中所遇到的问题。
推荐 好用的翻墙工具 ,打八折 一年仅 79 元,主要是稳定。
参考:Android 开发艺术探索及项目中的一些经验
专题封面
网友评论