Android-活动的生命周期(二)

2022-04-25 15:39:33 浏览数 (1)

体验活动生命周期 主活动:MainActivity, 子活动:NormalActivity和DialogActivity。 两个子活动分别加入一个TextView, 然后在AndroidManifest.xml内配置DialogActivity的主题。

代码语言:javascript复制
</activity>
<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity"
    android:theme="@style/Theme.AppCompat.Dialog">
</activity>

使用了android:theme属性,用于给当前活动指定主题的,这里用的,android:theme="@style/Theme.AppCompat.Dialog" 让DialogActivity使用对话框式的主题。

修改主活动的布局和代码,加入两个按钮,分别用于启动NormalActivity和DialogActivity。 然后重写Activity的7个回调方法,分别打印相应的语句。

代码语言:javascript复制
@Override
protected void onStart(){
    super.onStart();
    Log.d(TAG,"onStart");
}

以此类推重写。 观察活动的生命周期 启动时

依次执行onCreate(),onStart(),onResume()。 点击第一个按钮启动NormalActivity,

由于NormalActivity把MainActivity完全遮挡,因此onPause()和onStop()方法都得到执行。

按下Back返回MainActivity

由于之前MainActivity进入停止状态,所以onRestart()执行,又会依次执行onStart()和onResume(),但onCreate()不会执行。

点击第二个按钮,启动DialogActivity

onPause()执行,onStop没有执行,因为DialogActivity没有完全遮挡MainActivity,只是进入暂停状态, 相应按下Back,也只有onResume()方法得到执行。

按下Back退出程序

依次执行onPause(),onStop(),onDestroy()方法,最终销毁MainActivity。

活动被回收怎么办 当一个活动进入停止状态,有可能被系统回收,那么当有一个活动A,在A基础上启动了活动B,A进入停止状态,这时由于系统内存不足,A被回收掉,这时按下Back键还是会正常显示A,但是不会执行onRestart(),而是执行A的onCreate()方法。 但是A中可能存有临时数据,这样数据也会丢失。Activity提供了一个onSaveInstanceState()回调方法,这个方法保证活动在被回收之前一定会被调用。 onSaveInstanceState()携带了一个Bundle类型参数,提供了一系列的方法保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据,每个保存方法需要传入两个参数, 第一个参数是键,用于后面从Bundle中取值, 第二个参数是真正要保存的内容, 在MainActivity添加以下代码,将临时数据保存:

代码语言:javascript复制
@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    String tempData = "Something you just typed";
    outState.putString("data_key",tempData);
}

数据保存了,一直使用的onCreate()方法也有个Bundle类型参数,这个参数一般情况下都是null,但是如果活动被系统回收之前有通过onSaveInstanceState()方法保存数据的话,这个参数就会带有之前保存的全部数据,只需要通过相应的取值方法将数据取出即可,修改MainActivity的onCreate()方法,

代码语言:javascript复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate");
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null){
        String tempData = savedInstanceState.getString("data_kay");
        Log.d(TAG,tempData);
    }
    ......
}

0 人点赞