现在的位置: 首页 > 综合 > 正文

Activity的生命周期

2013年08月31日 ⁄ 综合 ⁄ 共 2205字 ⁄ 字号 评论关闭
Activity的生命周期
1.七种方法
   void onCreate(Bundle savedInstanceState) Activity被创建的时候调用
   void onStart()当用户可以看到Activity界面的时候调用
   void onResume()当Activity获取焦点的时候调用(获取焦点:Activity中定义的有点击事件并可点击)
   void onPause()当Activity失去焦点的时候调用
   void onStop()当用户看不到Activity界面的时候调用
   void onDestroy()当Activity销毁的时候调用
   void onRestart()当Activity被其他的Activity覆盖后又重新打开的时候调用(随之会调 onStart().onResume())
2.示例
   情况一:当看视频的时候突然来电话了.视频Activity会顺序执行如下方法.
 接通电话:onPause()->onStop(可以在此方法中处理视频的暂停)
 挂断电话:onRestart()->onStart(可以在此方法中处理暂停视频的播放)->onResume()
   情况二:当一个Activity跳转到另一个Activity(整个Activity填充父窗口)
第一个Activity:onCreate()->onStart()->onResume()->onPause()
第二个Activity:onCreate()->onStart()->onResume()
第一个Activity:onStop()
按返回键返回到第一个Activity
第二个Activity:onPause()
第一个Activity:onRestart()->onStart()->onResume()
第二个Activity:onStop()->onDestroy()
3.横竖屏切换(主要是软键盘会影响Activity的生命周期)
竖屏切到横屏:Activity会被销毁并重新创建
onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
横屏切到竖屏:Activity会被销毁两次并重新创建两次
onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
如果不希望重新创建Activity实例,可以按如下配置Activity:
<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation">
上面的android:configChanges属性指定了要捕获"屏幕方向"和"键盘显示隐藏"变化,
当捕获到这些变化后会调用Activity的onConfigurationChanged()方法。
4.onSaveInstanceState()和 onRestoreInstanceState()方法
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,
它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。
当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。
但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。
因为在这种情况下,用户的行为决定了不需要保存Activity的状态。
通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变,Activity会被摧毁并且被重新创建,
如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。
可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法,如下:
public class PreferencesActivity extends Activity {
    private String name;
     protected void onSaveInstanceState(Bundle outState) {
outState.putString("name", "liming");//被摧毁前缓存一些数据
super.onSaveInstanceState(outState);
    }
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
name = savedInstanceState.getString("name"); //被重新创建后恢复缓存的数据
super.onRestoreInstanceState(savedInstanceState);
    }
}

抱歉!评论已关闭.