首页 > 代码库 > 【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)
【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)
转载请注明:http://blog.csdn.net/zhaokaiqiang1992
本文翻译自http://developer.android.com/training/basics/activity-lifecycle/starting.html ,大家可以去看原文。
Android并不象其他的程序,它不是从main()函数开始加载的,Android系统是通过在不同的时期调用生命周期的对应回调方法完成代码的初始化的。所以如果要了解Android程序,就必须了解启动顺序和销毁顺序。
这一节课程我们将学习非常重要的生命周期方法,并展示给你如何控制生命周期的回调方法来初始化一个Activity实例。
了解生命周期的回调方法
在一个Activity的存在过程中,系统会按照一定的顺序,调用一个”金字塔“形状的生命周期方法模型。Activity的生命周期的每一个阶段,都是金字塔模型的一个单独的步骤。当系统创建一个Activity的实例的时候,每一个回调方法都推动着Activity的状态一步步的往前发展。在”金字塔“的最上端的状态,是Activity可以一直存在与窗口最前端,并且可以和用户进行交互的状态值。
当用户离开Activity之后,系统会调用其他的方法把Activity的状态从"金字塔”的塔尖上推下来,这样Activity才能够被销毁。在有些情况下,Activity只会在塔尖向下移动一点,然后就停在那个状态值了,比如说用户打开了另外一个APP;当用户再次回到我们的APP的时候,状态值又会回到塔尖状态,恢复到用户离开前的状态。
上面这个图就是Activity生命周期的金字塔模型,从上面这个模型中,我们可以清楚的看出Activity的状态值的变化和转换。当程序调用onStart之后,Activity对用户来说就是可以见的了,之后调用onResume,Activity便一直停留在Resumed状态,这应该是Activity可以与用户正常交互的状态。在这之后,如果Activity被部分遮挡,Activity的onPause方法会被调用,然后Activity进入Paused状态,这个时候Activity的界面对用户来说是部分可见的。如果遮挡部分离开界面,那么Activity就又回到了Resumed状态,恢复到用户离开前的状态。如果Activity的界面完全的被一个Activity遮挡之后,那么Activity的onStop方法会被调用,Activity界面对用户来说完全不可见,即不可交互状态,这个时候进入Stopped状态,如果内存不够用,那么这个Activity很有可能被内存回收器回收掉。但是,如果在被回收之前,用户又回到了这个Activity,那么程序会从Stopped状态,调用onRestart、onStart、onResume方法,进入到Resumed状态,恢复到用户离开前的状态。
根据我们的业务需求,这些生命周期的回调方法并不一定全部重写,然而,你理解每个生命周期方法,并且保证你的软件能够和你用户所想的行为运行,这是非常重要的。实现生命周期方法,并且让你的软件运行良好,主要有以下几个方面:
(1)当用户接到一个电话或者是选择另外一个APP的时候,保证你的APP不会crash掉
(2)当用户不积极的使用时,不要耗费宝贵的系统资源
(3)当用户离开然后在一段时间之后返回时,不要丢失用户的进度
(4)当屏幕的方向发生变化的时候,不要丢失用户的进度或者是crash掉
在接下你将学习Activity的不同状态之间的转换,然后,只有三种状态,Activity可以一直保持:
Resumed:在这种状态下,Activity的界面可以与用户进行交互,并处于手机窗口的最前端。
Paused:当Activity被部分遮挡,比如弹出一个dialog的时候,进入这种状态,在这种状态的Activity不能接受用户输入,也不能执行任何代码
Stopped:当Activity完全不能被用户可见的时候,即可进入这种状态。在这种状态下,Activity和它的状态信息,比如说是成员变量都被保留,但是代码不能继续执行了。
其他的状态,比如说Created或者是Started,会由于生命周期的回调方法而快速的转换到其他的状态,不能被保持。因此,在调用onCreate之后,会很快的调用onStart和onResume。
上面这些都是一些比较基础的关于Activity生命周期的介绍,下面,我们将介绍一些比较特殊的情况。
设置App的加载Activity
当用户在桌面上点击我们的APP的图标的时候,系统会调用我们设置成启动Activity的onCreate方法完成程序的启动,这个Activity是我们的APP的用户界面入口。
我们可以通过设置androidManifest.xml文件来定义启动Activity。程序的主Activity必须声明一个带有MAIN动作和LAUNCHER分类的<intent-ilter>,就像下面这样:
<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>注意:当我们使用开发工具创建好一个工程之后,主加载Activity已经设置好了。
如果我们的APP没有一个主Activity,那么在用户的Home界面的程序列表中将没有我们APP的图标。
创建一个新的实例
很多APP都有很多的Activity来完成不同的功能,不管Activity是主Activity还是其他的Activity,完成Activity的初始化工作都是在oncreate方法里面进行的。我们必须重写onCreate方法,并在里面完成只需要进行一次的初始化操作,比如说声明用户界面,声明成员变量等操作。
TextView mTextView; // Member variable for text view in the layout @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the user interface layout for this Activity // The layout file is defined in the project res/layout/main_activity.xml file setContentView(R.layout.main_activity); // Initialize member TextView so we can manipulate it later mTextView = (TextView) findViewById(R.id.text_message); // Make sure we‘re running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // For the main activity, make sure the app icon in the action bar // does not behave as a button ActionBar actionBar = getActionBar(); actionBar.setHomeButtonEnabled(false); } }
一旦onCreate结束执行之后,系统会马上调用onStart、onResume方法,Activity永远不会停留在Started和Created状态。当onStrat调用之后,界面此时对用户就可见了,然后马上调用onResume当法,并停留在Resumed状态,一直到有操作打断这种状态,比如说有电话打入。用户导航去其他的界面等。
在接下来的其他的课程中,你将会明白在Activity的生命周期中,onStart和onResume方法对于从Paused和Stopped状态中恢复是多么的重要。
销毁Activity
在Activity的生命周期中,最先执行的操作是onCreate,最后执行的操作是onDestory,当这个方法调用的时候,就意味着你的Activity已经被完全的从内存中清除掉了。很多的APP不需要实现这个方法,这是因为本地的类引用被销毁了,并且在onPause和onStop方法中应该完成了大多数的清理工作。但是,如果你的程序中存在在后台运行的线程或者是如果不正确的关闭会造成内存泄漏的资源引用,那么在onDestory方法中,你应该干掉他们。
@Override public void onDestroy() { super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing(); }
注意:在大多数情况下,系统会在onPause和onStop方法之后调用onDestory,但是如果在onCreate中直接调用onDestory的话,系统会立即调用onDestory,而不会调用他之前的那些生命周期中的回调方法。
【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)