Android开发教程 --- 葵花宝典第二层 Activity生命周期

标签: android 开发 葵花宝典 | 发表时间:2011-07-21 23:42 | 作者:Jason_CC fastzhong
出处:http://www.cnblogs.com/

Hi 大家好

   今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知!希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写。

 照例,上笑话。。。

 有的女人就是Windows虽然很优秀,但是安全隐患太大。
 有的女人就是MFC她条件很好,然而不是谁都能玩的起。
   有的女人就是C#长的很漂亮,但是家务活不行。
   有的女人就是C++,她会默默的为你做很多的事情。
   有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
   有的女人就是SQL,她会为你的发展带来莫大的帮助。  感慨下,呵呵

 这是Android帮助文档中的图,我先发上。帮助文档位置在例如我将SDK文件夹放在D盘,那么我的帮助文档路径为

  D:\Adnroid\android-sdk-windows\docs\index.html  英文好的朋友可以参考这个帮助文档

我们主要会学习以下七个生命周期函数,活动(窗体)的生命周期函数并不止这七个,后面会说到。。耐心看

以下是对每个生命周期函数的中文解释

大家看过这些解释,对它有了一个大概的认识,那么接下来我们动手开始编写代码,来看看运行时的效果,这是代码

public class MainActivity extends Activity {
Button btn1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println(
"第一个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1
=(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent
= new Intent();
intent.setClass(MainActivity.
this, ResultActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println(
"第一个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println(
"第一个活动(窗体)在即将于用户交互时------------- onResume");
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println(
"第一个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println(
"第一个活动(窗体)在用户不可见时------------- onStop");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println(
"第一个活动(窗体)当重新启动时------------- onRestart");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println(
"第一个活动(窗体)当活动销毁时------------- onDestroy");
}

}
public class ResultActivity extends Activity {
TextView txtResult;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("第二个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
txtResult
= (TextView)findViewById(R.id.txtResult);
txtResult.setText(
"第二个窗体");
btn1
= (Button)findViewById(R.id.btn1);

btn1.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent i
= new Intent();
i.setClass(ResultActivity.
this, MainActivity.class);
startActivity(i);
}
});
}



@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println(
"第二个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println(
"第二个活动(窗体)在即将于用户交互时------------- onResume");
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println(
"第二个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}


@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println(
"第二个活动(窗体)在用户不可见时------------- onStop");
}

@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println(
"第二个活动(窗体)当重新启动时------------- onRestart");
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println(
"第二个活动(窗体)当活动销毁时------------- onDestroy");
}
}

如果大家要创建多个活动(窗体)时,需要到AndroidManifest.xml中进行活动(窗体)的注册

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="TSD.Jason.Example"
android:versionCode
="1"
android:versionName
="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<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 android:name=".ResultActivity"></activity>
</application>
</manifest>

在这里说下,如何LogCat切换到Java透视图中

在Java透视图的左下角有一个小图标,点击后 -> 其它 -> Android -> LogCat -> 确定 此时LogCat就会出现在我们的包资源管理器那里,你可以拖动它到你想要放置的地方。

由于我们在代码中使用了System.out.println 那么 我们可以在LogCat中去新建一个Filter 如何建立呢?

点击那个绿色的加号,会弹出一个窗体 ,在Filter Name 中任意输入一个名字 ,我这里叫做Sys,在By Log Tag 中输入 System.out 然后确定,此时就会创建成功,我们在程序中使用的System.out.println 就会显示在刚才建立的那个选项卡中。

大家观察,打印结果

到这里,两个窗体跳转所要执行的函数,大家应该是能够明白了。

当我们按下Home键,又该如何执行呢?

大家看图,然后再参照最开始的那七个生命周期的说明,自己动手实践下,就能明白了

当点击Back键后,其实,Android操作系统是在向活动栈中逐一销毁之前压入的活动。大家可以这样做个试验,两个窗体直接反复跳转4次,在跳转前,在编辑框中输入一些值,然后在点击Back键,看要点击几次,并看编辑框中的值。

Full Lifetime 全周期介于调用 onCreate onDestroy 之间。在一些情况下,终止一个活动并不调用 onDestroy Activity通过调用 onCreate 来初始化用户界面,数据,启动服务以及线程。onCreate 方法有个Bundle对象参数,这个参数含有最后一次调用 onSaveIntanceState 保存的UI状态数据。我们可以在 onCreate 中利用这个参数来恢复UI状态数据,或者重写 onRestoreInstanceState 。重写 onDestroy 释放资源,关闭数据库等操作。
为了写出比较高效的代码,有个比较好的建议是避免创建短期对象。快速的创建和销毁对象容易增加碎片回收线程的压力,这样会直接影响用户体验。

 Visible Lifetime 可视期介于调用 onStart onStop 之间。此时Activity是可见的,但是不能响应用户事件。一个Activity在其生命周期中是有可能经历多个可视期的。在非常极端的情况下,系统也有可能终止一个处于可视期的活动,这种情况很少见。onStop 方法通常用于暂时或者停止那些用来更新UI的动画,线程,定时器,服务等,所以当活动不可见的时占用的系统资源是很少的。当活动由不可见状态转化为可见状态时,在 onStart 中再启动相关的线程和服务。onStart onStop 同样也用来注册和取消注册(unregister)那些用来更新UI的广播接收者。在活动不可见时我们需要取消注册接受者(Receivers),特别是那些支持目的动作(Intent)以及更新UI的接收者。

Activity Lifetime 当活动的 onResume 被调用,活动进入激活期;当 onPause 被调用时,激活期结束。一个活动被激活,它将处于前景屏幕,同时响应用户的事件。同样在活动的生命周期结束之前,存在多个激活期,一旦有新的活动被激活,当前活动将会失去焦点(暂停甚至停止……)。激活期是活动生命周期比较活跃的部分,会频繁调用 onResume onPause ,所以为了有良好的用户体验,在 onResume onPause 方法中的代码需要有更高的效率。
在调用 onPause 之前,活动会调用 onSaveInstanceState 来保存活动的UI状态到 Bundle ,这个 Bundle 就是 onCreate onRestoreInstanceState 这两个方法的参数了。onSaveInstanceState 保存UI状态(比如多选按钮的状态,界面焦点=),这样当活动被重新激活时,能够正确显示被暂停前的UI。多数的活动都重写 onPause 方法来提交未保存的数据,我们也可以在此选择是否暂停线程,广播接收者,这完全依软件架构本身而定。在 onResume 中一般不执行太多的代码,创建UI一般在 onCreate 或者 onRestoreInstanceState 中实现。
 
  以上就是我对生命周期的理解以及整理,希望能帮到大家理解。
  PPT和源码下载 请点击 北京天圣达科技有限公司

作者: Jason_CC 发表于 2011-07-21 23:42 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· 分析称Google+导致用户对Twitter使用量下降(2011-07-21 22:58)
· iPad企业市场表现好于Android平板电脑(2011-07-21 22:27)
· GO浏览器寿终正寝(2011-07-21 22:24)
· 上海出现美女快递员 服务于网游宅男群体(2011-07-21 22:17)
· 诺基亚智能手机销量首次被苹果超越(2011-07-21 22:00)

编辑推荐:Scala 登陆 .NET 平台

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [android 开发 葵花宝典] 推荐:

Android开发教程 --- 葵花宝典第二层 Activity生命周期

- fastzhong - 博客园-首页原创精华区
   今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知. 希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写.  有的女人就是Windows虽然很优秀,但是安全隐患太大.  有的女人就是MFC她条件很好,然而不是谁都能玩的起.

雷军 :互联网创业的葵花宝典

- 狂之想 - 互联网的那点事
【陈怀临注:今天因为某些原因,与雷军有个电话交流. 非常佩服其深邃的见解和谦卑的人品. 其原文和网站为 www.leijun.com. 一个朋友,在一家软件的大企业做了十年的软件研发,想出来创业,问我要注意什么. 我开玩笑说,要想成功,必须学习互联网创业的“葵花宝典”,第一条就是 “挥刀自宫”. 大的软件公司有很多资源,研发能力不错,各种推广资源也非常优越,但很少开发出来优秀的互联网产品.

打败 IE 的葵花宝典:CSS Bug Table

- winners - Alipay UED
作为一名前端,我们通常要做的就是让页面在各系统A-Grade浏览器,甚至网站浏览份额0.1%以上的浏览器上良好显示. 不过,今天要说的是样式的兼容问题. 在IE/Mozilla/Webkit/Opera四分天下的今天,IE6-9/Mozilla(Gecko)系列/Chrome/Safari/Opera etc.

先生,你的葵花宝典忘记带了

- fish - 河蟹娱乐
1.曝一个我初中时候的糗事吧,我是2000年上的初中,那时候体罚式的教育还是蛮流行的,我们那是的班主任更是厉害,全班每人都被打过,以至于那时候见了班主任都怕的要死,要是哪天班主任不来上班,基本上比过年还开心————背景结束——-又一次,老师要突击检查作业,那时候叫基础训练. 我一下子就慌了,我一看,我有10多页没有写啊.

雷军 。互联网创业的葵花宝典

- Specific - 弯曲评论
【陈怀临注:今天因为某些原因,与雷军有个电话交流. 非常佩服其深邃的见解和谦卑的人品. 其原文和网站为 www.leijun.com. 一个朋友,在一家软件的大企业做了十年的软件研发,想出来创业,问我要注意什么. 我开玩笑说,要想成功,必须学习互联网创业的“葵花宝典”,第一条就是 “挥刀自宫”. 大的软件公司有很多资源,研发能力不错,各种推广资源也非常优越,但很少开发出来优秀的互联网产品.

葵花宝典——如何学习新技能

- nemo - 译言-每日精品译文推荐
你是否曾遇到过这种情况:当你坐进汽车,点火,加油门,可车依然像死猪一样一动不动. 你手足无措,气得跺脚,可低头一看,却发现原来没松刹车. 你也许会想,学习跟开车会不会是一个道理. 学习过程中,不松刹车,一样寸步难行. 消极的信念与偏见就是我们学习过程中的刹车. 只要我们能发现它们,学会抛弃它们,学习起来就会变得容易的多.

Android开发Tips

- - CSDN博客推荐文章
欢迎Follow我的 GitHub, 关注我的 CSDN.. 介绍一些, 在Android开发中, 会经常使用的小知识点.. submodule与git可以保持实时同步. 导入, 路径多于一个, 前面不添加冒号(:).. 使用PackageManager.. // 检查App是否安装 private boolean appInstalledOrNot(String uri) {.

Android 开发者调查

- - 爱范儿 · Beats of Bits
Startup 是为 Android 开发者提供盈利模式的一个公司. Android 开发者只要在应用上推广 Startup 服务,并且为网站带去流量,就可以得到网站给予的补贴. 今年 3 月的时候,Startup 网站对 Android 开发者进行了一次调查. 现在,他们将调查的结果制成了信息图,并 发布在网站之上.

Android敏捷开发指南

- - 互联网的那点事
本文紧密结合移动开发方法与技术,围绕Android平台的开发探讨提供更高质量移动产品的解决方案. 作者中分析了移动开发中常见的问题,从两方面阐述了ThoughtWorks使用的测试开发方案和相应的架构方法与常用工具应用,并进一步阐述了为移动开发流程所提供的持续发布方案. 随着云计算、移动互联等一系列新技术概念的崛起,新一轮的IT经济正在不断扩大发展.

Android应用开发资源

- - InfoQ cn
Android应用设计和开发人员现在可以参考由Android用户体验(UX)团队官方发布的 Android设计指南. 该指南提供了开发者应该遵循的基本原则,并列出了很多细节指导,涉及 设备与显示、 主题、 触控交互、 度量与栅格、 排版、 色彩、 图标设计,以及如何 编写用户交互界面的提示语.