onCreate():当我们点击Activity时,系统会调用activity的onCreate()方法,在这个方法中我们会初始化当前activity的布局。
onStart():在onCreate()方法执行完成后,activity会执行onStart()方法,此时当前的activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
onResume():在onStart()方法执行完成之后,此时activity会进入onResume()方法中,当前activity状态属于运行状态 (Running),可以与用户进行交互。
onPause():当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPause()方法中,当前activity仍然是可见的,但不能与用户进行交互。
onStop():在onPause()方法执行完成之后,activity会进入onStop()方法中,此时activity对用户是不可见的,在系统内存紧张的情况下,该activity有可能会被系统进行回收。所以一般在当前方法可做资源回收。
onDestory():在onStop()方法完成之后,此时activity进入到onDestory()方法中,结束当前activity。
onRestart():在用户按下home键之后,再次进入到当前activity的时候会调用onRestart()。该动作的调用顺序是onPause()->onStop()->onRestart()->onStart()->onResume()。
1、一个 A Activity 跳转到一个 B Activity中,生命周期的走动为A:onPause--onStop B:onCreate--onStart--OnResume
2、此时再点击Back返回时,生命周期的走动为B:onPause--onStop--onSaveInstanceState--onDestory A:onRestart--onStart--OnResume
3、如果A Activity是透明的,生命周期的走动为:
开始运行程序:A onCreate--A onStart--A OnResume
点击跳转:A onPause--B onCreate--B onStart--B onResume,因为是透明主题,用户可见,没有执行onStop()方法
按下返回键:B onPause--B onStop--B onDestory--A onResume,A是透明主题,没有执行onRestart()、onStart(),而是执行了onResume(),因为A Activity已经创建,只是由用户不可见到用户可见,所以只执行了onResume()。
4、如果B是一个Dialog,A Activity的生命周期转变为onPause状态,A Activity失去焦点,被一个新的非全屏的Activity 或者一个透明的Activity(如弹窗dialog)被放置在栈顶,此时的状态叫做暂停状态(Paused)。
onSaveInstanceState
Activity中的onSaveInstanceState()并不是生命周期方法,其不同于 onCreate()、onPause()等生命周期方法,并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)系统需要销毁一个Activity时,onSaveInstanceState()则会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
调用onSaveInstanceState()方法的情景:
1、用户按下home键时
2、长按home键或者按下菜单键时
3、手机息屏时
4、FirstActivity启动SecondActivity,FirstActivity就会调用,也就是说打开新Activity时,原Activity就会调用
5、默认情况下横竖屏切换时,当竖屏切换到横屏时,系统会销毁竖屏Activity然后创建横屏的Activity,所以竖屏被销毁时,该方法就会被调用。
onConfigurationChanged
onConfigurationChanged事件是在改变屏幕方向、弹出软件盘或者隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。有的时候,当横、竖屏转换时,程序会报错或者终止,就是因为重新执行了onCreate()方法,导致系统崩溃。
按照Activity的生命周期,改变屏幕方向等事件发生时,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作,这就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。可以通过监测onConfigurationChanged事件来解决这个问题,我们要在当前的activity捕获这个事件,需要做以下这么几件事情。
1、权限声明:
<uses-permission Android:name="android.permission.CHANGE_CONFIGURATION">
</uses-permission>
2、声明activity要捕获的事件类型
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
这里一定要声明android:configChanges属性,该属性规定了我们可以在程序中捕获到的事件类型,多个事件类型用 | 分隔。如果这里没有orientation,那么我们在程序中是无法捕获到屏幕改变的事件的。
3、重写activity中的onConfigurationChanged()方法
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(MainActivity.this,"现在是竖屏", Toast.LENGTH_SHORT).show();
}
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
Toast.makeText(MainActivity.this,"现在是横屏", Toast.LENGTH_SHORT).show();
}
}
当横竖屏切换时,会在屏幕上显示Toast内容。