博博blog 博博blog

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

in 学习分享 read (166) 文章转载请注明来源!

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

</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个回调方法,分别打印相应的语句。

@Override
protected void onStart(){
    super.onStart();
    Log.d(TAG,"onStart");
}

以此类推重写。
观察活动的生命周期
启动时
1.png
依次执行onCreate(),onStart(),onResume()。
点击第一个按钮启动NormalActivity,
2.png
由于NormalActivity把MainActivity完全遮挡,因此onPause()和onStop()方法都得到执行。

按下Back返回MainActivity
3.png
由于之前MainActivity进入停止状态,所以onRestart()执行,又会依次执行onStart()和onResume(),但onCreate()不会执行。

点击第二个按钮,启动DialogActivity
4.png
onPause()执行,onStop没有执行,因为DialogActivity没有完全遮挡MainActivity,只是进入暂停状态,
相应按下Back,也只有onResume()方法得到执行。
5.png
按下Back退出程序
6.png
依次执行onPause(),onStop(),onDestroy()方法,最终销毁MainActivity。

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

@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()方法,

@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);
    }
    ......
}
学习分享android
PREVIOUS NEXT
雷姆
拉姆
音乐加载中...
0:00