目录
3. startActivityForResult()方法实践
4. onSaveInstanceState()来保存临时数据
5. 怎么阻止Activity在切换横竖屏时销毁重建Activity
1. Android生命周期图解
关于安卓Activity的生命周期就是理解下面这张图,从onCreate()到onDestroy()。
1.1 动态观察生命周期状态
利用Toast将每一个步骤打印出来方便观察,效果如下:
场景1:打开 FirstActivity 然后退出。
FirstActivity_onCreate() -> FirstActivity_onStart() -> FirstActivity_onResume() -> FirstActivity_onPause() -> FirstActivity_onStop() -> FirstActivity_onDestroy()
场景2: 从 FirstActivity 跳转到 SecondActivity。
FirstActivity_onCreate() -> FirstActivity_onStart() -> FirstActivity_onResume() -> FirstActivity_onPause() -> SecondActivity_onCreate() -> SecondActivity_onStart() -> SecondActivity_onResume() -> FirstActivity_onStop()
场景3: 在 SecondActivity 中点击返回键或者调用 finish() 返回到 FirstActivity。
SecondActivity_onPause() -> FirstActivity_onRestart() - FirstActivity_onStart() -> FirstActivity_onResume() -> SecondActivity_onStop() -> SecondActivity_onDestroy()
1.2 生命周期文字详解
- Activity 的整个生命周期发生在 onCreate() 调用与onDestroy()调用之间。Activity 应在onCreate()中执行“全局”状态设置(例如定义布局),并释放onDestroy中的所有其余资源。
- Activity 的可见生命周期发生在onStart() 调用与onStop()调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用onStart() 和onStop()。
- Activity 的前台生命周期发生在onResume() 调用与onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用onPause()。
onCreate():首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态。始终后接 onStart()。
onRestart():在 Activity 已停止并即将再次启动前调用。始终后接 onStart()
onStart():在 Activity 即将对用户可见之前调用。如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。
onResume:在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。
始终后接 onPause()。
onPause():当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。
1.2.1 备注
另外,跳转到另外一个activity时需要销毁(destroy)当前activity方法:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
2. Fragment的生命周期图解
onCreate(): 开始创建Fragment时就调用。
onCreateView(): 当Fragment开始绘制UI界面的时候调用。
onPause(): 当用户离开Fragment时就会调用。
3. startActivityForResult()方法实践
从FirstActivity中设置Data给SecondActivity很简单,Intent.putExtra()就好,那如何在SecondActivity中设置Data返还给FirstActivity呢?这时候就要用到startActivityForResult()方法了,如下图所示,从FirstActivity中传“Im Jere”这样一个String给SecondActivity, SecondActivity接收显示出来,并且返还一个“So Cool!!”String给FirstActivity。效果如下所示?
3.1 实现步骤
1. 使用startActivityForResult()
从FirstActivity到SecondActivity。
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
2. 在SecondActivity设置你想要返回给FirstActivity的数据。
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
3. 如果不想返回数据就设置成Activity.RESULT_CANCELED。
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
4. 然后在FirstActivity中重写onActivityResult()方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}
源码? https://github.com/JereChen11/StartActivityForResult
4. onSaveInstanceState()来保存临时数据
如果你的Activity A存在着临时数据,这时你从Activity A跳转到Activity B,然后系统内存不足,将Activity A回收,这是你又从Activity B返回回到Activity A,这时由于系统回收了Activity A,所以Activity A被回收前带有的临时数据都将不存在,想要保存临时数据,就需要用到onSaveInstanceState()方法。
比如:我们要为EditText保存输入的临时数据:
@Override
protected void onSaveInstanceState(Bundle outState) {
String etString = mEditText.getText().toString();
outState.putString("jereTest", etString);
super.onSaveInstanceState(outState);
}
当Activity A被系统回收后,虽然我们能从Activity B回到Activity A,但本质上是重新新建了Activity A,所以会调用onCreate()方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = findViewById(R.id.et);
//如果saveInstanceState不为null,就是存有临时数据。
if (savedInstanceState != null) {
String oldStateString = savedInstanceState.getString("jereTest");
mEditText.setText(oldStateString);
}
}
5. 怎么阻止Activity在切换横竖屏时销毁重建Activity
Activity的切换横竖屏的生命周期为:onPause() -> onStop() -> onDestry() -> onCreate() -> onStart() -> onResume()
如下图所示:
阻止Activity重建的方法为:
在我们的清单文件AndroidManifest.xml中设置configChanges,允许App在运行时可以旋转屏幕,如下所示:
<!--为我们的MvvmLoginActivity设置configChanges-->
<activity
android:name="com.example.mvcmvpmvvm.mvvm.view.MvvmLoginActivity"
android:configChanges="orientation">
</activity>
这时我们也可以在Activity中重写onConfigurationChanged()方法来获取设备屏幕的信息, 如下所示:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//横屏
Toast.makeText(this, "get onConfigurationChanged landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//竖屏
Toast.makeText(this, "get onConfigurationChanged portrait", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "unDefined", Toast.LENGTH_SHORT).show();
}
}
效果如下所示:
End~~