《Android 开发艺术探索》去年就看完了,但由于当时水平不够,加上自己脑子愚笨,很多知识没有完全消化。还是再来回顾、敲敲、总结一遍吧。
1.A 中启动 B,如果 B 是透明主题,A 的 onStop 不会被调用 ???
2.从 B 中返回 A,A 的生命周期:onRestart -> onStart -> onResume
3.onStart 和 onStop 在该 Activity 是否在可见时回调; 而 onResume 和 onPause 则在 Activity 是否在前台时回调。
注: “可见”只是说显示,但不一定是用户可以看到、交互; “前台”就是看得见、摸得着。
4.如何实现点击返回键,Activity 的 onDestroy 不被执行?
在所在的 Activity 中重写 onKeyDown()
方法,拦截返回事件,然后调用 moveTaskToBack()
方法:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
moveTaskToBack(true); //将当前 Activity 的 Task 放到 Activity 栈的后边
return false;
}
return super.onKeyDown(keyCode, event);
}
5.Activity 的启动流程简述:
Activity 的 Task 和 栈的概念?
系统回收或者当前设备 Configuration 改变导致 Activity 被销毁重建的情况。
在系统配置发生改变时,默认情况下 Activity 会被销毁重建。
异常终止的情况下会调用 onSaveInstanceState()
方法,重新创建后会调用 onRestoreInstanceState()
:
Bundle
中数据恢复在
onCreate
或者onRestoreInstanceState
中进行都可以,但是官方文件建议在onRestoreInstanceState
中,因为它被调用时 bundle 一定是有值的,不需要判断。
在 Activity 的异常情况下,系统会这两个保存、恢复方法中为我们做一定的工作,比如保存当前 Activity 的视图结构(View 的状态)。
Activity 异常终止时,系统保存 View 状态的流程简述:
委托思想:上层委托下层去处理一件事。 比如这里的数据恢复,还有 View 的绘制过程、事件分发等。
Activity 的三种优先级,从高到低顺序:
四大组件的优先级都比较高,因此后台想执行耗时工作时,需要依赖四大组件来保活。 比如讲后台工作放到 Service 中。
我们可以在 AndroidManifest.xml 中配置 android:configChanges
来指定该 Activity 在哪些系统配置改变时不重新建立。
配置项很多,常用的是这四个:
android:configChanges="screenSize|orientation|keyboardHidden|locale"
screenSize|orientation
指的是在屏幕旋转和尺寸改变时不重新创建keyboardHidden
指的是可用键盘的改变locale
指的是系统语言切换注意: 从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。 因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 “orientation” 值以外,您还必须添加 “screenSize” 值。
现在,当其中一个配置发生变化时,Activity 不会重启。相反,Activity 会调用 onConfigurationChanged()
方法,并且向此方法传递 Configuration 对象,这个对象代表当前所有配置,你可以根据不同配置进行不同的处理:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
如果在配置改变时仍使用旧的状态,则可以不实现 onConfigurationChanged()
。
《Android 开发艺术探索》 https://developer.android.com/guide/topics/resources/runtime-changes.html