赞
踩
原文出处:https://developer.android.com/reference/android/app/Activity.html
API 26
>=Android3.0
和`<Android3.0
这两者之间的细微差异。An activity is a single, focused thing that the user can do.几乎所有的Activity都是用来和用户交互的,当开发者使用Activity创建一个和用户交互的窗口时可以使用setContentView(View)
方法来放置开发者设计好的UI布局。通常Activity展示给用户的是一个全屏的窗口,除此之外,它还有其他使用方法:作为浮动窗口(via a theme with windowIsFloating set)或者嵌入另一个Activity中(通过使用ActivityGroup)。
几乎所有的Activity的子类都会实现如下两个方法:
onCreate(Bundle)
:这是你初始化Activity的地方。最重要的是,在这个方法中开发者通常会调用setContentView(int)
来布置自己定义的UI布局,并且通过findViewById(int)
去检索UI布局文件中需要和程序交互的控件。onPause()
:当用户离开你的Activity的时候你需要在这里做必要的处理。最重要的是,任何用户做的操作/修改需要在这里被保存起来(通常使用ContentProvider
来持有这些数据)。 通过Context.startActivity()
来启用Activity。所有的Activity类必须在AndroidManifest.xml
文件中有对应的<activity>
节点。
Activity类在一个应用整体的生命周期中是一个重要的部分,activity的启动和组合方式是平台应用模型的基本组成部分。在本开发指南中你会看到关于如何创建Activity的更多细节。
从android3.0开始,Activity的实现中可以通过使用Fragment类更好的模块化代码,为大屏幕创建更复杂的用户界面,帮助扩展了Activity在大小屏幕之间的应用。
在系统中通过activity stack(Activity栈)管理Activity们。当一个新的Activity被启动起来,它会被放到栈顶称为正在运行的activity – 旧的Activity一直保存在栈中,直到栈顶的新Activity退出旧的Activity才会重新位于栈顶。
Activity有如下4中基本状态:
active/running
。pause
。处于pause
状态的Activity还是存活的状态(它保持着所有状态和成员信息,并且依旧附属于Window manager),但是在系统处于极端内存不足的状态下该Activity会被杀死。stoped
。它依然保留了所有的状态和成员信息,然而,当其他地方需要内存的时候本状态下的Activity经常会被杀死。paused
或者stopped
的状态,系统可以通过调用其自身的finish()
方法或者直接杀死该进程从而把该Activity清除出内存。当该Activity需要再一次被展示的时候,它必须完全重新启动并恢复到以前的状态。流程图中有三个关键的闭环,或许你有兴趣来据此监测你的Activity:
onCreate(Bundle)
当且仅当到调用onDestroy()
我们称之为entire lifetime
。Activity会在onCreate
方法中初始化所有需要的数据。并在onDestory
方法中释放所有本Activity占用的系统资源。例如,如果一个线程运行在后台下载某些内容。这个线程很可能是在onCreate
中创建在onDestory
中停止。onStart
并在调用对应的onStop
这之间的这个过程就是visible lifetime
。在这一过程中当前Activity可能并不在栈顶,但是用户用户可以在屏幕上看到Activity。在这两个方法调用之间,会持续保存在向用户展示本Activity所需要的所有数据/资源。例如,你可以在onStart
方法中注册BroadcastReceiver
用来监测UI变化,当用户不能再看该Activity展示什么的时候在onStop
中注销监听。onStart
和onStop
方法可以调用多次用来显示或隐藏ActivityonResume
并在调用对应的onPause
这之间的这个过程就是foreground lifetime
。在这个过程中的Activity处于Activity栈顶处于可以和用户交互的状态。一个Activity可能频繁地切换pause
或者resume
状态 – 例如,设备睡眠,when an activity result is delivered, when a new intent is delivered
– 所以在这两个方法中的代码应该尽可能的轻量级
。 activity完整的生命周期方法就是通过如下方法定义的。在以下每一个方法节点处你可以根据Activity生命周期状态的变化通过override方法来做恰当的工作。所有的Activity都要实现onCreate(Bundle)
去实现该Activity的初始化设置;很多Activity也会实现onPause()
当该Activity失去焦点的时候及时提交尚未保存的数据因为该Activity可能就没机会再次和用户交互。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
生命周期的一般动向:
Method | Description | Killable? | Next |
---|---|---|---|
onCreate() | 当Activity首次创建的时候调用。在本方法中通常做一些初始化内容:创建View,把数据绑定到list上,等。本方法会提供一个包含Activity之前冻结(如果之前做过冻结操作 )状态的Bundle数据包。—>在它之后的方法总是onStart() | NO | onStart() |
onRestart() | 当你的Activity已经处于stopped状态之后才有可能调用本方法,调用之后Activity状态会再次转换为started—>在它之后滴啊用的方法总是onStart() | No | onStart() |
onStart() | 调用本方法后Activity变为用户可见的状态。—>如果本Activity处于栈顶接下来叼哦用的是onResume() 方法,如果当前Activity是隐藏的接下来调用的方法是onStop() | No | onResume() or onStop() |
onResume() | 调用本方法之后Activity变为可以和用户交互的状态。这是对应的Activity是处于栈顶的,用户可以操作该Activity。—>在本方法之后调用的是onPause() | NO | onPause() |
onPause() | 当系统开始恢复之前的Activity之前调用。本方法通常用来提交尚未保存的持续性的数据,停止动画效果或者做一些其他消耗CPU的行为。值得注意的是本方法的具体实现应该尽可能的少消耗时间,因为在本方法执行完成之前下一个Activity是不会resume(恢复)的。—>如果本Activity调用onPause失去焦点之后再次获取焦点会调用本方法;如果在调用onPause失去焦点后本Activity变得不可见了那接下来调用的方法就是onStop() | Pre-HONEYCOMB(自3.0起No,之前Yes) | onResume() or onStop() |
onStop() | 当因为别的Activity的启动导致本Activity被覆盖而不可见的时候会调用本方法。当一个Activity正在调用onStart() 方法的时候另一个Activity被调用回到Activity栈顶那么前一个Activity将直接调用onStop() 方法。或者当一个Activity正在调用onStart() 方法的时候该Activity被销毁(这里说的应该是尚未onResume 就finish )。—>如果调用本方法后的Activity再次回到Activity栈顶就会调用onRestart() 方法,如果调用onStop() 方法之后本Activity被销毁那会调用onDestory() 。 | Yes | onRestart() or onDestroy() |
onDestroy() | 一个Activity销毁之前的最后动作在本方法完成。本方法的调用会发生在:调用finish() 之后,或者系统需要为了节省内存而销毁Activity实例的时候。开发者可以通过isFinishing() 方法来区分以上二者具体情形。 | Yes | nothing |
Node:上表中的“Killable”列 – 用来标记对应的方法执行完成后Activity进程是否可以被系统杀死导致不能多执行一句后续代码。也正是因为这个原因开发者需要使用onPause()
把所有长期被需求的数据(例如用户编辑一半的内容)本地化存储起来。除onPause()
这个方法,onSaveInstanceState(Bundle)
也可以用来存储Activity的后台状态,可以把任何动态的实例信息存储到参数给定的Bundle对象中,在之后重新启动Activity的时候存储的信息会传递给onCreate(Bundle)
这一点在* Process Lifecycle*小节中有详细的论述。注意:一些关键的数据在onPause()
方法中存储更优于在onSaveInstanceState(Bundle)
中。因为后者并不是Activity生命周期中的回调方法,所以并不会在任何情况下都保证被调用。
值得注意的一点是以上的内容在Android3.0( HONEYCOMB )开始有了细微的变化。(即,以上内容在Android3.0之前是完全正确的认知)从Androida3.0开始在
onStop()
方法执行完成之前Activity不会被杀死,也就是说在Activity被清除出内存之前必然要执行onStop()
方法。这一个点的改变造成的影响是:我们可以推迟到onStop()
生命周期方法中保存我们认重要的数据,而且onSaveInstanceState(Bundle)
的调用也变的更有保障。
在被标记为No的方法从开始执行到方法执行结束系统都不会杀死其所在Activity进程。因此在onPause() - onResuame()
之间的Activity进程是可以被杀死的。
本次关注的焦点告一段落。
整体未完,待续~~~
4.Configuration Changes
5.Starting Activities and Getting Results
6.Saving Persistent State
7.Permissions
8.Process Lifecycle
此文仅做参考,文中尚有作者力不能及之处,希望路过的您不吝赐教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。