您的位置:首页 > 移动开发 > Android开发

Android基础之Activity的生命周期

2015-08-09 22:04 701 查看

1 Activity的生命周期图



2 Activity的生命周期调用解析

2.1 半遮挡情况

  在启动一个半遮挡Activity或者一个透明的Activity放置在栈顶时,当前Activity才调用onPause(),Dialog对话框不会调用:

-->onPause()
<--onResume()


2.2 全遮挡情况

  在启动一个新的全覆盖的Activity时,当前Activity先调用onPause(),在下一个Activity启动完成后,当前Activity才进入onStop():



新的Activity返回到当前Activity时,新的Activity会销毁onDestroy():



2.3 按主菜单键情况

  按主菜单键返回桌面时,当前Activity先调用onPause(),再调用onStop(),FirstActivity:

-->onPause()
-->onStop()


  再点击软件返回退出时的Activity时,FirstActivity:

<--onReStart()
<--onStart()
<--onResume()


3 横竖屏切换

  Configuration 这个类描述了设备的所有配置信息,这些配置信息会影响到应用程序检索的资源。横竖屏切换是最常见的影响配置变化的因素,还有其他影响配置的因素有:语言的更改,例如:中英文切换、键盘的可用性等。

横竖屏切换:android:configChanges=”orientation”
键盘可用性:android:configChanges=”keyboardHidden”
屏幕大小变化:android:configChanges=”screenSize”
语言的更改:android:configChanges=”locale”


  在程序运行时,如果发生Configuration Change会导致当前的Activity被销毁并重新创建,即:先调用onDestroy(),接着调用onCreate()方法。重建的目的是:为了让应用程序通过自动加载可替代资源来适应新的配置。

//启动A
ActivityA: onCreate
ActivityA: onStart
ActivityA: onResume
//横屏转竖屏
ActivityA: onPause
ActivityA: onSaveInstanceState
ActivityA: onStop
ActivityA: onDestroy
//竖屏转横屏
ActivityA: onCreate
ActivityA: onStart
ActivityA: onRestoreInstanceState
ActivityA: onResume


  在Android 3.2之后必须在configChanges中添加screenSize才不会在切屏时重新调用各个生命周期。并执行onConfigurationChanged()方法。

android:configChanges=”orientation|keyboardHidden|screenSize”


  例如:云图手机电视的播放页面的设置,禁止切屏时重新调用各个生命周期。

<activity
android:name="org.stagex.danmaku.player.FungoPlayerActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/Theme.YuntuTheme.NoTitle.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="application/vnd.rn-realmedia" />
<data android:mimeType="video/*" />
<data android:mimeType="video/x-flv" />
<data android:mimeType="video/x-hlv" />
<data android:mimeType="video/x-matroska" />
<data android:mimeType="video/x-msvideo" />
</intent-filter>
</activity>


4 状态保存与恢复

4.1 onSaveInstanceState()

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死;这种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度。

(2)在用户改变屏幕方向时,系统先销毁当前的Activity,然后再重建一个新的。

(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,为了保存当前窗口各个View组件的状态。

(4)回调在onPause()后,onStop()前。

ActivityA: onCreate
ActivityA: onStart
ActivityA: onResume
//横屏转竖屏
ActivityA: onPause
ActivityA: onSaveInstanceState
ActivityA: onStop
ActivityA: onDestroy


(5)例子

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "Something you just typed");
}


4.2 onRestoreInstanceState()

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;

(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据;

(3)回调在onStart()后,onResume()前。

//竖屏转横屏
ActivityA: onCreate
ActivityA: onStart
ActivityA: onRestoreInstanceState
ActivityA: onResume


(3)注意事项:常状态保存和恢复,是在onSaveInstanceState()方法中保存Activity状态、数据;应该在onCreate(Bundle savedInstanceState)中恢复。(由于onRestoreInstanceState()方法不一定执行,效果不是最佳,不采纳)

4.3 注意:保存数据有限

  Activity的onSaveInstanceState()方法不是Activity生命周期方法,也不保证

一定会被调用。它是用来在Activity被意外销毁时保存UI状态的,只能用于保存临

时性数据,例如UI控件的属性等,不能跟数据的持久化存储混为一谈。持久化存储应该在Activity的onPause()/onStop()中实行,在onCreate(Bundle savedInstanceState)中恢复

5 测试demo

public class ActivityA extends Activity {
private ActivityA _this;
private String TAG=ActivityA.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
setContentView(R.layout.activity_a);
_this=this;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG,"onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e(TAG,"onRestoreInstanceState");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@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");
}
public void startActivityB(View v){
Intent intent=new Intent(_this,ActivityB.class);
startActivity(intent);
}
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startActivityB"
android:text="启动ActivityB"/>
</LinearLayout>


public class ActivityB extends Activity {
private ActivityB _this;
private String TAG=ActivityB.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
setContentView(R.layout.activity_b);
_this=this;
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@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");
}
public void startActivityB(View v){
Intent intent=new Intent(_this, ActivityB.class);
startActivity(intent);
}
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startActivityB"
android:text="启动ActivityA" />
</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android