四大组件----Activity(一)----activity

一.Activity概述

Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面。每一个activity都被分配一个窗口。在这个窗口里,你可以绘制用户交互的内容。这个窗口通常占满屏幕,但也有可能比屏幕小,并且浮在其它窗口的上面。


二.创建一个Activity

最重要的两个方法:

        onCreate():必须在这里调用setContentView()来定义你activity用于用户交互的布局.

        onPause():系统将会调用这个方法作为用户离开activity的首先提示(虽然这并不意味着activity正在被销毁)。这通常是你应该在用户会话之前提交并保存任何更改的时机。(因为用户可能不会再回到这个activity).

1.实现一个用户交互界面

(1)“Widgets”是提供可视化(且可交互)屏幕部件的view

(2)“Layouts”是派生自ViewGroup 的view,用于向它的子view提供一种layout模式

定义布局最常用的方式是使用XML布局文件,它保存在你程序的资源中。这种方式可以保证你的业务逻辑代码和用户交互界面分开。你可以通过setContentView()传递布局文件的ID来设置程序UI。当然,你也可以在activity代码里自己新建View,并通过插入子ViewViewGroup。然后把这些视图的根视图传入到setContentView()

2.在配置文件中声明activity

在配置文件中,在<application>中增加一个<activity>元素。其中name的属性是必需的,并且若程序发布了,则不可改变,否则将破坏一些功能。

3.使用filter

<activity>也可以用很多<intent-filter>来指定其他的组件怎样激活它,若不想其他组件激活,则不指定<intent-filter>即可.

当你使用Android SDK tools来创建一个程序,主activity将会自动包含一个被分类为"launcher"的intent-filter.其中<action>元素指定程序的入口.<category>指明了此activity能让系统启动应用程序(launcher)(即允许用户启动它)。


三.启动一个activity

通过startActivity()启动,一种是new Intent(this,已知的Activity.class)或者new Intent(Intent.ACTION_SEND)[发邮件等]

1.启动一个带返回结果的activity

通过startActivityForResult()启动,实现onActivityResult()的回调方法来获取返回的结果

在onActivityResult()中,第一步判断resultCode是否是RESULT_OK,然后判断requestCode和发送时提供的第二个参数(startActivityForResult()的第二个参数)是否匹配,最后查询Intent的data信息


四.关闭Activity

使用finish(),不过一般情况下无需你去关闭,系统会为你处理(生命周期)


五.管理Activity的生命周期

1.activity可能处于三种基本的状态
(1)Resumedactivity在屏幕的前台并且拥有用户的焦点。(这个状态有时也被叫做“running”。)

(2)Paused另一个activity在前台并拥有焦点,但是本activity还是可见的。 也就是说,另外一个activity覆盖在本activity的上面,并且那个activity是部分透明的或没有覆盖整个屏幕。 一个paused的activity是完全存活的(Activity 对象仍然保留在内存里,它保持着所有的状态和成员信息,并且保持与window manager的联接),但在系统内存严重不足的情况下它能被杀死。

(3)Stopped本activity被其它的activity完全遮挡住了(本activity目前在后台)。 一个stopped的activity也仍然是存活的(Activity 对象仍然保留在内存中,它保持着所有的状态和成员信息,但是不再与window manager联接了)。 但是,对于用户而言它已经不再可见了,并且当其它地方需要内存时它将会被杀死。

2.实现生命周期的回调方法

activity生命周期中三个嵌套的循环:

(1)activity的完整生存期会在 onCreate() 调用和 onDestroy() 调用之间发生。 你的activity应该在 onCreate() 方法里完成所有“全局global”状态的设置(比如定义layout), 而在onDestroy() 方法里释放所有占用的资源。 例如,如果你的activity有一个后台运行的线程,用于从网络下载数据,那么你应该在 onCreate() 方法里创建这个线程并且在 onDestroy() 方法里停止这个线程。

(2)activity的可见生存期会在 onStart() 调用和 onStop() 调用之间发生。在这期间,用户可在屏幕上看见这个activity并可与之交互。 例如,当一个新的activity启动后调用了 onStop() 方法,则这个activity就无法被看见了。 在这两个方法之间,你可以管理那些显示activity所需的资源。例如,你可以在 onStart() 方法里注册一个 BroadcastReceiver 用于监控影响用户界面的改动。并且当用户不再看到你的显示内容时,在 onStop() 方法里注销掉它。 系统会在activity的整个生存期内多次调用 onStart() 和onStop(), 因为activity可能会在显示和隐藏之间不断地来回切换。

(3)activity的前台生存期会在 onResume() 调用和 onPause() 之间发生。在这期间,activity是位于屏幕上所有其它的activity之前,并且拥有用户的输入焦点。 activity可以频繁地进入和退出前台——例如, 当设备进入休眠时或者弹出一个对话框时, onPause() 就会被调用。因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当地轻量化。

3.生命周期的各个回调方法

onCreate():activity第一次被创建时调用。在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等。 本方法传入一个包含了该activity前一个状态的Bundle对象。

onRestart():activity被停止后、又再次被启动之前调用。

onStart():activity要显示给用户之前调用。

onResume():activity开始与用户交互之前调用。这时activity是在activity栈的顶端,用户可以向其中输入。

onPause():当系统准备启动另一个正在恢复的activity时调用。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。 它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。

onStop():当activity不再对用户可见时调用。原因可 能是它即将被销毁、或者其它activity(已有或新建的)被恢复运行并要覆盖本activity。

onDestroy():在本activity被销毁前调用。这是activity收到的最后一个调用。 可能是因为activity完成了工作(有些人在这里调用finish()), 也可能是因为系统为了腾出空间而临时销毁activity的本实例。 可以利用isFinishing() 方法来区分这两种情况

       一旦activity被创建, onPause() 就是进程可以被杀死之前最后一个能确保被调用的方法 ——如果系统在某种紧急情况下必须回收内存,则 onStop() 和onDestroy() 可能就不会被调用了。因此,你应该使用 onPause() 来把至关重要的需长期保存的数据写入存储器(比如用户所编辑的内容)。 不过,应该对必须通过 onPause() 方法进行保存的信息有所选择,因为该方法中所有的阻塞操作都会让切换到下一个activity有所 停滞,并使用户感觉到迟缓。 

4.保存activity的状态

        在activity变得很容易被销毁之前,系统会调用 onSaveInstanceState()方法来保存activity的状态。 调用时系统会传入一个Bundle对象, 你可以利用 putString() 之类的方法,以键值对的方式来把activity状态信息保存到该Bundle对象中。 然后,如果系统杀掉了你的application进程并且用户又返回到你的activity,系统就会重建activity并将这个 Bundle 传入onCreate() 和onRestoreInstanceState() 中,你就可以从 Bundle 中解析出已保存信息并恢复activity状态。如果没有储存状态信息,那么传入的Bundle 将为null(当activity第一次被创建时就是如此)。

       --不过,即使你没有实现 onSaveInstanceState() 方法,有些activity状态还是会通过 Activity 类缺省实现的onSaveInstanceState() 方法保存下来。而且几乎Android框架下所有的widget都会在适当的时候实现该方法。只要你为每一个你想要保存其状态的widget提供一个唯一的ID(就是 android:id 属性)。

       --通过把android:saveEnabled 设置为"false",或者调用 setSaveEnabled() 方法,你也可以显式地阻止layout中的某个view保存状态

注意:因为 onSaveInstanceState() 并不保证每次都会被调用,所以你应该只用它来记录activity的一些临时状态信息(UI的状态)——千万不要用它来保存那些需要长久保存的数据。 替代方案是,你应该在用户离开activity的时候利用 onPause() 来保存永久性数据(比如那些需要存入数据库里的数据)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值