Android学习路线(十二)Activity生命周期——启动一个Activity
DEMO下载地址:http://download.csdn.net/detail/sweetvvck/7728735
不像其他的编程模式那样应用是通过main()函数启动的。Android系统通过调用特定的回调方法相应着特定的生命周期阶段,来初始化一个Activity 实例中的代码。有一系列的方法来启动一个activity,同一时候也有一系列的方法来销毁activity。
本课展示了大多数重要生命周期方法的预览,而且告诉你怎样处理第一个生命周期方法来创建一个新的activity实例。
理解生命周期方法
在activity的一生中,系统依照类似金字塔的次序调用核心生命周期方法。就像这样,activity生命周期的每一个阶段就是金字塔的每一个台阶。当系统创建一个新的activity,每一个回调方法将activity的状态向顶端移动一步。金字塔的顶端相应着执行在应用前台的activity,这时用户可以与它交互。
当用户准备离开这个activity时,系统会调用另外一些方法来将activity的状态向金字塔下移动,从而销毁这个activity。在一些情况下,activity仅仅会向下移动一半然后等待(比如用户切换到其它的应用中)。这样这个activity就能够再次出现到顶部(假设用户回到这个activity)同一时候恢复用户离开时的状态。
图 1. 一个简单的android声明周期插图,像一个金字塔的样子展现。它展示了每一个方法被调用后是怎样带着activity到达金字塔的顶部Resumed状态的,相同也有方法让activity下一级台阶。这个activity在被Paused和Stopped状态下相同也能再次回到Resumed状态。
因为这些的复杂性,你并不须要实现全部的生命周期方法。
然而,你要确保你的应用会像用户期待的那样表现。理解和实现每一个方法是十分重要的。适当地实现activity的生命周期方法能够通过几种方式来保证你的应用表现得非常好,包含以下几点:
- 当用户在使用你的应用时接到电话或者切换到其他应用时不要崩溃。
- 当用户没有在使用你的activity时不要消耗珍贵的系统资源。
- 假设用户离开你的应用然后过一段时间返回来后不要丢失用户的进度。
- 屏幕横竖屏切换时不要丢失用户的进度更不要崩溃。
你将会在接下来的课程中学到,activity像插图1那样在不同状态下切换有多种情况。然而,它们之中仅仅有三种状态是静态的。就像这样。activity能够在这三种状态之中的一个中保存一段较长时间:
- Resumed
- 在这个状态下,activity是在前台的。用户可以跟它进行交互。(有时候也被称为"running" 状态。)
- Paused
- 在这个状态下,activity被还有一个activity遮住了一部分——这里指的还有一个activity是半透明的或者没有覆盖整个屏幕。处于paused状态的activity不能接收不论什么用户输入也不能运行不论什么代码。
- Stopped
- 在这个状态下, 这个activity被全然地隐藏了;可以理解为在后台。
在stopped过程中,activity实例以及它的全部状态信息比如成员变量都被保存起来了,可是它不能运行不论什么代码。
其它的状态(Created 和 Started)是瞬时状态,系统会在调用下一个生命周期方法来让此状态转移到下一个状态。就这样。当系统调用onCreate()。它立即会调用onStart()方法,他后面非常快被接着onResume()方法。
上面就是主要的activity的生命周期方法。如今你将要開始学习一些特定的生命周期方法的行为。
指定你的应用的启动Activity
当用户在设备主界面选择你的应用图标时。系统会调用onCreate() 方法,它是你声明作为应用启动Activity 中的方法。
它是一个作为进入应用UI的入口activity。
你能够在manifest中定义哪个activity作为应用启动的activity,在项目根文件夹下的AndroidManifest.xml文件。
这个你应用的主activity必须在manifest 文件里声明<intent-filter> 元素,同一时候该元素要包括MAINaction
和LAUNCHER category。比如:
<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>
提示: 当你通过Android SDK工具创建一个新的Android项目时,默认的项目文件会包括这个Activity 而且已经声明好了这个filter。
假设在你的全部activity中,MAIN action
或者 LAUNCHER category
都没有被声明。那么你的应用的icon将不会出如今设备的主界面上。
创建一个新的实例
大多数的应用都包括几个不同的activity。让用户运行同意用户运行不同的错啊做。无论这个activity是不是当点击应用图标时被创建的主activity还是响应用户操作开启的activity,系统都会通过调用它的onCreate()方法为每一个activity创建实例。
你必须实现onCreate() 方法来运行主要的应用启动逻辑,这在应用的整个生命周期中仅仅会出现一次。比如,你对onCreate() 方法的实现中须要定义UI以及实例化一些可能存在的类变量。
比如,以下的 onCreate() 方法的样例展示了一些运行activity主要的启动代码,比如声明UI(在一个XML文件里被定义),定义成员变量。以及配置一些UI。
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);
}
}
注意: 使用SDK_INT 来阻止老系统运行新的APIs。
老版本号的系统运行新APIs将会导致一个运行时异常。
一旦onCreate() 结束运行。系统会非常快调用onStart() 方法和onResume() 方法。你的activity绝不会停留在Created或者Started状态下。从技术角度来看,当onStart()方法被调用时,这个activity对用户可见了,可是紧接着 onResume() 方法被调用后这个activity会一直保持在Resumed状态下,直到一些事情改变了它们,比如当来了一个电话时。用户导航到其它的activity上,或者设备的屏幕被关闭。
在接下来的课程里。你将会看到其他的方法,onStart() 和onResume() 在被用来resume来自Pasued或者Stopped状态下的activity是怎样起作用的。
提示: onCreate() 方法包括了一个被称为savedInstanceState 的參数,这个參数将会在后边的课程中介绍:Recreating
an Activity。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3dlZXR2dmNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="696" height="313" alt="" style="border:0px; vertical-align:middle; max-width:100%; margin-bottom:15px; color:rgb(34,34,34); font-family:Roboto,sans-serif; font-size:14px; line-height:19px; background-color:rgb(249,249,249)">
图 2. 还有一个activity声明周期结构的插图。在系统创建一个activity的新实例时所调用的回调方法(onCreate(), onStart(),
和onResume())被强调出来。一旦这个回调序列结束,activity将会处于Resumed状态直到他们切换到还有一个activity中。
销毁Activity
Activity的第一个回调方法是onCreate(),它的最后一个回调方法是onDestroy()。系统会在你的activity中调用这种方法最为结束信号,你的activity实例将会从系统内存中全然移除。
大多数的应用不须要实现这种方法,由于本地的类引用将会和activity一起被销毁,而且你的activity在onPause() 和onStop()方法中须要执行大部分的清理工作。然而,假设你的activity包括在onCreate()方法中创建的后台线程或者其它长时间执行的资源,假设没有适当地关闭。那么你须要在onDestroy()方法中销毁它们。
@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() 后调用onDestroy()方法,除了一个例外:当你在onCreate()方法中调用了finish() 方法。这一些情况下,比如你的activity被用来做暂时的跳转,你须要在onCreate()方法中调用finish() 来销毁这个activity。
在这样的情况下,系统立马就运行了onDestroy() 方法。而没有运行其他不论什么生命周期方法。
Android学习路线(十二)Activity生命周期——启动一个Activity的更多相关文章
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...
- android学习笔记 activity生命周期&任务栈&activity启动模式
activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...
- Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment
你能够把fragment看成是activity的模块化部分.它拥有自己的生命周期,接受它自己的输入事件,你能够在activity执行时加入或者删除它(有点像是一个"子activity&quo ...
- maven学习(十)——maven生命周期以及插件
一.生命周期 1.何为生命周期? Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 2.Maven三大生命周期 Maven有三套 ...
- (十二)Maven生命周期和插件
除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...
- Android学习路线(二十)运用Fragment构建动态UI
要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...
- 零基础Android学习笔记-02 安卓程序生命周期
一个安卓程序生命周期会经历7中状态,并不一定是每次都全部经历.Create,Start,ReStart,Pause,Resume,Stop,Destory. 重载方法,用helloWorld程序去体验 ...
- ASP.NET Core 2 学习笔记(二)生命周期
要了解程序的运行原理,就要先知道程序的进入点及生命周期.以往ASP.NET MVC的启动方式,是继承 HttpApplication 作为网站开始的进入点,而ASP.NET Core 改变了网站的启动 ...
- Day2 Activity生命周期/启动模式/最佳实践
Android是使用任务(Task)来管理活动的,这个栈被称作返回栈(Back Stack). Activity类中定义了7个回调方法: onCreate().在活动第一次被创建时调用,应该在这个方法 ...
随机推荐
- Android应用常规开发技巧——善用组件生命周期
数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...
- 【Android】Android程序自己主动更新
App自己主动更新的步骤可分为三步: 检查更新(假设有更新进行第2步,否则返回) 下载新版的APK安装包 安装APK 以下对这三步进行解释.当中会穿插相应代码.App自己主动更新的这三步所有被封装到了 ...
- 【LeetCode】Palindrome Partitioning 解题报告
[题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...
- What is the difference between Web Farm and Web Garden?
https://www.codeproject.com/Articles/114910/What-is-the-difference-between-Web-Farm-and-Web-Ga Clien ...
- JAVA设计模式之【迭代器模式】
迭代器模式 聚合类,聚合对象 电视机遥控器,迭代器,遍历局和对象中的成员 灵活新增遍历方法 将负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离.这就是迭代器模式. 灵活性,可扩 ...
- vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件
vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件 ------------------------------------------- ...
- jquery的clone()引发的问题,下拉框点击没有反应
此段代码是对某块元素的移位:上移.下移.对比修改前后的两段代码: 修改前: //点击移位 function move(obj,posi){ var al=$(obj).parent('li').par ...
- NPOI 给导出Excel添加简单样式
需求分析:如下图为我之前导出的Excel数据,没有一点样式,标题行不明显,各个列的数据紧凑,查看数据时得手动拉宽每列,故这次要针对以上问题对它进行优化 结果展示: 代码: /// <summar ...
- Sublime Text 3 注册码 激活码 版本号 Build 3143
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- Net Core链接数据库
原文 在Windows下,相信大家分分钟都可以搞定.而初次接触.net core + mysql可能需要注意些细节.首先打开vs2017新建一个asp.net core项目(选Web应用程序), 然后 ...