Activity

来源:互联网 发布:webgl编程指南 pdf 编辑:程序博客网 时间:2024/06/05 17:39

    一个活动是一个应用组件提供一个屏幕,用户可以跟屏幕交互做一些事情,比如拨打电话,或者发邮件、看地图等。

每一个活动都会赋予一个窗口来绘制它的用户界面。这个窗口通常会填满屏幕,不过也可能比屏幕小,悬浮在其他窗口之上。

    一个应用通常包含许多个活动,这些活动松散的绑定在一起。通常,会有一个活动作为main Activity,当程序第一次启动的

时候呈现给用户。每个活动可以启动其他活动来提供不同的动作。每次新的活动启动,前面一个活动停止,但是系统会

把它这个活动放在一个stack中(返回栈)当一个新的活动启动,他被推入栈中,获得焦点。返回站遵循后进先出的原则,

如果用户处理完当前的活动按下返回键,他就会被从返回站推出(销毁),前一个活动会复活。这就是Activity的生命周期

的模块。

    当一个活动因为一个新的活动开始而停止,这些改变被通知通过活动的生命周期回到方法。有一系列的回调方法活动

可以活动根据改变的状态,是否创建,停止,复活,销毁,每一个回调方法提供特殊的任务适合这个改变的状态。

    比如,当停止时,我们的活动应该释放大的对象,比如网络或者数据库连接。当活动复用的时候,我们可以重新获得

需要的资源重新开始被中断的动作(下载啥的被打断了,重新开始)。这些变化都是活动的生命周期。

   

创建一个活动

要创建一个活动,必须创建一个Activity的子类(或者孙子类),在子类中,我们要实现当活动状态改变时系统调用的

回调方法,比如活动被创建,停止,复用,或者销毁。 两个最重要的回调方法:


onCreate:这是必须实现的方法,当创建活动的时候,系统会调用这个方法,在这个方法实现中,我们应该初始化

活动需要的组件。最重要的是,必须调用setContentView来定义这个活动的用户界面。


OnPause:系统调用这个方法,暗示用户离开了活动(并不意味着活动要被销毁)。这时候我们应该保存当前

用户对话的一些操作(比如发短信,突然中断了??),因为用户可能不会回来了。


实现用户界面:

(1)使用xml,不多说了

(2)使用代码,首先实现一个viewGroup,然后在ViewGroup中添加view,反正也可以嵌套,但是最后比如

把root ViewGroup添加传递到setContentView方法中。


Manifest中声明活动

必须在manifest中定义活动为了让系统能获得他。添加活动就是在manifes文件中,在Application元素下添加activity子元素,

所以的活动都要在这里定义,这个应该是没有什么问题的的。activity子元素可以添加其他属性,比如label,icon,theme。

android:name是唯一一个必须的,指定活动的类文件名。一旦定了就不能改变,所以要看看blog, 不能改变的事。


添加Intent filters

指定其他应用组件如何激活这个活动,我们一般这样定义一个在程序启动的main Activity,其他的还是要学学Intent在说了

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

启动一个活动:

startActivity,传入一个intent

如果我们想打电话发邮件,发短信,调用系统集成的这些,可以这么用,像打电话,需要权限运行,这个还要在权限那里参考

学习一下的。

Intent intent = new Intent(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);startActivity(intent);

启动一个活动获得结果

使用 startActivityForResult ,调用onActivityResult方法,处理返回结果,这个也要接着学习。


关闭活动

我们一般不用手动调用finish方法,系统会帮我们的。


管理活动的生命周期:


Resumed: 在屏幕前面,获得焦点, running


Paused:另一个活动在最前面获得焦点,但是这个活动还是可见。 也就是说,另一个活动在这个上面可见,但是他是部分

通明或者没有覆盖整个屏幕,此时该活动是完全活着的,被保存在内存中,保持所有的状态,记录所有信息,和窗口管理器

相关联,在极端情况下会被杀死


Stopped:完全被覆盖了,在后台中。虽然也是活的,保存了状态,记录了信息,但是不和窗口管理器关联。 (和pause的区别)

另外他不在可见,内存不足时系统可以杀死他。


实现生命周期的回调函数,6个函数,必须先调用父类的实现。

整个生命周期,在 onCreate 和 onDestroy之间 所以在OnCreate中要设置全局的状态(比如定义布局),在OnDestroy中

释放资源。举例来说,活动有一个后台运行的从网络下载数据的进程,可能在OnCreate中创建,在onDestroy中停止。


活动可见发生在 onStart和 onStop 之间,这期间用户可以看到这个屏幕,可以交互。举例来说,当一个新活动启动

这个活动完全不可见,onStop调用,在这两个方法之间,可以持有需要展示给用户的资源。 比如,可以在onStart注册一个

BroadcastReceiver监听UI的改变,在onStop取消注册当用户看不到的时候。系统会调用这两个方法多次,在活动的整个生命周期,

随着活动变得可见和不可见。


前端显示时间发生在onResume和onPause之间。在这期间,活动在所有其他活动的前面,活动用户输入的焦点。一个活动

可以频繁的改变他的前端,具体来说,当设备休眠或者弹出一个dialog的时候,onPause方法调用。

由于状态转变频繁,这两个方法之间的代码应该是轻量级的,避免慢的状态转换,导致用户等待,用户体验很重要,不过这两个之间,

如何去判断代码在哪些状态之间。


具体的图见下面:



方法

描述

Killed after

下一个方法

onCreate

活动第一次启动调用。我们应该做一些通常的静态设置,比如创建view,list绑定数据等等。这个方法,传递一个Bundle方法,包含活动之前的状态(学习保存活动状态)。onStart总是在他之后

onStart

onRestart

活动停止之后,之前被重新启动,onStart总是在他之后

onStart

onStart

当活动变成可见的时候调用,如果活动来到最前调用onResume,如果隐藏调用onStop

onRusume或者onStop

onResume

在活动开始和用户交互之前调用。在这里,活动总是在活动栈的最前面,用户交互。永远跟着onPause

onPause

onPause

当系统要开始活动重新启动另一个互动。这个方法通常用来提交未保存的信息来保存数据,停止动画,或者其他消耗cpu的事。他应该干的非常快,因为下一个活动不会开始直到他返回。  如果活动返回到最前,onResume的,如果活动不可见跟着onStop

OnResume或者onStop

onStop

活动完全不可见时调用,可能被销毁,后者被另一个活动(已经存在或者被新的)被resumed,覆盖了他。 如果活动重新回到可交互是 onRestart,如果这个活动消失,调用被销毁

onRestart或者onDestroy

onDestroy

活动销毁前调用,这是这个活动接收的最后一个调用,它可以被调用,因为活动要停止了(有人调用了他的finish方法),或者因为系统临时销毁他来节省空间。我们可以通过isFinishing方法判断这两种情况。

 

killable after是说,系统是否可以杀死拥有这个活动的线程在这个方法返回之后的任意时间,不执行互动的其他代码。

三个方法标记为yes: onPause onStop onDestroy .因为onPause是三个中的第一个,一旦这个活动创建,onPause是在线程

被杀死前保证能被调用的最后一个方法,如果系统要紧急情况下必须恢复内存,onStop和onDestroy可能会被调用。因此,

应该使用onPause来把重要的数据保存。然而,应该有选择的哪些信息必须要保存,因为任何方法中的任何阻塞进程会阻塞

转变到下一个活动,减慢用户体验。

其他标记不能杀死的,保证活动不会被杀死? 因此,一个活动可以被杀死的实际从onPause返回到onResume被调用。

该活动不会再次变为可杀死除非onPause方法被重新调用并且返回。

也就说,onPause被调用返回一次,才有一次可以被杀死的机会。一旦回到Resume之后,不调用onPause返回,是不能杀死的,

这不是废话啊,表格就是这么标记的。呵呵。


最后一个问题就是保存活动的状态。

如果一个活动被销毁了,他之前的view中的内存,比如EditText的输入,要保存,怎么办?


这个时候,只要我们给这些view指定了id,就会自动保存,自己的经验是,一个EditText没有设置id,旋转屏幕之后就

消失了,然后加上id了就可以了。

不过另一个活动到前面的时候回调用onSaveInstanceState,如果是系统杀死活动,是不会调用的,但是你知道了view 的id,

系统会保存view 的内容。



如果重写这个方法,必须首先调用父类的方法,因为这个方法不保证被调用,所以我们只能用来保存临时数据,

如果要保存数据到数据库要用onPause啊,这是保证会被调用的。

旋转屏幕就是一个好的测试方法。

最后说一下:不一定被调用,即使调用了,也不保证顺序??为啥

If called, this method will occur before onStop(). There are no guarantees about whether it will occur before or afteronPause().




0 0
原创粉丝点击