Android Activity & Fragment 生命周期学习

您所在的位置:网站首页 fragment跳转到activity Android Activity & Fragment 生命周期学习

Android Activity & Fragment 生命周期学习

#Android Activity & Fragment 生命周期学习| 来源: 网络整理| 查看: 265

目录

1. Android生命周期图解

1.1 动态观察生命周期状态

1.2 生命周期文字详解

1.2.1 备注

2. Fragment的生命周期图解

3. startActivityForResult()方法实践

3.1 实现步骤

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在运行时可以旋转屏幕,如下所示:

这时我们也可以在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~~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3