Android4开发入门经典 之 第三部分:Activity

Activity基本概念

Activity是什么

Activity是Android的一种应用组件,用来提供与用户交互的屏幕,Activity提供一个Window来绘制用户界面,通常一个Activity就是我们见到的一个应用程序的界面。
 

Activity能干什么

要注意一点,Activity只是提供View组件绘制的环境,它本身并不会绘制界面,因此,Activity主要用来:
1:提供View组件的环境,由多个View组和构成一个应用程序的界面
2:用来处理View组件的事件响应,可以在里面写界面的逻辑处理代码

视图View

视图View

视图(Views)是可以将其自身绘制到屏幕上的对象。Android的用户界面是由一系列的视图树构成,接口都是由一组以树的形式出现的视图组成的。
开发者可以通过创建一个新的视图的方法来使用自定义的图形处理技术,比如开发游戏,或者是使用 用户图形窗口界面widget。

视图组Viewsgroups

视图组是一种特殊类型的视图对象,它的功能是包含和管理下级试图和其它视图组的集合。视图组让你可以为你的用户界面添加结构,从而建立复杂并可以作为单独实体进行访问的屏幕元素。

Activity和View

Android应用程序最基本的功能单位是Activity,主要用来实现界面的功能处理,但是它本身并不能使自己显示在屏幕上。

你可以使用视图views和视图组viewgroups,它们是Android平台上的最基本的用户界面元素。

创建和使用Activity

创建Activity

创建Activity非常简单,只需要:
1:继承Activity
2:实现Activity的回调方法
比如:onCreate()方法,一定要记得在里面回调父类的onCreate方法和setContentView方法,由父类去布局界面。
3:创建Activity里面具体的View组件,并设置他们的属性和布局方式
到这个地方,画界面的工作就完成了
4:然后是具体的写界面的工作

使用Activity

要使用Activity也非常简单,Activity的展示无非两种情况,一是作为程序启动后的第一个界面,另外一个就是从其他地方导航过来。
无论哪种情况都需要在AndroidManifest.xml里面注册,对于第一种情况,注册的时候就要配置,对于第二种情况多半需要使用intent。

启动Activity

配置式

要作为程序入口的Activity,在AndroidManifest.xml里面配置即可,示例:

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

在一个Activity里面启动另外的Activity,示例:


java代码:
  1. Intent in = new Intent();  
  2. in.setClass(HelloWorldActivity.this, T2.class);  
  3. HelloWorldActivity.this.startActivity(in);  
如果还想要传递参数,就直接在intent里面添加extra即可。

销毁Activity

如果想要销毁Activity,可以使用

1:finish方法,销毁Activity本身
2:finishActivity方法,可以指定销毁某一个requestId对应的Activity。主要用来销毁通过startActivityForResult(Intent, int)启动的Activity,因而有requestId

注意

通常情况下,你是不需要自己去显示的销毁Activity的,Activity的生命周期是由系统来控制的,可以让系统来确定什么时候不需要这个Activity了,然后由系统去销毁。
这样就能在系统进行Activity导航的时候,不会出错。

接收启动的Activity的Result

如果想要接收启动的Activity的返回结果,可以使用startActivityForResult :

1:在启动的Activity
(1)使用startActivityForResult

java代码:
  1. public void onClick(View v) {  
  2. Intent in = new Intent();  
  3. in.setClass(HelloWorldActivity.this, T2.class);  
  4. in.putExtra("param1"798);  
  5. HelloWorldActivity.this.startActivityForResult(in,123);  
  6. }  
(2)实现接收返回值并处理的方法

java代码:
  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  2. if (requestCode == 123) {  
  3. if(resultCode == 456){ Log.i("HelloWorldActivity","result=="+data.getExtras().getString("ret"));  
  4. }  
  5. }  
  6. }  
  7.    
2:在返回值的Activity

java代码:
  1. public void onClick(View v) {  
  2. switch (v.getId()) {  
  3. case R.id.back:  
  4. Intent in = new Intent();  
  5. in.putExtra("ret""now ret=="+param1);  
  6. T2.this.setResult(456, in);  
  7. T2.this.finish();  
  8. break;  
  9. }  
  10. }  
(1)把要返回的值包装在intent里面
(2)使用setResult方法
(3)结束自己这个Activity

Activity的状态

Activity的状态

Activity有三种状态,分别是:

1:resumed :
Activity被显示到前端界面,此时的Activity是 running的
2:paused
另外一个Acvitity被显示到前端界面,但此时这个Activity仍有部分处于可视状态,但此时这个Activity已经不能被用户操作了。
通常情况下,处于这个状态的Activity还是活着的,系统一般不会销毁它。但是,如果系统资源实在紧张,这个状态的Activity是可以被kill掉的。
3:Stopped
这种状态的Activity通常都是完全看不见的,处于“background ”,系统一般不会销毁它。但是,如果系统资源实在紧张,这个状态的Activity是可以被kill掉的,而且是会优先被销毁掉。

Activity的生命周期图

Activity的回调方法

onCreate() :在Activity第一次被创建的时候调用,通常在这里做一些静态初始化的工作,比如:创建views、绑定数据到列表等。这个方法会把这个Activity上一次运行所保存的状态传递进来。
onStart() : 在Activity变得可以被用户看见之前调用。
onRestart() :在Activity被stop后,重新变得可见的时候调用。
onResume(): 在Activity可见,能跟用户进行交互的时候调用。这时候,这个Activity来到Activity栈的顶端,用户就可以操作这个Activity了。
onPause()
在系统准备resume其他的Activity的时候调用。这个方法里面通常可以实现:提交未保存的数据,终止动画等。
onStop(): 当Activity不可见的时候调用这个方法。
onDestroy()
调用finish方法,或是系统判断,需要销毁这个Activity的时候调用。

Activity在屏幕旋转时的生命周期

如果不做任何配置,那么会将当前Activity实例销毁,然后再重新创建一个。
如果要避免销毁重建的过程,可以在清单文件里面,对Activity配置android:configChanges=“ orientation|screenSize”,这样会只回调onConfigurationChanged方法。
如果Activity不希望跟着屏幕旋转而发生变化,可以在清单文件里面配置android:screenOrientation,值为“portrait”是竖屏,landscape为横屏。但是如果设置了这个属性,那么android:configChanges配置会失效。

保存Activity的状态

概述

当Activity处于paused或stopped的时候,只要相应的进程还没有被销毁,那么Activity的状态会被自动的保留在内存里面。因此,你返回到这个Activity的时候,仍然能够看到上一次的数据。
然而,当Activity对应的进程被销毁过后,你再次返回或是重新进入这个Activity,上一次的数据已经丢失了,如果这种情况下,你也希望能保留上一次的状态,也就是数据,该怎么办呢?

onSaveInstanceState()方法

你可以覆盖实现onSaveInstanceState()方法来保存你想要存储的数据。对应的,系统会回调onRestoreInstanceState方法来恢复数据。
 
要注意:Android系统并不保证一定会调用onSaveInstanceState()方法,因此在这个方法里面,你只应该保存一些瞬时状态的数据,而不应该保存持久化的数据,你应该在onPause里面保存持久化的数据。

保存Activity的状态图

Tasks和回退栈

什么是Task

简单点说,Task就是为了完成某一个工作而组合在一起的Activity集合。例如:要回复短信,通常先要显示一个信息列表,然后用户打开其中一个信息,然后点击回复,然后输入回复内容,然后按下回复按键,最后显示一个发送成功的信息。那么在这个过程中,会有多个Activity,但是他们都是为了完成回复短信这个功能。所以可以把Task简单的当成“应用程序”来看。
那么在Android系统中,会把这多个Activity存储在同一个栈里面。

什么是回退栈:用来存放前面运行的Activity和相应状态的栈。

按返回按钮

按返回按钮的时候,回退栈会遵循后进先出的原则,把最后的一个Activity弹出栈,也就是会销毁掉最后一个Activity。
 

按Home按钮

用户按Home按钮离开整个Task,此时整个Task会在background继续运行,系统会保留Task里面的每一个Activity的状态,当用户重新再回到这个task的时候,task将回到前台运行,并恢复上次运行的状态。
如果某个Activity调用了finish方法,那么它将会从栈中消失,后面的Activity会依次移动,补充它的位置
Activity的Fragments
 

Loaders

概述:从Android3.0开始加入了Loaders,它能让Activity或Fragment很容易的实现数据的异步装载。

特点

1:能在任意的Activity或Fragment里面使用
2:异步装载数据
3:自动监控源数据的变化
4:当配置改变或重启的时候,能自动续连而无需重新查询数据。

常用的API

1:LoaderManager:用来创建和维护Loader,通常一个Activity或Fragment一个
2:LoaderManager.LoaderCallbacks:LoaderManager的一些回调方法
3:Loader:实现异步装载数据的抽象类,典型的实现是CursorLoader
4:AsyncTaskLoader:通过AsyncTask来实现的一个抽象Loader
5:CursorLoader: AsyncTaskLoader的一个具体实现类,它不会阻塞UI 线程,使用这个Loader的最佳场景是从ContentProvider中装载数据。
 

 

posted on 2012-07-23 07:52  kaitao1987  阅读(957)  评论(0编辑  收藏  举报