您的位置:首页 > 移动开发 > Android开发

Activity生命周期

2013-12-14 23:49 190 查看
摘要: 一、多Activity
二、启动Activity的方法
三、back stack
四、Activity生命周期
五、Activity对象的状态
六、成对的生命周期函数

一、多Activity

1.新建一个Activity

在包上点右键,New->Class,



填写Name,完成,生成文件



打开刚才新建的文件,让类继承Activity,注意引入包,快捷键是CTRL+SHIFT+O

package com.hj.s02e01_multiactivity;

import android.app.Activity;

public class SecondActivity extends Activity {

}

实现onCreate方法,点击菜单栏上的Source->Override/Implement Methods



弹出一个框,勾选onCreate。点击确定。



确定以后,代码里有了函数:

public class SecondActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

}

}

2.新建一个布局文件

在res->layout上点右键,选new->android xml file



填入名称second.xml,确定



在该布局文件里加一个textview

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/secondView"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="第二个activity"

/>

</LinearLayout>

再在onCreate函数里指定我们要渲染的布局文件是这个second.xml

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.second);

}

3.新增一个Activity配置

Res目录下的androidmanifest.xml是整个项目的配置文件,我们来看一下里面关于activity的代码:

<activity

android:name="com.hj.s02e01_multiactivity.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:label是app显示在标题栏的名称

Intent-filter放在哪个activity里面,哪个就是默认启动的activity

这时,我们需要增加一个activity,同样是application的子标签,两个属性是必须的,name和label:

<activity

android:name="com.hj.s02e01_multiactivity.SecondActivity"

android:label="SecondActivity" ></activity>

这样就注册了一个activity。

二、启动Activity的方法

我们让第一个Activity里点一下按钮就启动第二个Activity。

首先,给第一个Activity加一个按钮。

<Button

android:id="@+id/button"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="启动SecondActivity"/>

在activity里声明这个button,找到他,(步骤参考前面的课程)并添加监听器:

class listener implements OnClickListener{

@Override

public void onClick(View v) {

}

}

接下来是启动activity的流程和方法:

1.生成一个意图对象(Intent)

在安卓系统里,几乎做任何事情都离不开Intent,他封装的就是“你想做什么”。

这里生成一个意图对象很简单:

Intent intent = new Intent();

2.调用setClass方法设置你要启动的activity

intent.setClass(MainActivity.this, SecondActivity.class);

Setclass的第一个参数是context对象,activity是context类的子类。这个参数在这里表示当前场景,也就是当前的activity,在本例中,我们应用MainActivity.this。

Setclass的第二个参数是class对象,表示需要被启动的activity的类的class对象。在本例中,我们应用SecondActivity。

3.调用startActivity方法启动activity

把intent对象作为参数传入。

startActivity(intent);

完成。

三、back stack

Back stack就是后退栈。放的是activity对象。它维护了activity的启动顺序。

程序启动时,默认启动了第一个activity,后退栈里存放着第一个activity。



当启动第二个activity之后,后退栈就保存第二个activity。



启动第三个activity时,第三个activity又被放入后退栈中。



而当点击返回按钮时,返回到第二个activity,此时第三个activity就从后退栈中被移除。

依此类推。

四、Activity生命周期

一个Activity对象从创建到销毁过程中经历的阶段,和在这些阶段中要做的事情就是Activity的生命周期。

在每个阶段调用的函数就是生命周期函数。这些函数不是被程序员调用的,而是被系统自动调用的。程序员的任务是往这些函数里填代码,让它在特定的时间运行。

这些函数有:



我们用前面做的多Activity项目来演示这七个方法调用的顺序和时机。

我们将MainActivity和OtherActivity的这七个方法都实现出来,并都填上类似

System.out.println("MainActivity:onDestroy");

的代码。方便我们查看调用的顺序。

1.启动Activity时

当我们启动第一个Activity时,系统打印如下:



对照这三个方法的含义,我们知道它们在启动时调用,并有先后顺序。

2.跳转Activity时

接着我们点击启动第二个Activity。系统打印如下:



这说明,跳转activity时,当前activity首先调用暂停方法,被启用的activity执行创建-》可见-》交互的方法,最后当前activity调用停止方法。

3.退回Activity时

当我们点击后退按钮时,系统打印如下:



其流程和前面的类似。但MainActivity因为之前已创建过,所以这次不再是onCreate方法,而是onRestart方法。因为它存放在后退栈里,之前有讲过。

最后在调用完当前Activity的onStop方法后,要销毁它,于是调用了onDestroy方法,之所以要调用这个方法,也是因为它在后退栈里移除了。

五、Activity对象的状态

结合生命周期的七种方法,进一步理解Activity对象的状态,Android官方解释有三种状态:

1.Resumed

Activity处于运行状态

2.Paused

另一个Activity位于前端,但是本Activity还可见。

3.Stopped

另一个Activity位于前端,完成遮挡住本Activity。即不可见。

注意:当处于paused和stopped两种状态时,activity并没有从内存中释放,包括成员变量之类的仍然占用资源。释放资源的操作需要手工完成。

六、成对的生命周期函数



这是android官方解释生命周期的图。

所谓的成对,是指oncreate与ondestroy是一对,onstart与onstop是一对,onresume与onpause是一对。前者申请资源,后者释放相应的资源。

例如:我们在oncreate函数里启动一个线程,让程序播放音乐,这时电话进来,我们在onstop方法里暂停音乐,电话结束后,要继续播放音乐,而这里调用onstart方法,这时我们发现我们无法启动音乐,因为我们把线程写在了oncreate函数里。

也就是说,这七个方法只是告诉我们调用的时机,而里面要写什么代码是由我们自己决定的。我们必须根据程序的需要来决定在哪个方法里写什么代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息