资源描述
2013年1月22日15:16:32
Activity是android应用的重要组成单元之一(另外三个是Service、BroadcaseReceiver、和ContentProvide),而Activity又是android应用最常见的组件之一。前面看到的示例通常都只是包含一个Activity,但在实际应用中这是不大可能的,实际应用中往往包括多个Activity,不同的Activity向用户呈现不同的操作界面。Android应用的多个Activity组成Activity栈,当前活动的Activity位于栈顶。
4.1建立、配置和事业Activity
Activity是android应用中最主要、最常见的应用组件。Android应用开发的一个主要组成部分就是开发Activity。
Activity类间接或直接地继承了Context、ContextWrapper、ContextTheme、Wrapper等基类,因此Activity可以直接调用它们的方法。
创建一个Activity需要实现一个或多个方法,其中最常见的就是实现onCreate(Bundle status)方法,该方法将会在Activity启动时被回调,该方法调用Activity的setContentView(View view)方法来展示的View。为了管理应用程序界面中的各组件,调用Activity的findViewById(int id)方法来获取程序界面中的组件。
实例:用LauncherActivity开发启动Activity的列表(4.1.1)
PreferenceActivity是一个非常有用的基类,当我们开发一个android应用程序时,不可避免地需要进行选项设置,这些选项设置会以参数的形式保存,习惯上我们会以PreferenceActivity进行保存。
需要指出的是,如果android应用程序中包含某个Activity专门设置选项参数,那么android为这种Activity提供了便捷的基类:PreferenceActivity。
一旦Activity继承了PreferenceActivity,那么该Activity完全不需要自己控制PreferenceActivity的读写,PreferenceActivity会为我们处理一切。
使用PreferenceActivity有一点与众不同的是,不再使用普通的界面布局文件,PreferenceActivity所使用的界面布局文件有点与众不同,它的界面布局文件不再使用普通的XXXLayout作为根元素,而是使用PreferenceActivity作为根元素-它表明定义一个参数设置的界面布局。
为了创建一个PreferenceActivity,需要先创建一个对应的界面布局文件,按如下步骤进行:
-》点击Eclipse工具条上“Opens a wizard to help create a new Android XML File”按钮,Eclipse弹出窗口。
-》在窗口选择创建“Preference”类型的XML文件,该文件默认保存在/res/xml路径下。并选择该XML文件的根元素为PreferenceScreen。
-》进入preferences.xml文件的编辑界面
一旦定义了参数设置的界面布局文件之后,接下来在Activity程序中使用该界面布局文件进行参数设置、保存十分简单,只要两步即可:
-》让Activity继承PreferenceActivity
-》在onCreate(Bundle bundle)方法中调用addPreferenceFromResource(。。)方法加载指定的界面布局文件。
4.1.2配置Activity
Android应用要求所有应用程序组件(Activity、Service、ContentProvider、BroadcaseReceiver)都必须显示进行配置。
只要为<application……/>元素添加<activity……/>子元素即可配置Activity。
如下配置片段:
<activity android:name=”.SampleActivity”
Android:icon=”drawable/small_pic.png”
Android:label=”@string/freneticLabel”
……
>
……
<activity/>
配置Activity时通常指定如下三个属性:
-》name:指定该Activity的实现类
-》icon:指定Activity对于的图标
-》label:指定该Activity的标签
除此之外,配置Activity时通常还需要指定一个或duog<intent-filter/>元素,该元素用于指定该Activity可响应的Intent。
4.1.3启动、关闭Activity
一个android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口-但该Activity应用运行时将会自动启动并执行该Activity。至于应用中的其它Activity,通常都由入口Activity启动,或由入口Activity启动。
Activity启动其它Activity有如下两个方法:
-》sstartActivity(Intent intent):启动其它Activity。
-》startActivityForResult(Intent intent,int requestCode):以指定请求码(requestCode)启动Activity,而且程序将会等到新启动Activity的结果(通过重写onActivityResult(……)方法来获取)。
Intent是android应用里各组件之间通信的重要方式,一个Activity通过Intent来表达自己“意图”--想要启动那个组件,被启动的组件既可以是Activity也可以是Service。
Android为关闭Activity准备了如下两个方法:
-》finish():结束当前Activity。
-》finish(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity。
实例:4.1.2
4.1.4使用Bundle在Activity之间交换数据
当一个Activity启动另一个Activity时,常常会有一些数据要传递过去——这就像Web应用从一个Servlet跳到另一个Servlet时,Web应用习惯把需要交换的数据放入requestScope、sessionScope中。对于Activity而言,在Activity之间进行数据交换更加简单:因为两个Activity之间本来就是一个“信使”:Intent,因此我们主要将需要交换的数据放入Intent即可。
Intent提供了多个重载的方法来“携带”额外的数据。
-》putExtra(Bundle data):向Intent中放入需要“携带”的数据
-》上面方法中Bundle就是一个简单的数据携带包,该Bundle对象包含了多个方法来存入数据。
-》putXXX(String key,XXX data):向Bundle放入Int、Long等各种类型的数据。
-》putSerialzable(String key,Serializable data):向Bundle中放入一个可序列化的对象。
为了取出Bundle数据携带包里的数据,Bundle提供了如下方法:
-》getXXX(String key):从Bundle取出Int、Long等各种类型的数据。
-》getSerializable(String key,Serializable data):从Bundle取出一个可序列化的对象。
实例:用第二个Activity处理注册信息(4.1.3)
4.1.5启动其它Activity并返回结果
Activity提供了一个startActivityForResult(Intent intent,int requestCode)方法来启动其它Activity。该方法用于启动指定Activity,而且期望获取指定Activity返回的结构。这种请求对于实际应用也是很常见的,例如应用程序第一个界面需要用户进行选择——但需要选择的列表数据比较复杂,必须启动另一Activity让用户选择。当用户在第二个Activity选择完成后,程序返回第一个Activity,第一个Activity必须能获取并显示用户在第二个Activity选择结果,在这种应用场景下,也是通过Bundle进行数据交换的。
为了获取启动的Activity所返回的结构,当前Activity需要重写onActivityResult(int requestCode,int resultCode,Intent intent),其中requestCode代表请求码,而resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。
一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode,int resultCode,Intent data)方法,为了知道该方法是由哪个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自哪个新的Activity,可利用resultCode结果码。
实例:用第二个Activity让用户选择信息(4.1.4)
2013年1月23日9:18:26
4.2Activity的回调机制
Activity被开发出来之后,开发者只要在ActivityManifest.xml文件配置该A车提成即可。至于该Activity何时被实例化,它的方法何时被调用,对开发者来说是完全透明的。
所谓回调,在实现具有通用性质的应用架构时非常常见:对于一个具有通用性质的程序架构来说,程序架构完成整个应用的通用功能、流程,但在某个特定的点上,需要一段业务相关的代码——通用的程序架构无法实现这段代码,那么程序架构会在这个点上留下一个“空”。
对于Java程序来说,程序架构在某个点留的“空”,可以以如下两种方式存在:
-》以接口形式存在:该接口由开发者实现,实现该接口时将会实现该接口的方法,那么通用的程序架构就会回调该方法来完成业务相关的处理。
-》以抽象方法(也可以是非抽象方法)的形式存在:这就是Activity的实现形式。这些特定的点上方法已经被定义了。如onCreate、onActivityResult等方法,开发者可以选择性地重写这些方法,通用的程序架构就会回调该方法来完成业务相关的处理。
4.3Activity的生命周期
当Activity处于android应用中运行时,它的活动状态有android以Activity栈的形式管理,当前活动的Activity位于栈顶。随着不同应用的运行,每个Activity都可能从活动状态转入非活动状态,也可能从非活动转入活动状态。
4.3.1Activity的生命周期演示
归纳起来Activity大致经过如下四个状态:
-》活动状态:当前Activity位于前台,用户可见,可以获得焦点
-》暂停状态:其它Activity位于前台,该Activity依然可见,只是不能获得焦点。
-》停止状态:该Activity不可见,失去焦点
-》销毁状态:该Activity结束,或Activity所在的Dalvik进程被结束。
在Activity的生命周期中,如下方法会被系统回调:
-》onCreate(Bundle saveStatus):创建Activity时被回调
-》onStart():启动Activity时被回调
-》onRestart():重新启动Activity时被回调
-》onPause():恢复Activity时被回调
-》onStop():暂停Activity时被回调
-》onDestroy():销毁Activity被回调
实例:(4.3.1)
各个时期调用的方法:
-》程序一启动时运行的方法有:onCreate(Bundle bundle)(创建)、onStart()(开始)、onResume()(恢复)
-》当按下Home键时:onPause()(暂停)、onStop()(停止)
-》再次点击程序时:onRestart()(重启)、onStart()(开始)、onResume()(恢复)
-》按返回键时:onPause()(暂停)、onStop()(停止)、onDestroy()(销毁)
展开阅读全文