一.返回栈:
启动活动时候,该活动会入栈,并且会处于栈顶的位置,调用finish()的方法,
该活动会出栈,使之前的活动显示出来。
效果图:
二.活动的状态
分为:
运行,暂停,停止,销毁。
创建:oncreate(创建)
运行:onstart(开始,活动可见),onresume(正在运行),onrestart(重新启动)
暂停,停止:onpause(正在停止),onstop(完全停止,活动不可见)
销毁:ondestroy(退出)
- Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果您的Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,onDestroy() 中停止该线程。
- Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart()中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
- Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 —例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
来源 https://developer.android.google.cn/guide/components/activities.html#Lifecycle
启动:
点击按钮go to Main2:
点击返回:
退出:
三.活动的模式
standard,singleTop,singleTask,singleInstance(复杂)
四.保存Activity状态
当Activity暂停或者停止的时候,Activity的对象依然保存在内存中,使用onSaveInstanceState()可以保存和传递内容,
该方法内会有一个Bundle,为系统传递。
尤其在旋转屏幕的状态下。活动会销毁重建,会使原有的数据消失比如(EditText)的内容。
接下来验证:代码图
public static String TAG = "MainActivity";
EditText edit;
TextView getText;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
Button get = (Button)findViewById(R.id.get);
edit = (EditText)findViewById(R.id.test_edit);
getText = (TextView)findViewById(R.id.get_text);
get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getText.setText(edit.getText());
}
});
}
效果图:
点击按钮获取内容:
,
旋转屏幕:
发现内容消失。
这个时候就要用到onSaveInstanceState()的方法,不然肯定会影响到用户体验。
代码图:
public static String TAG = "MainActivity";
EditText edit;
TextView getText;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
Button get = (Button)findViewById(R.id.get);
edit = (EditText)findViewById(R.id.test_edit);
getText = (TextView)findViewById(R.id.get_text);
if (savedInstanceState!=null){
getText.setText(savedInstanceState.getString("content"));
edit.setText(savedInstanceState.getString("content"));
}
get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getText.setText(edit.getText());
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("content",edit.getText().toString());
Log.e(TAG, "onSaveInstanceState: "+edit.getText().toString());
}
效果图
获取:
旋转后:
成功保存的当前活动的内容。
*发现了一个问题:在未加onsaveInstance的时候 旋转屏幕,editText的内容不会消失,而在使用该方法的时候,它的内容奇怪的消失了*
原因:
不过,即使您什么都不做,也不实现 onSaveInstanceState(),Activity 类的
onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id属性)。如果小部件没有 ID,则系统无法保存其状态。