Acitvity的生命周期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acitvity的生命周期相关的知识,希望对你有一定的参考价值。


传递参数:


Intent intent = new Intent(MainActivity.this , SecondActivity.class);
intent.putExtra("welcome","Hello world !");
intent.putExtra("isTrue",true);
intent.putExtra("int2",11);
startActivityForResult(intent,1);

 

接收:

Intent intent = getIntent();
String data = intent.getStringExtra("welcome");

 

回传:


Intent intent = new Intent();
intent.putExtra("return_data","1111");
setResult(RESULT_OK, intent);
finish();

 

Activity:

onSaveInstanceState(Bundle oldState) 活动回收前调用,可以保存临时数据

回收后进入Activity会重新进入onCreate(Bundle savedInstanceState) 恢复保存的临时数据

 

活动启动模式:

活动activity中配置android:launchMode=""

standard

        每次启动都创建该活动的一个新的实例放入栈顶

singleTop

        启动时,若发现栈顶已经是该活动,则直接使用不再创建

        若该活动不在栈顶,则仍需新建

singleTask

        启动时,检查栈中是否有该活动,有则直接使用,并将其上的所有活动出栈

        其他活动onDestory(),该活动onRestart();

singleInstance

        场景:程序中的一个活动允许其他活动调用,其他程序和我们的程序共享该活动的实例

        每个应用程序都有自己的返回栈,同一活动在不同的返回栈中入栈必然会创建新的实例,该模式可以解决这个问题。

        该模式下会有一个单独的返回栈来管理这个活动,不论哪个程序来访问这个活动,都公用同一个返回栈。

 

 

Android栈:

1.一个应用程序一般都是由多个activity组成的。

2.任务栈(task stack)(别名back stack后退栈) 记录存放用户开启的activity的。

3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。

4.任务栈的id是一个integer的数据类型 自增长的

5.在android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。

6.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。

7.默认情况下, 关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。

 

Android用栈存放activity

启动一个新的活动,入栈,并处于栈顶。

销毁一个活动时,栈顶活动出栈。 

系统总是会显示处于栈顶的活动给用户,即栈顶活动可见。

 

活动状态:

1、运行

        一个活动位于栈顶时,这活动处于运行状态

2、暂停

        一个活动不处于栈顶位置,但仍然可见时,这活动处于暂停状态。活动完全存活着。(比如栈顶活动为对话框形式

3、停止

        一个活动不处于栈顶位置,且完全不可见,这活动处于停止状态。(还在栈中)

4、销毁

        一个活动从栈中移除后,这活动处于销毁状态。

 

 

activity的生存期

1. onCreate() 

活动第一次被创建的时候调用,在该方法中完成初始化操作,加载布局、绑定事件等。 

2. onStart() 

由不可见变为可见的时候调用。(非栈顶到栈顶) 

3. onResume() 

在活动准备好和用户交互的时候调用。(栈顶) 

4. onPause() 

准备去启动或恢复另一个活动时调用。 

5. onStop() 

活动完全不可见时调用。 

6. onDestroy() 

在活动被销毁前调用。完成释放内存操作。 

7. onRestart() 

在活动由停止状态变为运行状态前调用。 

 

除onRestart()外,其他两两对应,活动分为三种生存期: 

1. 完整生存期 

onCreate()和onDestroy()之间所经历的,就是完整生存期。 

2. 可见生存期 

onstart()和onStop()之间所经历的,就是可见生存期。 

3. 前台生存期 

onResume()和onPause()之间所经历的,就是可见生存期。

 

Acitvity的生命周期_android


 

 

 

===================================================================================

面试:

1、什么是Activity

通俗一点说Activity就是一个界面,这个界面里面可以放置各个控件。Activity的界面也是用xml表示,放置在res->layout下面。每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个Activity。

 

2、请描述一下Activity的生命周期

onCreate(Bundle savedInstanceState):创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。

onStart():activity变为在屏幕上对用户可见时调用

onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个activity,该方法总是被调用)

onPause():activity被暂停或者收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧

onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。

onRestart():重新启动activity时调用,该活动仍在栈中,而不是启动新的activity

onDestroy():activity被完全从系统内存中移除时调用

 

3、两个Activity之间跳转时必然会执行的是哪几个方法:

onCreate():在activity生命周期开始时调用

onRestoreInstanceState():用来恢复UI状态

onRestart():当activity重新启动时调用

onStart():当activity对用户即将可见时调用

onResume():当activity与用户交互时,绘制界面

onSaveInstanceState():当activity即将移除栈顶保留UI状态时被调用

onPause():暂停当前活动的activity,提交持久数据的改变,停止动画和其他占用CPu资源的东西,由于下一个activity在这个方法返回之前不会resume,所以这个方法的代码执行要快

onStop():activity不再可见时调用

onDestroy():在activity销毁栈时被调用的最后一个方法

 

4、横竖屏幕切换时候activity的生命周期

 

①不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,且竖屏时会执行两次

②设置activity的android:configChanges=”orientation"时,切屏还是会调用各个生命周期,切横屏,竖屏时只会执行一次

③设置activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

 

5、你后台的Activity被系统回收怎么办?

系统会帮我们记录下回收之前Activity的状态,再次调用被回收的Activity就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里面带上参数savedInstanceState,savedInstanceState是一个Bundle对象,基本上可以把它理解为系统帮你维护的一个map对象,使用它可以恢复到回收前的状态

 

6、如何将一个activity设置为窗口的样式

 

①在你的style.xml文件中可以新建一如下的类似Dialog的style:

<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog></style>

②在AndroidManifest.xml中在你需要显示为窗口的activity中添加如下属性:

android:theme="@style/Theme.FloatActivity"即可

也可以直接添加对应需要展示为Dialog style的activity的android:theme属性值为:android:theme="@android:style/Theme.Dialog"

 

 

8、在同一个程序,但不同的activity中是否可以放在不同的Task任务栈中?

可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记

以上是关于Acitvity的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Activity生命周期

片段生命周期 - 在显示/隐藏时调用哪个方法?

Android四大组件之Activity详解 · yclog

Android Fragment 隐藏或显示时调用的生命周期方法

Activity横竖屏切换生命周期变化

Fragment的生命周期