Andorid学习【基础篇】Android应用程序生命周期
来源:互联网 发布:sig516突击步枪知乎 编辑:程序博客网 时间:2024/06/05 15:10
与C++和Java不同的是,表面上Android应用程序并没有从main()函数启动,而是通过一系列的回调方法,方法响应用户的具体操作而被调用,使Andorid应用程序能切换到对应的状态,例如开启应用后,程序开始载入画面;用户操作,进入其他的页面;用户接电话、收发短信时,程序被暂停运行;用户想要暂时离开应用,回到桌面上打开其他应用等等,Andorid程序中的回调方法将会在相应的用户操作后执行,执行完毕之后,使得整个应用到达某一个状态,应用在每一种状态之间的切换,便构成了Android应用程序的生命周期。
也可以这样简单地理解Android应用程序生命周期:用户操作驱动相应的回调方法,相应的回调方法被执行后,使得状态在切换,状态的切换便构成了生命周期。
在Android的生命周期,有如下6个状态,分别是:Created,Started,Resumed,Paused,Stopped,Destroyed。相应的,有如下7个回调方法,使得Activity在不同的状态间切换,分别是:onCreate(),onStart(), onResume(),onPause(), onStop(),onRestart(),onDestroy()。当然这些方法只有在相应的用户操作或者状态发生之后才会被调用,在大多数情况下,我们可能根据需要,重载一部分回调方法,使得应用能如用户那样期待的正常运行。关于生命周期的流动方式,android官方教程给出的“金字塔式”图很直观地说明了问题:
一、 onCreate()
在启动应用后,首先调用onCreate()方法,该方法在整个应用的生命周期中只会被调用一次,主要完成应用的一些初始化工作,例如layout的载入,按钮、文本等等一些UI组件的初始化,或者是一些变量的初始化,因此如果要在启动时完成需要的初始化工作,只要重载该方法即可。
当应用开启时,系统将会根据在AndroidManifest.xml中指定的启动类,以该启动类作为入口进入程序,而onCreate以及其他6个回调方法都必须在该类中重载,其中,指定启动类,也就是我们的主类的写法,例如我们指定MainActivity.class作为主类,那么在AndroidManifest.xml中指定形式如下:
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>
一般来说,在onCreate()方法中,主要的目的是为该Activity创建一个实例,一般要做的事情有如下几件:
1. 调用父类onCreate()方法,载入上次保存的实例
2. 载入用户界面,一般来说是main_activity.xml
3. 定义或者调用一些用户自己定义的初始化方法
4. 为layout_main.xml中的UI控件分配相应变量,使得之后可以对其进行操作和管理
一个简单的例子如下:
TextView mTextView; // UI控件变量private void userMethod() { // Codes goes here}@Overridepublic void onCreate(Bundle savedInstanceState) { // 调用父类onCreate()方法,载入上次保存的实例 super.onCreate(savedInstanceState); // 调用用户自定义的方法 // 载入用户界面 setContentView(R.layout.main_activity); // 初始化UI控件变量 mTextView = (TextView) findViewById(R.id.text_message);}其中,载入上次保存的实例savedInstanceState这一操作,将会在后面的博客文章中关于重新创建Activity的文章中,进行深入的学习。
当应用完成onCreate()的调用之后,到达Created状态,紧接着,系统将会立即调用onStart()和onResume()方法,使应用到达在前台显示出来(visible),如果严格地说,在Started状态时应用已经在前台显示出来,但和Created状态一样,Started状态也是一个暂态,用户界面不会作任何停留,就会进入到Resumed状态,该状态便是应用稳定显示在前台时所处的状态,直到用户打算暂停、停止或者销毁应用时,onPause(),onStop(),onDestroy()方法将会被调用,将Activity带入金字塔的下层状态Paused,Stopped,Destroyed状态中,而且每一次回调方法的调用只会使状态改变一次,或者说只在金字塔上移动一层。关于onStart()和onResume()在一个应用中的重要意义和更多重载建议,将在下面Paused和Stopped状态返回Resumed和Started状态时的调用中体现。
二、 onDestory()
生命周期的最终状态为Destroyed销毁状态,一般来说,是指用户完全停止Activity时候的状态,此时应用的所用实例将会随之被销毁,而且很多的回收已经随着onPause()和onStop()的调用完成,因此,在大多数情况下,onDestroy()方法是不用重载的。但是如果在onCreate()中或者其他地方启动过后台线程,那么onDestroy()方法应该按如下方式重载:
@Overridepublic void onDestroy() { super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing();}
onDestroy()除了上述经过onPause(),onStop()的调用途径之外,还可以通过调用系统方法finish()的途径,最常见的一个例子就是在用户点击Android设备上的返回按钮时,退出应用,此时需要重写方法onKeyDown(),用以监听点击事件,例如:
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); } return false;}
三、 关于三个稳定状态Resume,Paused,Stopped的说明
1. Resume
当应用处于该状态时,一直处于前台运行状态,用户可以与其进行交互,用更一般的说法是,此时应用正在run
2. Paused
当应用处于该状态时,一般是指现在的Activity被一个新的Activity以半透明或者半覆盖的方式遮挡,此时现在的Activity不会响应用户的输入,且任何代码都不会被执行
3. Stopped
当应用处于该状态时,一般是指现在的Activity被完全隐藏,或者对用户完全不可见,此时的Activity是在后台运行的,activity instance和状态信息,如变量等等会被保存,但是不会执行
四、 几点建议
Google为了写出良好的生命周期管理给出了几点指导建议:
1. 接电话、切换到其他Activity时,原Activity不能销毁
2. 当Activity没有活跃时,应使其占用资源最少,不能耗尽系统资源
3. 当用户离开一段时间内,不要丢失用户的操作状态
4. 当屏幕进行横向/纵向切换时,不要丢失用户操作状态
- Andorid学习【基础篇】Android应用程序生命周期
- Andorid ActionBar基础学习
- Android应用程序基础(Manifest结构预览约定和进程生命周期)
- Android 4学习(5):概述 - Android应用程序的生命周期
- Android 应用程序的生命周期
- Android 应用程序的生命周期
- Android应用程序的生命周期
- Android应用程序生命周期
- Android应用程序的生命周期
- Android应用程序生命周期
- Android应用程序生命周期
- Android应用程序的生命周期
- android Activity 应用程序 生命周期
- Android应用程序的生命周期
- Android应用程序的生命周期
- Android应用程序的生命周期
- Android应用程序的生命周期
- Android应用程序生命周期
- ARM板上挂载NFS文件系统
- 安装 配置 初次体验gradle
- virualbox下安装增强功能报错的解决办法和完成共享文件夹功能
- java根据GPS经纬度坐标计算两点的距离算法
- 黑马程序员——java中的集合
- Andorid学习【基础篇】Android应用程序生命周期
- 【转载】Z-STACK中关于非易失性存储器Nv操作实例
- uva 439
- JavaScript事件mouseover和mouseenter的区别
- ArrayList:
- 机房收费系统重构——数据库设计
- in-house发布的ipa包,如何触发下载安装
- Android中的子菜单(SubMenu)使用案例
- 方法的分类: