基本程序单元Activity

Activity概述

Activity的中文意思是活动。在Android中,Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口。它是Android应用的重要组成单元之一,提供了和用户交互的可视化界面。在一个Activity中,可以添加 很多组件,这些组件负责具体的功能。

在Android应用中,可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity被压入下面,成为非活动Activity,等待是否可能被恢复为活动状态。在Activity的生命 周期中,有4个重要状态。

活动状态 当前的Activity,位于Activity栈顶,用户可见,并且可以获得焦点
暂停状态 失去焦点的Activity,仍然可见,但是在内存低的情况下,不能被系统killed(杀死)
停止状态 该Activity被其他Activity所覆盖,不可见,但是它仍然保存所有的状态和信息。当内存低的情况下,它将要被系统killed(杀死)
销毁状态 该Activity结束,或Activity所在的Dalvik进程结束
在这里插入图片描述
用矩形方块表示的内容为可以被回调的方法,而带底色的椭圆形则表示Activity的重要状态。从该图可以看出,在一个Activity的生命周期中有以下方法会被系统回调。
[√]onCreate()方法:在创建Activity时被回调。该方法是最常见的方法,在Eclipse中创建Android项目时,会自动创建一个Activity,在该Activity中,默认重写了onCreate(Bundle savedInstanceState)方法,用于对该 Activity执行初始化。
[√]onStart()方法:启动Activity时被回调,也就是当一个Activity变为显示时被回调。
[√]onRestart()方法:重新启动Activity时被回调,该方法总是在onStart()方法以后执行。
[√]onPause()方法:暂停Activity时被回调。该方法需要被非常快速地执行,因为直到该方法执行完毕后,下一个Activity才能被恢复。在该方法中,通常用于持久保存数据。例如,当我们正在玩游戏时,突然 来了一个电话,这时就可以在该方法中将游戏状态持久保存起来。
[√]onResume()方法:当Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity栈的栈顶。该方法总是在onPause()方法以后执行。
[√]onStop()方法:停止Activity时被回调。
[√]onDestroy()方法:销毁Activity时被回调。

说明:在Activity中,可以根据程序的需要来重写相应的方法。通常情况下,onCreate()和onPause()方法是最常用的,经常需要重写这两个方法。

创建、配置、启动和关闭Activity

在使用Activity时,需要先对其进行创建和配置,然后还可能需要启动或关闭Activity

创建Activity

大致可以分为以下两个步骤:
(1)创建一个Activity,一般是继承android.app包中的Activity类,不过在不同的应用场景下,也可以继承Activity的子类。例如,在一个Activity中,只想实现一个列表,那么就可以让该Activity继承ListActivity;如 果只想实现选项卡效果,那么就可以让该Activity继承TabActivity。创建一个名为MainAcrivity的继承Activity类的Activity,具

import android.app.Activity; 

public class MainActivity extends Activity {
}

(2)重写需要的回调方法。通常情况下,都需要重写onCreate()方法,并且在该方法中调用setContentView()方法设置要显示的视图。例如,在步骤(1)中创建的Activity中,重写onCreate()方法,并且设置要显示 的视图的具体代码如下:

@Override 
public void onCreate(Bundle savedInstanceState) { 
	super.onCreate(savedInstanceState); 
	setContentView(R.layout.main31); 
}

说明:创建Android项目后,默认会创建一个Activity。该Activity继承Activity类,并且重写onCreate()方法。

配置Activity

创建Activity后,还需要在AndroidManifest.xml文件中进行配置,如果没有配置,而又在程序中启动了该Activity,那么将抛出异常信息。
在这里插入图片描述
具体的配置方法是在标记中添加标记。标记的基本格式如下:

<activity 
	android:icon="@drawable/图标文件名" 
	android:name="实现类" 
	android:label="说明性文字" 
	android:theme="要应用的主题" 
	…>
	… 
</activity>

在标记中,android:icon属性用于为Activity指定对应的图标,其中的图标文件名不包括扩展名;android:name属性用于指定对应的Activity实现类;android:label用于为该Activity指定标签; android:theme属性用于设置要应用的主题。

说明:如果该Activity类在标记指定的包中,则android:name属性的属性值可以直接写类名,也可以加一个“.”点号;如果在标记指定包的子包中,则属性值需要设置为“.子包序列.类名”或者 是完整的类名(包括包路径)

在AndroidManifest.xml文件中配置名称为DetailActivity的Activity,该类保存在标记指定的包中,关键代码如下:

<activity 
	android:icon="@drawable/ic_launcher" 
	android:name="DetailActivity" 
	android:label="详细" >
 
</activity>

启动和关闭Activity

  1. 启动Activity 在一个Android项目中,如果只有一个Activity,那么只需要在AndroidManifest.xml文件中对其进行配置,并且将其设置为程序的入口。这样,当运行该项目时,将自动启动该Activity。否则,需要应用 startActivity()方法来启动需要的Activity。startActivity()方法的语法格式如下:
public void startActivity (Intent intent)

该方法没有返回值,只有一个Intent类型的入口参数,Intent是Android应用里各组件之间的通信方式,一个Activity通过Intent来表达自己的“意图”。在创建Intent对象时,需要指定想要被启动的Activity。

例如,要启动一个名称为DetailActivity的Activity,可以使用下面的代码:

Intent intent = new Intent(MainActivity3.this,DetailActivity.class); 
startActivity (intent);

该方法的使用比较简单,既没有入口参数,也没有返回值,只需要在Activity中相应的事件中调用该方法即可。例如,想要在单击按钮时关闭该Activity,可以使用下面的代码:

Button button1 = (Button)findViewById(R.id.button1); 
button1.setOnClickListener(new View.OnClickListener() { 
	@Override 
	public void onClick(View v) { 
		finish(); //关闭当前Activity 
	} 
});

在这里插入图片描述
在这里插入图片描述
说明:如果当前的Activity不是主活动,那么执行finish()方法后,将返回到调用它的那个Activity;否则,将返回到主屏幕中。

实现启动和关闭Activity

实现创建两个Activity,在第一个Activity中单击“查看详细内容”按钮,进入到第二个Activity中,单击“关闭”按钮,关闭当前的Activity,返回到第一个Activity 中。

(1)新建项目的res\layout目录下的布局文件main30.xml,添加一个“查看详细内容”按钮,android:id属性值为@+id/button1。由于此处的布局代码比较简单,这里不再给 出。

(2)在包资源管理器的项目名称节点上单击鼠标右键,在弹出的快捷菜单中选择“新建”/“类”命令,在打开的“新建Java类”对话框的“包”文本框中输入包名,这里为com.adou.application;在“名称”文本框中输入类 名,这里为ContentActivity;单击“超类”后面的“浏览”按钮,在打开的“选择类型”对话框中输入Activity后单击“确定”按钮,返回到“新建Java类”对话框中,单击“完成”按钮,完成Activity的创建,。

(3)在res\layout目录中创建一个布局文件,名称为detail.xml,在该布局文件中添加垂直线性布局管理器,并在该布局管理器中添加一个TextView组件(用于显示提示文字)和一个Button组件(用于关闭当前 Activity)。

(4)在ContentActivity中,重写onCreate()方法。在重写的onCreate()方法中,首先设置要使用的布局文件,然后获取“关闭”按钮,最后为该按钮添加单击事件监听器,在重写的onClick()方法中调用finish()方法,关 闭当前Activity,具体代码如下:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
	super.onCreate(savedInstanceState); 
	setContentView(R.layout.detail); //设置布局文件 
	Button button1 = (Button)findViewById(R.id.button1); //获取“关闭”按钮 
	button1.setOnClickListener(new View.OnClickListener() { 
		@Override 
		public void onClick(View v) { 
			finish(); //关闭当前Activity 
		} 
	}); 
}

(5)打开默认创建的主活动MainActivity,在onCreate()方法中,获取“查看详细内容”按钮,并为其添加单击事件监听器,在重写的onClick()方法中,创建一个ContentActivity所对应的Intent对象,并调用 startActivity()方法,启动DetailActivity,具体代码如下:

Button button=(Button)findViewById(R.id.button1); 
button.setOnClickListener(new OnClickListener() { 
	@Override 
	public void onClick(View v) { 
		Intent intent = new Intent(MainActivity.this,ContentActivity.class); //创建Intent对象 
		startActivity(intent); //启动Activity 
	} 
});

(6)在AndroidManifest.xml文件中配置ContentActivity,配置的主要属性有Activity使用的图标、实现类和标签,具体代码如下:

<activity
	android:icon="@drawable/ic_launcher" 
	android:name=".ContentActivity" 
	android:label="详细" > 
</activity>

多个Activity的使用

在Android应用中,经常会有多个Activity,而这些Activity之间又经常需要交换数据。下面就来介绍如何使用Bundle在Activity之间交换数据,以及如何调用另一个Activity并返回结果。

使用Bundle在Activity之间交换数据

当在一个Activity中启动另一个Activity时,经常需要传递一些数据。这时就可以通过Intent来实现,因为Intent通常被称为是两个Activity之间的信使,通过将要传递的数据保存在Intent中,就可以将其传递到另 一个Activity中了。

在Android中,可以将要保存的数据存放在Bundle对象中,然后通过Intent提供的putExtras()方法将要携带的数据保存到Intent中。下面通过一个具体的实例介绍如何使用Bundle在Activity之间交换数据。

说明:Bundle是一个字符串值到各种Parcelable类型的映射,用于保存要携带的数据包。

实现用户注册界面,并在单击“提交”按钮时,启动另一个Activity显示填写的注册信息。

(1)新建项目的res\layout目录下的布局文件main31.xml,在默认添加的垂直线性布局管理器中,添加用于输入用户注册信息的文本框和编辑框以及一个“提交”按钮。

(2)打开默认创建的主活动MainActivity3,在onCreate()方法中,获取“提交”按钮,并为其添加单击事件监听器,在重写的onClick()方法中,首先获取输入的用户名、密码、确认密码和E-mail地址,并保存到相应的变量中,然后判断输入信息是否为空,如果为空给出提示框,否则判断两次输入的密码是否一致,如果不一致,将给出提示信息,并清空“密码”和“确认密码”编辑框,让“密码”编辑框获得焦点,否则,将输入的信息保存到Bundle中,并启动一个新的Activity显示输入的用户注册信息。

Button submit=(Button)findViewById(R.id.submit); //获取“提交”按钮 
submit.setOnClickListener(new View.OnClickListener() { 
	@Override 
	public void onClick(View v) { 
		String user=((EditText)findViewById(R.id.user)).getText().toString(); //获取输入的用户名 
		String pwd=((EditText)findViewById(R.id.pwd)).getText().toString(); //获取输入的密码 
		String repwd=((EditText)findViewById(R.id.repwd)).getText().toString(); //获取输入的确认密码 
		String email=((EditText)findViewById(R.id.email)).getText().toString(); //获取输入的E-mail地址 
		if(!"".equals(user) && !"".equals(pwd) && !"".equals(email)){ 
			if(!pwd.equals(repwd)){ //判断两次输入的密码是否一致 
				Toast.makeText(MainActivity.this, "两次输入的密码不一致,请重新输入!", 
				Toast.LENGTH_LONG).show(); 
				((EditText)findViewById(R.id.pwd)).setText(""); //清空“密码”编辑框 
				((EditText)findViewById(R.id.repwd)).setText(""); //清空“确认密码”编辑框 ((EditText)findViewById(R.id.pwd)).requestFocus(); //让“密码”编辑框获得焦点 
			}else{ //将输入的信息保存到Bundle中,并启动一个新的Activity显示输入的用户注册信息 
				Intent intent=new Intent(MainActivity.this,RegisterActivity.class);
				Bundle bundle=new Bundle(); //创建并实例化一个Bundle对象 
				bundle.putCharSequence("user", user); //保存用户名
				bundle.putCharSequence("pwd", pwd); //保存密码 
				bundle.putCharSequence("email", email); //保存E-mail地址 
				intent.putExtras(bundle); //将Bundle对象添加到Intent对象中 
				startActivity(intent); //启动新的Activity 
			} 
		}else{
			Toast.makeText(MainActivity.this, "请将注册信息输入完整!", Toast.LENGTH_LONG).show(); 
		} 
	} 
});

说明:在上面的代码中,加粗的代码用于创建Intent对象,并将要传递的用户注册信息通过Bundle对象添加到该Intent对象中。

(3)在res\layout目录中,创建一个名为register.xml的布局文件,在该布局文件中采用垂直线性布局管理器,并且添加3个TextView组件,分别用于显示用户名、密码和E-mail地址。

(4)在com.adou.application包中,创建一个继承Activity类的RegisterActivity,并且重写onCreate()方法。在重写的onCreate()方法中,首先设置该Activity使用的布局文件register.xml中定义的布局,然后获取Intent对象以 及传递的数据包,最后将传递过来的用户名、密码和E-mail地址显示到对应的TextView组件中。关键代码如下:

public class RegisterActivity extends Activity { 
	@Override 
	protected void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.register); //设置该Activity中要显示的内容视图 
		Intent intent=getIntent(); //获取Intent对象 
		Bundle bundle=intent.getExtras(); //获取传传递递的的数数据据包包 
		TextView user=(TextView)findViewById(R.id.user); //获取显示用户名的TextView组件 
		//获取输入的用户名并显示到TextView组件中 
		user.setText("用户名:"+bundle.getString("user") ); 
		TextView pwd=(TextView)findViewById(R.id.pwd); //获取显示密码的TextView组件 
		pwd.setText("密码:"+bundle.getString("pwd") ); //获取输入的密码并显示到TextView组件中 
		TextView email=(TextView)findViewById(R.id.email); //获取显示E-mail地址的TextView组件 
		//获取输入的E-mail地址并显示到TextView组件中 
		email.setText("E-mail:"+bundle.getString("email") ); 
	} 
}

说明:在上面的代码中,加粗的代码用于获取通过Intent对象传递的用户注册信息

(5)在AndroidManifest.xml文件中配置AboutActivity,配置的主要属性有Activity使用的图标、实现类和标签,具体代码如下:

<activity 
	android:label="显示用户注册信息" 
	android:icon="@drawable/ic_launcher" 
	android:name=".RegisterActivity"> 
</activity>

运行本实例,将显示一个填写用户注册信息的界面,输入用户名、密码、确认密码和E-mail地址后,如图5.7所示,单击“提交”按钮,将显示如图5.8所示的界面,显示填写的用户注册信息。

调用另一个Activity并返回结果

在Android应用开发时,有时需要在一个Activity中调用另一个Activity,当用户在第二个Activity中选择完成后,程序自动返回到第一个Activity中,第一个Activity必须能够获取并显示用户在第二个Activity中选 择的结果;或者,在第一个Activity中将一些数据传递到第二个Activity,由于某些原因,又要返回到第一个Activity中,并显示传递的数据,如程序中经常出现的“返回上一步”功能。这时,也可以通过Intent和Bundle 来实现。与在两个Acitivity之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。下面通过一个具体的实例介绍如何调用另一个Activity并返回结果。

说明:已经介绍了填写用户注册信息界面及显示注册信息界面的实现方法,本实例将为其添加“返回上一步”功能。

实现用户注册中的“返回上一步”功能

(1)打开MainActivity3,定义一个名称为CODE的常量,用于设置requestCode请求码。该请求码由开发者根据业务自行设定,这里设置为0x717,关键代码如下:
final int CODE= 0x717; //定义一个请求码常量

(2)将原来使用startActivity()方法启动新Activity的代码修改为使用startActivityForResult()方法实现,这样就可以在启动一个新的Activity时,获取指定Activity返回的结果。修改后的代码如下:

startActivityForResult(intent, CODE); //启动新的Activity

(3)打开res\layout目录中的register.xml布局文件,在该布局文件中添加一个“返回上一步”按钮,并设置该按钮的android:id属性值为@+id/back,关键代码如下:

<Button 
	android:id="@+id/back" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:text="返回上一步" />

(4)打开RegisterActivity,在onCreate()方法中,获取“返回上一步”按钮,并为其添加单击事件监听器,在重写的onClick()方法中,首先设置返回的结果码,并返回调用该Activity的Activity,然后关闭当前 Activity,关键代码如下:

Button button=(Button)findViewById(R.id.back); //获取“返回上一步”按钮 
button.setOnClickListener(new OnClickListener() { 
	@Override 
	public void onClick(View v) { 
		setResult(0x717,intent); //设置返回的结果码,并返回调用该Activity的Activity 
		finish(); //关闭当前Activity 
	} 
});

在这里插入图片描述
在这里插入图片描述

说明:为了让程序知道返回的数据来自于哪个新的Activity,需要使用resultCode结果码。

(5)再次打开MainActivity3,重写onActivityResult()方法,在该方法中,需要判断requestCode请求码和resultCode结果码是否与预先设置的相同,如果相同,则清空“密码”编辑框和“确认密码”编辑框,关键代码 如下:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
	super.onActivityResult(requestCode, resultCode, data); 
	if(requestCode==CODE && resultCode==CODE){ 
		((EditText)findViewById(R.id.pwd)).setText(""); //清空“密码”编辑框
		((EditText)findViewById(R.id.repwd)).setText(""); //清空“确认密码”编辑框 
	} 
}

使用Fragment

Fragment是Android 3.0新增的概念,其中文意思是碎片,它与Activity十分相似,用来在一个Activity中描述一些行为或一部分用户界面。使用多个Fragment可以在一个单独的Activity中建立多个UI面板,也可 以在多个Activity中重用Fragment。 一个Fragment必须被嵌入到一个Activity中,它的生命周期直接受其所属的宿主Activity的生命周期影响。例如,当Activity被暂停时,其中的所有Fragment也被暂停;当Activity被销毁时,所有隶属于它的 Fragment也将被销毁。然而,当一个Activity处于resumed状态(正在运行)时,可以单独地对每一个Fragment进行操作,如添加或删除等。

创建Fragment

要创建一个Fragment,必须创建一个Fragment的子类,或者继承自另一个已经存在的Fragment的子类。例如,要创建一个名称为NewsFragment1、NewsFragment2的Fragment,并重写onCreateView()方法,可以使用下面的代码:

public class NewsFragment1 extends Fragment { 
	@Override 
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //从布局文件		news.xml 加载一个布局文件 
		View v = inflater.inflate(R.layout.news, container, true); return v; 
	} 
}

说明:当系统首次调用Fragment时,如果想绘制一个UI界面,那么在Fragment中,必须重写onCreateView()方法返回一个View;否则,如果Fragment没有UI界面,可以返回null。

在Activity中中添添加加Fragment

向Activity中添加Fragment,有两种方法;一种是直接在布局文件中添加,将Fragment作为Activity整个布局的一部分;另一种是当Activity运行时,将Fragment放入Activity布局中。下面分别进行介绍。

1. 直接在布局文件中添加Fragment
直接在布局文件中添加Fragment可以使用标记实现。例如,要在一个布局文件中添加两个Fragment,可以使用下面的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <fragment android:name="com.adou.myapplication.NewsFragment1"
        android:id="@+id/detail1"
        android:layout_weight="1"
        android:layout_marginLeft="20px"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

    <fragment android:name="com.adou.myapplication.NewsFragment2"
        android:id="@+id/detail2"
        android:layout_weight="2"
        android:layout_marginLeft="20px"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

</LinearLayout>

说明:在标记中,android:name属性用于指定要添加的Fragment。

2. 当Activity运行时添加Fragment
当Activity运行时,也可以将Fragment添加到Activity的布局中,实现方法是获取一个FragmentTransaction的实例,然后使用add()方法添加一个Fragment,add()方法的第一个参数是Fragment要放入的 ViewGroup(由Resource ID指定),第二个参数是需要添加的Fragment,最后为了使改变生效,还必须调用commit()方法提交事务。例如,要在Activity运行时添加一个名称为DetailFragment的Fragment,可以使用下面 的代码:

NewsFragment1 details = new NewsFragment1(); //实例化DetailFragment的对象 
FragmentTransaction ft = getFragmentManager() .beginTransaction(); //获得一个FragmentTransaction的实例 
ft.add(android.R.id.content, details).commit(); //添加一个显示详细内容的Fragment 
ft.commit(); //提交事务

Fragment比较强大的功能之一就是可以合并两个Activity,从而让这两个Activity在一个屏幕上显示。左边的两个图分别代表两个Activity,右边的图表示包括两个 Fragment的Activity,其中第一个Fragment的内容是ActivityA,第二个Fragment的内容是ActivityB。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值