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分类。比如:
        <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>

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

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

创建一个实例

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

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

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

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

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

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

在下面另外的课程中,你会看到其他启动的方式,onStart()和onResume()方法分别是让activity从Paused或者Stopped状态恢复Resumed状态。

提示:onCreate()函数包含一个参数叫savedInstanceState,我们在会在 重建一个activity 这个教程中讨论。


销毁Activity

activity生命周期第一回调是onCreate(),最后一个回调就是onDestroy()。系统会在activity发出结束信号的时候调用这个函数,然后你的activity实例就会完全被移除系统内存。

很多程序不需要实现这个函数,因为activity会被本地类销毁,你的activity也必须在onPause()和onStop()中执行大多数清理。如果你在onCreate()中启动了后台线程或者是启动了其他运行比较长的程序,而且没有适当的关闭,那么就有内存泄露的潜在可能,所以你必须在onDestroy()函数中杀掉他们。
    @Override
    public void onDestroy() {
        super.onDestroy();  // 通常先调用父类方法
        
        // 停止方法回溯
        android.os.Debug.stopMethodTracing();
    }

提示: 系统会在onPause()和onStopped()函数执行后执行onDestroy(),但是有一种例外:当你在onCreate()方法中调用finish()函数时。有些情况会这样,比如当你的activity临时决定运行其他activity时,你可以再onCreate()方法中调用finish()方法去销毁这个activity。这种情况下,系统会立刻调用onDestroy()而不调用其他生命周期函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值