知识点:Activity生命周期、Activity启动模式 Activity的onSaveInstanceState和onRestoreInstanceState()调用
启动Activity:系统先调用onCreate()
,然后调用onStart()
,最后调用onResume()
方法,activity
进入运行状态。
注意:当activity
中弹出dialog
对话框的时候,activity不会回调onPause
。
然而当activity
启动dialog风格的activity
的时候,此activity会回调onPause函数
。
配置形式:
第一次进入:onCreate onStart
在栈顶再次进入: onCreate onStart
不在栈顶再次进入:onCreate onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
“应用场景:standard,平时直接创建的Activity都是这种模式的Activity,使用一般性的常用
第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onCreate onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
应用场景:singleTop,适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容
页面
第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
应用场景:适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会
启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打
开过的页面,打开之前的页面就ok,不再新建。
第一次进入:onCreate onStart
在栈顶再次进入: onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
应用场景:适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B(singleInstance) -> C,完全退出后,在此启动,首先打开的B
总结下,onSaveInstanceState(Bundle outState)会在以下情况被调用:
1、当用户按下HOME键时。
2、从最近应用中选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从当前activity启动一个新的activity时。
5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。
二、onRestoreInstanceState什么时机被调用?
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用
private VideoView videoView;
private static final String VIDEO_PATH = Environment
.getExternalStorageDirectory()
+ File.separator
+ "mymovie"
+ File.separator + "shenghuaweiji.mp4";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("tag", "onCreate");
if (videoView == null) {
videoView = (VideoView) this.findViewById(R.id.myvideo);
MediaController controller = new MediaController(this);
videoView.setMediaController(controller);
videoView.setVideoPath(VIDEO_PATH);
videoView.requestFocus();
}
if (savedInstanceState != null
&& savedInstanceState.getInt("currentposition") != 0) {
videoView.seekTo(savedInstanceState.getInt("currentposition"));
}
videoView.start();
}
上诉代码就是保存播放进度,再onCreate时候再去取出临时状态设置到videoView。
对于自定义View控件如果需要保存控件的状态,可以重写View的onSaveInstanceState()和onRestoreInstanceState(Parcelable state):
@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
Parcelable superData = super.onSaveInstanceState();
bundle.putParcelable("super_data", superData);
bundle.putParcelableArrayList("save_data", mRects);
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
Bundle bundle = (Bundle) state;
Parcelable superData = bundle.getParcelable("super_data");
mRects = bundle.getParcelableArrayList("save_data");
super.onRestoreInstanceState(superData);
}
3.横竖屏切换时Activity的生命周期
“
此时的生命周期跟清单文件里的配置有关系
1.不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁,当前 activity,然后重
新加载。
2.设置 Activity android:configChanges="orientation|keyboardHidden|screenSize"时,切 屏不会重新调用各个生命
周期,只会执行 onConfigurationChanged 方法去捕捉屏幕键盘变化。
总结:本人对Android初级知识点的总结,望多多提宝贵建议。