Android Training - 开始一个Activity


和其他程序不一样的是,activity不是使用main()函数开始程序,Activity实例调用不同的回调函数对应它的生命周期的不同阶段。这里是安装一个顺序去启动一个activity,并且按照一个顺序去关闭activity。

这节课提供一个生命周期方法的概述,展示了怎么操作第一个回调函数去创建一个新的activity实例。

理解生命周期回调函数

在activity的生命中,系统安装顺序调用生命周期函数的过程类似一个金字塔。生命周期的每个阶段就想金字塔的每一层。系统启动一个新的activity,调用一个个回调函数,就像一步步的到达金字塔顶端。这个顶端就是activity处于前台状态的时候,用户这时可以和它交互。

当用户离开activity的时候,系统调用另外一些回调函数,让activity状态回到金字塔的底部。有时候activity只是走下金字塔的一部分,然后在那里等待(就想用户切换到了其他程序),activity可以从这里重新回到顶端(用户返回activity),处于前台运行状态。

基于你的activity的复杂度,你可能不必要实现所有的回调函数。不管怎样,理解它们,并且按照用户期望的行为方式实现它们是很重要的。为了确保你的程序保持良好,合理的实现activity生命周期函数有很多方法:

如果用户接电话或者切换到其他程序时,你的程序不能崩溃。

当用户不使用它时不要浪费宝贵的系统资源。

当用户暂时离开程序的时候,不要丢失用户的进度。

旋转屏幕的时候不要崩溃和丢失用户进度。

从上面的图我们可以看出,一个activity会在不同的状态间转换。不过只有3个状态的静态的。一段时间中,activity只能处于3个状态中的一个:

Resumed

这个就是activity处于前台时的状态。

Paused

处于这个状态,activity是被其他activity是部分掩盖着的 - 这个其他activity可能是半透明的,或者是没有完全覆盖整个屏幕的。这个状态下,activity不能接受用户的输入,也不能执行任何代码。

Stopped

这个状态下,activity是不可见的,它在系统后台运行着。当stopped的时候,activity实例和他的信息状态像成员变量一样被保留,也不能执行任何代码。

其他状态(Created和Started)是短暂的,系统只是快速的经过这些状态到底其他状态。比如,系统调用完onCreate()函数后,很快就调用onStart(),接着很快又调用onResume()。

这些就是生命周期的基础知识,下面我们将要学习一些特定的生命周期行为。

指定你程序的启动Activity

当用户点击图标启动程序的时候,系统会调用你声明为"launcher"(或者"main")的activity中的onCreate()函数。这个activity就是你的程序界面的主入口。

你可以在AndroidManifest.xml中定义哪个activity是主activity。

主activity必须在清单文件中使用<intent-filter>包含MAIN行为和LAUNCHER分类。比如:

  1. <activity  
  2.     android:name=".MainActivity"  
  3.     android:label="@string/app_name" >  
  4.     <intent-filter>  
  5.         <action android:name="android.intent.action.MAIN" />  
  6.         <category android:name="android.intent.category.LAUNCHER" />  
  7.     </intent-filter>  
  8. </activity>  

提示:当你使用SDK工具创建工程时,默认已经包含一个activity类,并且清单文件中已经声明了这个过滤。

如果一个程序中没有定义任何的MAIN行为或者LAUNCHER分类,那么你的程序图标不会出现在屏幕的程序列表中。

创建一个实例

大部分程序都会包含多个不同的activity,允许用户执行不同的行为。不过你以什么方式创建一个activity实例,你都需要先执行onCreate()函数。

你必须在onCreate()函数中实现程序的启动逻辑,在整个生命周期中,整个函数只会执行一次。比如,你必须在onCreate()函数中定义你用户界面,实例化一些类的作用域变量。

比如,下面的onCreate()代码执行了activity的一些基本设置,声明用户接口(在XML文件中定义),定义成员变量,配置UI。

  1. TextView mTextView; //成员变量   
  2.   
  3.    @Override  
  4.    public void onCreate(Bundle savedInstanceState) {  
  5.        super.onCreate(savedInstanceState);  
  6.          
  7.        // 设置用户界面布局   
  8.        // 这个布局文件定义在 res/layout/main_activity.xml 文件中   
  9.        setContentView(R.layout.activity_main);  
  10.          
  11.        // 初始化成员变量,一会我们能够操作它   
  12.        mTextView = (TextView) findViewById(R.id.text_message);  
  13.          
  14.        // 确保你能在蜂巢或者更高版本中才能使用ActionBar API   
  15.        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  16.         // 确保程序图标在工具栏中不表现成一个按钮   
  17.         ActionBar actionBar = getActionBar();  
  18.         actionBar.setHomeButtonEnabled(false);  
  19.     }  
  20.    }  

警告:使用SDK_INT组织老的系统去执行新API支持的方法,否则老版本会产生一个运行错误。

当执行完onCreate()函数后,系统马上连续执行onStart()和onResume()函数。你的activity永远不会处于Created或者Started状态。理论上说,在调用onStart()的时候activity已经处于可见状态了,但是onSumed()马上就会接着执行,并保持状态在Resumed,直到一些事情的发生改变它的状态,比如接电话,启动其他activity,变换屏幕方向。

  • 1
  • 2
  • 下一页

相关内容