体验活动生命周期 主活动: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);
}
......
}