在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕。这个主界面一般由多个Fragment组成,并由一组次要Activity支持。要在屏幕之间切换,就必须要启动一个新的Activity。一般的Activity都占据了整个显示屏,但可以创建成半透明或二者浮动的Activity。

一、创建Activity

  通过继承Activity类可以创建一个Activity窗口,基本框架如下:

 public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}

  以上代码是一个空的Activity,可以通过使用Fragment、布局和视图来创建UI。视图是用来显示数据和提供交互交互的UI控件。Android提供给了多个布局类,成为ViewGroup,它可以包含多个视图来帮助UI布局。Fragment用来封装UI的各个部分,从而能够方便的创建动态界面,这些界面能够针对不同的屏幕尺寸很方向重新排列,起到优化UI的效果。

  要想把一个UI分配给一个Activity,需要在onCreate()方法中调用setContentView()方法。可以通过在java代码中创建布局,也可以通过调用xml布局资源文件来创建。如下两种方式:

   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tvShow = new TextView(this);
setContentView(tvShow);
tvShow.setText("你好");
}

  当然,通过调用xml布局文件来创建UI的方法更常用,如下:

   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

  最后,创建好了Activity类不要忘了在Manifest中对其注册。(注册方法及原因请参考:Android高级编程笔记(二)Manifest文件节点详解

  需要注意的是,想让一个Activity可以被应用程序启动器使用,它必须包含一个监听MAIN动作和LAUNCHER分类的Intent-Filter,如下:

1 <activity
  android:name="com.codingblock.myactivity.MyActivity"
3   android:label="@string/app_name" >
    <intent-filter>
5       <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

二、Activity的生存期

  正确理解Activity的生存期,可以更好的对应用程序管理资源,从而让应用程序更加连贯流畅。

  1、Activity栈

  每一个Activity的状态是由他在Activity栈中所处的位置所决定的,Activity栈是当前所有正在运行的Activity的后进先出的集合。当一个新Activity启动,它就会变成Activity状态,并移到栈顶,当返回到前一个Activity,前台Activity被关闭,那么站总的下一个Activity就会移动到栈顶,变成活动状态。

  2、Activity状态

  随着Activity的创建和销毁,从栈中移进移出的过程中他们经历了如下4种可能的状态:

  · 活动状态:当一个Activity处于栈顶是,它是可见的、具有焦点的前台Activity并可以接受用户输入。

  · 暂停状态:Activity可见,但没有焦点,不能接受用户输入事件。(例如:当一个透明的或者非全屏的Activity位于该Activity之前时)

  · 停止状态:Activity不可见。此时,Activity仍然会保留在内存中,保存所有状态信息,然而当系统的其他地方要求使用使用内存时,会优先终止此类状态的Activity。

  · 非活动状态:Activity被终止。此时Activity已经从栈中移除了。

  3、监控状态改变

  为了保证Activity可以对状态改变做出反应,Android提供了一系列的回调方法,当Activity的状态改变时它们就会被触发。以下代码是整个Activity生存期的框架,各方法的说明已在代码注释中详细给出:

 public class MyActivity extends Activity {

     //在完整生存期开始调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化Activity并填充UI
} //在onCreate方法完成后调用,用于恢复UI状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/*
* 从savedInstanceState恢复UI状态
* 这个Bundle也被传递给了onCreate
* 自Activity上次可见之后,只有系统终止了该Activity时,才会被调用
*/
} //在随后的Activity进程可见生存期之前调用
@Override
protected void onRestart() {
super.onRestart();
//加载改变,知道Activity在此进程中已经可见
} //在可见生存期的开始时调用
@Override
protected void onStart() {
super.onStart();
//既然Activity可见,就应用任何要求的UI Change
} //在Activity状态生存期开始时调用
@Override
protected void onResume() {
super.onResume();
/*
* 恢复Activity需要,但是当它处于不活动状态时被挂起的暂停的UI更新、线程或进程
* 在Activity状态生命周期结束的时候滴啊用,用来保存UI状态的改变
*/
} //在UI状态改变保存到saveInstanceState
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/*
* 如果进程被运行时终止并被重启,
* 那么这个Bundle将被传递给onCreate和onRestoreInstanceState
*/
} //在Activity状态生存期结束时调用
@Override
protected void onPause() {
super.onPause();
/*
* 挂起不需要更新的UI更新、线程或者CPU密集的进程
* 当Activity不是前台的活动状态的Activity时
*/
} //在可见生存期结束时调用
@Override
protected void onStop() {
super.onStop();
/*
* 挂起不需要的UI更新、线程或处理
* 当Activity不可见时,保存所有的编辑或者状态改变,因为在调用这个方法后,京城可能会被终止
*/
} //在完整生存期结束时调用
@Override
protected void onDestroy() {
super.onDestroy();
/*
* 清理所有的资源,包括结束线程、
* 关闭数据库连接等
*/
}
}

  4、理解Activity的生存期

  在一个Activity从创建到销毁的完整的生存期内,它会经历活动生存期和可见生存期的一次或者多次重复。每一次转化都会触发以上方法处理程序。

    · 完整生存期:对onCreate()的第一次调用和对onDestroy()的最后一次调用之间的时间范围。有时候还会发生一个Activity的进程终止,却没有调用onDestroy方法的情况。

  使用onCreate方法初始化Activity,如果Activity意外终止,onCreate方法接受一个包含UI状态的Bundle对象,该对象是在最后一次调用onSaveInstanceState时保存的。应该使用这个Bundle将UI恢复为上一次的状态,既可以通过onCreate方法也可以重写onRestoreInstanceState。

  对象的快速创建和销毁会导致额外的垃圾收集过程,为了保证代码高效,尽量不要创建短期对象。如果Activity是有规律的创建相同的对象集,可以考虑在onCreate创建,因为onCreate只在Activity生存期调用一次。

    · 可见生存期:onStart和onStop之见的时间。此时,Activity可见,但可能没有焦点,或者可能被部分遮挡了。Activity在完整生存期期间可能会包含多个可见生存期。在个别极端情况下,Android运行时可能会在一个Activity位于可见生存期事把它终止,而不调用onStop方法。

  onStop方法应该用来暂停或者停止动画、线程、传感器监听器、GPS查找、定时器、Service或者其他专门用于更新用户界面的进程。当UI再次启动时,可以用onStart或者onRestart方法来恢复或者重启这些进程。

  onRestart在除了对onStart方法的第一次调用之外的所有方法之前被立即调用。可以用它完程只有当Activity在它的完整生存期之内重启时才能完成的特殊处理。

  onStart/onStop方法也可以用来注册或者注销那些专门用来更新用户界面的Broadcast Reciver。

    · 活动生存期:onResume及其对应的onPause之间的时间。

  当Activity处于活动期时,它在前台,并可以接收用户输入事件。Activity被销毁前可能会经历多个活动生存期,在失去焦点是,活动生存期就结束了。尽量让onPause和onResume方法中的代码执行迅速,尽可能少。以保证前后台切换时能够保持响应。

  onResume方法可以是轻量级的。使用它可以重新注册已经使用onPause停止的Broadcast Receiver或者其他进程。

  

Android学习笔记(四)深入探讨Activity的更多相关文章

  1. Android学习笔记二之初始Activity

    初识Activity,跟着教程学习敲了一遍这一章的内容,下面根据目录结构总结知识点: 一.活动是什么 上篇博文中我们提到了Android四大组件,其中有一个Activity,我们将之称为活动.活动是最 ...

  2. Android学习笔记(一)——Activity简介 和 View

    源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...

  3. Android学习笔记四:activity的四种启动模式

    Activity有四种启动模式:standard,singleTop,singleTask,singleInstance. 1.standard:标准启动模式 默认模式,这个模式下启动的Activit ...

  4. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  5. Android学习笔记(十) Activity的生命周期

    一.如何在一个应用程序中定义多个Activity -定义一个类,继承Activity -复写onCreate() setContentView(R.layout.secondLayout):设定该Ac ...

  6. Android学习笔记(六) Activity和View基础

    一.Activity的启动流程 操作系统首先查看AndroidManifest.xml来决定启动哪一个Activity. 生成对应的Activity对象(系统自动完成). 调用它的onCreate() ...

  7. Android 学习笔记四:创建工具栏按钮

    原文:http://blog.csdn.net/lihongxun945/article/details/48951199 前面我们已经可以在一个Activity中添加一些按钮之类的组件.由于手机的屏 ...

  8. android 学习笔记四:控件

    1.android:gravity 指定控件的基本位置,比如居中.居右等位置 Top:顶部 bottom:底部 left:居左 right:居右 center_vertical:垂直居中 center ...

  9. android学习笔记四

    TextView.Button.CheckBox.RadoiButton.EditView.ImageButton.ToogleButton——略 AnalogClock.DigitalClock = ...

  10. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

随机推荐

  1. Devexpress 使用经验 —— ASPxGridView前后台交互写法推荐

    这里的格式是仁者见仁智者见智,这篇随笔只是我在工作过程中总结出的阅读性高,对我来说效率较高的写法. ASPX: <dx:ASPxGridView ID="ASPxGridViewLin ...

  2. oracle学习笔记1:windows下oracle数据库安装及.net调用oracle数据库

    1.下载32位或64位oracle数据库并且安装,安装时可以选择安装数据库实例或者不安装,如果不安装的话之后可以用Database Configuration Assistant(DBCA) 通过向导 ...

  3. hibernate使用sql语句查询实体时,要写上addEntity

    abDAO.getSession().createSQLQuery(hql).addEntity(对象.class).list(); 参考http://blog.csdn.net/vacblog/ar ...

  4. andriod 中设置sdk升级代理服务器

    Android SDK 在线更新镜像服务器资源: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: h ...

  5. BearSkill实用方法之UITextField限制输入的字符数量

    原文:http://blog.csdn.net/xiongbaoxr/article/details/51525061      

  6. 水题(素数表)NYOJ素数距离

                描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素数,则输出左侧的值及相应距离. 如果输入的整数本身就是素数,则输 ...

  7. jquery返回顶部-ie6配合css表达式。

    css: .wraper{ width:980px; height:2048px; margin:0 auto; background:#ccc; } /*返回头部*/ #backToTop a{;; ...

  8. 一. 什么是ANR?为什么会有ANR发生?

    对于Android平台的工程师来说,ANR应该是每个人都会遇到的问题,因为导致它的原因有很多,例如在主线程进行耗时操作,调用大量cpu资源进行复杂的预算等,并且可能在大多数情况下,这类问题不会发生,只 ...

  9. jquery添加元素

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <head> ...

  10. [BZOJ 1014] [JSOI2008] 火星人prefix 【Splay + Hash】

    题目链接:BZOJ - 1014 题目分析 求两个串的 LCP ,一种常见的方法就是 二分+Hash,对于一个二分的长度 l,如果两个串的长度为 l 的前缀的Hash相等,就认为他们相等. 这里有修改 ...