首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Android四大组件之—Activity

2024-12-15 来源:花图问答

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

一个应用通常由多个彼此松散联系的 Activity 组成。 一般会指定应用中的某个 Activity 为“主”Activity,即首次启动应用时呈现给用户的那个 Activity。 而且每个 Activity 均可启动另一个 Activity,以便执行不同的操作。 每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈上,并取得用户焦点。 返回栈遵循基本的“==后进先出==”堆栈机制,因此,当用户完成当前 Activity 并按“返回”按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一 Activity。 (任务和返回栈文档中对返回栈有更详细的阐述。)

当一个 Activity 因某个新 Activity 启动而停止时,系统会通过该 Activity 的生命周期回调方法通知其这一状态变化。Activity 因状态变化—系统是创建 Activity、停止 Activity、恢复 Activity 还是销毁 Activity— 而收到的回调方法可能有若干种,每一种回调都会为您提供执行与该状态变化相应的特定操作的机会。 例如,停止时,您的 Activity 应释放任何大型对象,例如网络或数据库连接。 当 Activity 恢复时,您可以重新获取所需资源,并恢复执行中断的操作。 这些状态转变都是 Activity 生命周期的一部分。

Activity生命周期中每个函数的作用:

onCreate() :

当Activity第一次被创建的时候调用此方法.一般在此方法中进行控件的声明,添加事件等初始化工作.

onStart():

当Activity被显示到屏幕上的时候调用此方法.

onResume():

当此Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.

onRestart():

当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法.

onPause():

当第一个Activity通过Intent启动第二个Activity的时候,将调用第一个Activity的onPause()方法.然后调用第二个Activity的onCreate(),onStart(),onResume()方法,接着调用第一个Activity的onStop()方法.如果Activity重新获得焦点,则将调用onResume()方法;如果此Activity进入用户不可见状态,那么将调用onStop()方法.

onStop():

当第一个Activity被第二个Activity完全覆盖,或者被销毁的时候回调用此方法.如果此Activity还会与用户进行交互,将调用onRestart方法();如果此Activity将被销毁,那么将调用onDestroy()方法.

onDestroy():

Activity被销毁之前调用此方法.或者是调用finish()方法结束Activity的时候调用此方法.可以在此方法中进行收尾工作,比如释放资源等.

(注意:重写某个Activity的这些回调方法的时候需要首先在第一行调用基类Activity的相应的回调方法.比如super.onCreate(),super.onStart()等等.)

两个Activity跳转的生命周期

1.启动应用时,MainActivity的生命周期,与一个Activity的生命周期是一样的。

2.当打开第二个界面时,我们可以发现,先是MainActivity不可操作,然后就是FirstActivity从创建,到可见,再到可操作,最后才是MainActivity不可见。

3.当关闭第二个界面时,首先是FirstActivity不可操作,接着MianActivity执行了,再次可见,可见,可操作的流程,最终才是FirstActivity不可见,销毁。

4.当关闭应用时,与一个Activity的关闭时的生命周期一样。

注意
在两个Activity生命周期方法中,这里执行了一个新的生命周期方法,它就是onRestart()方法,它的含义就是,当某个Activity再次可见时执行

关于“熄屏、转屏、Home键返回、Activity跳转”对activity生命状态影响

1 熄屏

当程序被打开,生命状态运行到Onresume():

05-15 22:30:24.074 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:30:24.113 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:30:24.116 30285-30285/? I/houyafei: -------------->onResume()
熄屏后:
05-15 22:31:42.417 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:31:42.431 30285-30285/? I/houyafei: -------------->onStop()
再次点亮屏幕:
05-15 22:32:48.090 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:32:48.100 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:32:48.103 30285-30285/? I/houyafei: -------------->onResume()

退出程序:

05-15 22:34:13.997 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:34:14.308 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:34:14.308 30285-30285/? I/houyafei: -------------->onDestroy()

2. 转屏

打开程序(竖屏):

05-15 22:35:01.520 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:35:01.529 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:35:01.531 30285-30285/? I/houyafei: -------------->onResume()
开始旋转为横屏:
05-15 22:35:38.452 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:35:38.453 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:35:38.453 30285-30285/? I/houyafei: -------------->onDestroy()
05-15 22:35:38.516 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:35:38.532 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:35:38.532 30285-30285/? I/houyafei: -------------->onResume()
再次旋转为竖屏:
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onDestroy()
05-15 22:37:01.387 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:37:01.409 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:37:01.411 30285-30285/? I/houyafei: -------------->onResume()
关闭程序:
05-15 22:37:55.848 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:37:56.139 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:37:56.139 30285-30285/? I/houyafei: -------------->onDestroy()

也就是说,选装屏幕相当于程序瞬间关闭然后重新打开。

3. activity之间跳转

打开程序启动第一个Activity:

05-15 22:39:31.526 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:39:31.537 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:39:31.538 30285-30285/? I/houyafei: -------------->onResume()

点击切换到第二个Activity,则第一个Activity的生命状态:

05-15 22:40:17.056 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:40:17.499 30285-30285/? I/houyafei: -------------->onStop()

再返回第一个Activity:

05-15 22:40:45.307 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:40:45.308 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:40:45.308 30285-30285/? I/houyafei: -------------->onResume()

到这里大家肯定会发现,切换Activity和熄屏状态,对Activity生命周期的影响是一样的。

4.返回桌面

打开Activity:
05-15 22:43:16.000 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:43:16.011 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:43:16.013 30285-30285/? I/houyafei: -------------->onResume()
点击Home键后:
05-15 22:43:51.699 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:43:52.011 30285-30285/? I/houyafei: -------------->onStop()
点击桌面程序图标再次打开程序(1):
05-15 22:44:36.597 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:44:36.601 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:44:36.602 30285-30285/? I/houyafei: -------------->onResume()
点击菜单键再次打开程序(2):
05-15 22:47:02.261 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:47:02.275 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:47:02.276 30285-30285/? I/houyafei: -------------->onResume()

以上两种状态是一致的。

5.总结

对于,熄屏、Activity跳转、Home键返回主界面等对Activity生命周期的影响是一样的。因此,对于一些程序运行的数据一定要在onPause()中保存,在onResume()重新读取。

显示全文