activity

activity是一个应用的组件之一,它提供了和用户交互的界面。比如,拨号,照相,发送邮件,地图。每个activity都是绘制在给定的窗口内。这个窗口充满这个屏幕,但是也有比屏幕小的,也有浮在另外的窗口上的。

一个应用通常会包含多个activity,应用启动一般会有个主activity。每个activity可以通过不同的动作来启动另一个activity。当一个activity启动的时候,另一个activity就要暂停,但是会放在一个activity的栈中。当一个新的activity启动,推入这个返回栈中并展现界面给用户,返回栈遵守“先进后出”的原则,所以当用户按返回按钮时,当前的activity就会从栈中弹出并销毁,然后恢复前一个activity。

当一个新的activity启动,原来的activity就会停止,他会通知状态改变通过生命周期的回调函数。这里有几个回调方法需要调用来接收activity改变的状态。由于状态改变系统会创建它,停止它,恢复它,销毁它。每个状态都有相应的回调方法。比如当activity停止时需要释放一些大对象,像网络或数据库的连接,当activity重启是,可以再次加载资源或被中断的操作。这些状态都是activity的生命周期。

创建一个activity

创建一个activity必须要继承Activity类。在子类中实现各个系统调用的函数方法,比如activity被创建,停止,重新启动,销毁。
onCreate:你必须实现这方法。当你创建activity的时候,系统会调用者方法来初始化必要的组件。还有可以调用setContentView()来定义布局。
onPause:当用户离开activity时,系统会调用这个方法,这里经常会保存一些状态,因为有可能用户离开有就不在回来了。

实现用户的界面

用户界面为activity提供了一个分层的view。每个view可以控制一个特定的区域来和用户交互,比如一个view可能是按钮可以有用户点击。
android提供了一些现成的view可以用来设计和组织你的布局。widget也是个屏幕中可见的元素,比如按钮,输入框,单选框,图片。Layout是继承ViewGrop,它提供了一个布局模式,比如线性布局,网格布局,相对布局。你可以继承View和ViewGroup来创建你自己的组件和布局。
最常见的方式是定义一个布局的xml文件保存在应用的资源中。这种方式可以分离出界面和代码。你可以设置布局用setContentView ()。而且你可以创建一个新的View,并在代码中插入一个View到ViewGroup中然后再设置setContentView()。

声明Activity在mainfest.xml中

为了而已让系统识别,你必须声明你的activity在mainfest文件中。
这里有几个属性需要定义,activity的icon,activity的主题,Android:name属性是指定对应的|Activity类。一旦发布就不要修改名字,因为修改会破坏一下原来的功能,比如应用的快捷方式。

使用Intent过滤器

一个<acitiviy>指定不同的意图,用来描述其他的应用怎么样去激活它。
当你创建一个新的应用时会自动创建一个意图过滤器,响应“main”动作和展示在“launcher”分类中,<action>元素指定应用main入口,<category>元素指定这个activity需要在启动页的列表中。
假如你想响应其他的应用隐式的意图,你必须增加<intent-filter>包含<action>元素。

启动一个activity

你可以调用startActivity启动一个activity,通过一个Intent的描述。也可以指定一个外部的activity或者一个action启动。
当你自己的应用可以简单的启动一个已知的activity,可以明确你想要启动的类名。
如果你应用需要执行一些action,想email,短信或者更新状态,在这种情况下你可以没有activity来执行这个动作,这样可以创建一个你想要执行动作的Intent,如果有多个可以让用户选择。

启动一个带结果的activity

你有时也会收到来自你启动activity的结果。在这种情况下,你可以调用startActivityForResult()来启动一个activity。然后接收数据从activity,实现的onActivityResult()。当随后的activity做完以后,他会返回一个Intent到你的onActivityResult()方法里。
第一个条件是判断请求是否成功,然后判断resultCode是否成功,是否请求响应是已知的,这种情况下requestCode和startActivityForResult()的第二个参数一样。到这里返回查询的数据在Intent里。

关闭一个Activity

你可以关闭一个activity调用finish()方法。你可以关闭单独的一个activity可以通过finishActivity()。

管理一个activity一个activity的生命周期对一个应用的强壮和流畅很重要。一个activity也会直接影响其他的activity的task和回退栈。
一个activity本质上有3个状态:
resumed:activity在屏幕的前端和用户的焦点上。(这种状态一般也叫做运行)
paused:另个activity到前端或获取焦点,但是还是可见,这种情况下另一个activity是可见的并且是部分透明或者不是充满整个屏幕的,一个暂停的activity是完全活着的(activity对象会留着内存中,它保留了所有的状态和成员信息,仍然依附在窗口管理器),但是当系统内存低的情况下可能会被杀掉。
stoped:一个activity完全被另个activity覆盖(activity当前在后台),一个停止的activity也是活着的(activity对象会留在内存中,它保留了所有的状态和成员信息,仍然依附在窗口管理器)但是在不对用户可见或者可以在当前其他地方需要内存时被杀掉。
假如一个activity暂停或停止,系统会销毁内存第时调用finish()方法简单的杀死他。当activity重新开始时,它必须被创建。

实现生命周期的回调函数

当一个activity转换不同的状态时,他必须通过不同的回调函数。所有的回调函数可以用一个钩子做适当的状态改变。

public class ExampleActivity extends Activity {
    @Override
    public voidonCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected voidonStart(){
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected voidonResume(){
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected voidonPause(){
        super.onPause();
        // Another activity is taking focus (this activity is about to be"paused").
    }
    @Override
    protected voidonStop(){
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected voidonDestroy(){
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

这些实现的生命周期方法必须调用在其他的操作前,像上面例子中一样。
综上所述,这些方法定义了一个activity的整个生命周期。通过实现这些方法,你可以监视到三个嵌套循环的生命周期。
*整个生命周期,调用onCreate()和调用onDestroy()。你的activity需要执行设置整个全局状态比如定义布局在onCreate释放资源在onDestroy。比如,你的activity有个线程在后台下载数据可以可以在onCreate创建,在onDestroy里停止。
*在整个activity可见的生命周期可以调用onStart和调用onStop。在这个期间用户可以看到activity在屏幕中并可以和他交互。比如调用onStop当一个新的activity启动或者不在可见。在这个两个方法,你需要维持显示给用户活动的资源,比如注册一个BroadcastReceiver在onStart会监控你的ui,并且当用户不可见注销它在onStop中。系统可能调用onStart和onStop多次在整个生命周期的活动中,因为activity交替会隐藏和显示给用户。
*在前端生命周期调用onResume和onPause。在这期间所有的activity在前端并且获取用户的焦点。一个activity可以经常在前端进入和退出过渡。比如当设备进入睡眠状态或者弹出一个对话框调用onPause,因为可以这个状态经常会被调用,代码在这两个方法里需要相当轻量以免过渡时使用户等待。

Method

Description

onCreate()

activity第一次创建会被调用。这里可以执行所有需要设置的,比如,创建视图,绑定数据等等。这个方法会传递一个Bundle对象包含activity以前的状态。接下来调用的是onStart()

    

onRestart()

activity已经停止后被调用,再次开始。接下来调用的是onStart()

onStart()

activity变成可见前调用,接着假如activity到前台调用onResume()或者当隐藏时调用onStop()

    

onResume()

activity开始和用户交互前调用。在这个时候activity是在activity栈的顶端。接下来调用onPause()

onPause()

当系统将要恢复另一个activity时调用。这个方法通常用来提交没有保存的数据,停止动画和其他消耗cpu的事。需要确定做事很快,因为下一个activity直到返回才能恢复启动。接下来,如果是回到前端那就调用onResume(),如果变成对用户不可见那就调用onStop()

onStop()

当一个activity不再对用户可见时调用。这个会发生在当它被销毁,或者因为另一个activity恢复并覆盖了它。接着调用onRestart()如果是回到和用户交互的界面,或者调用onDestroy当离开这个activity

onDestroy()

当在Activity被销毁的时候调用。这个是activity最后调用的方法。它会被调用当activity finish(),或者因为系统暂时销毁这个activity的实例来节省空间,你可以通过isFinishing来区分这两种情况。

列表“killable  after“指系统是否可以杀死进程持有这个的activity在任何时候再方法返回,但是没有执行另外的activity代码。三个方法是yes(onPause,onStop,onDestroy)。因为onPause是三个中第一个一旦创建,onPause是最后的方法保证被执行在进程被杀死前假如系统必须回收内存的时候,然后onStop和onDestroy也许不被调用。因此你必须使用onPause来写入持久数据来存储。但是,你应该选择哪些信息必须保留在onPause中,因为任何阻扰程序这个方法阻止过渡到下个活动和缓慢的用户体验。
方法标记为”no“在killable列保护进程被杀死的时候他们被调用。因此,一个activity是被杀从onPause返回到onResume被调用。他将不再被杀直到onPause再次被调用并返回。
注意:一个activity不是在技术上的”killable“在定义的表一,只有在没有资源的极端情况下会发生被系统杀死。当一个activity被杀死在讨论更多在进程和线程的文档中。

保存activity的状态

在介绍管理activity生命周期时简要的提到了当一个activity暂停或者停止是,该状态会被保留。这个真当在一个activity对象仍然保存在内存中当paused或stopped时时。所有信息相关的成员和当前的状态仍然活着。因此,任何改变用了都在一个activity里都会被保留所有当activity返回前端时,这个些改变还是存在。
但是当系统为了回收内存而销毁一个activity,这个activity对象被销毁,所以系统不能简单的带着状态恢复。因而,系统必须重新创建一个activity对象假如返回到它。然而用户并不知道系统是销毁了它还是创建了它,可能希望activity和大概预计的一样。这种情况下,你可以确定重要的信息需要通过一个额外的方法来保存activity的状态:onstaveInstanceState()。
系统调用onstaveInstanceState()在activity被销毁的时候系统通过这个方法保存值用putString和putInt。然而系统杀掉应用进程返回到你的activity时,系统会重新创建activity并传递bundle到onCreate和onRestoreInstanceState。用这个方法,你可以恢复保存状态。假如没有状态保存,那Bundle传递过来是空的。(第一次创建activity时)

注意:在activity被销毁前,不一定会调用onStavInstanceState(),因为很多情况下,不需要保存状态(比如与当activity返回按钮退回,因为用户很明显的关闭activity)。假如系统调用onSaveInstanceState,他做这些在onStop之前或有可能在onPause之前。
但是即使你不实现onSaveInstanceState。一些activity的状态也会被默认保存在activity类的默认方法onsaveInstanceState中。特别是默认实现的视图信息都会保存起来。机会每个组件都实现这个方法,这样当activity重新创建时会自动保存可见的ui。比如输入框输入的文字,单选框会保存是否被选中。只有在提供一个唯一的id时才会保存它的状态。假如一个组件没有ID,系统不会保存状态。
即使默认的实现了onsaveInstanceState方法保存有用的有关UI,你也许仍然需要重写更多的信息。比如你需要保存成员信息的变化在生命周期中,在相关联的数据存在UI中,但是这些变量没有持有UI的值没有被保存。
因为默认实现的onsaveInstanceState保存保存UI的状态,假如重写这个方法,为了保存附加的状态信息,你需要调用父类的onsaveInstanceState在做任何工作之前。统一的调用父类onRestoreInstanceState,以至于默认的实现可以保存视图的状态。
注意:因为onsaveInstanceState不能担保被调用,你必须用它来记录暂时的数据(比如ui的状态)你不要用来保存持久数据。相反的,你必须调用onPause来保存持久数据在离开activity时。
一个很好的方式测试你的应用程序是否保存状态是屏幕方向的切换。当屏幕方向切换,系统会销毁被重建为了适应新的资源和新的屏幕配置。仅这一点而言这是非常重要的保存状态当它需要重建的时候,因为用户在用的时候会经常选择屏幕。

处理配置更改

一些设备可能会被改变在运行时,比如屏幕方法,键盘是否可用,语言。当这些发生时android会重新创建一个正在运行的activity,系统会调用onDestroy并马上调用onCreate,这个设计可以帮助应用适配新的配置并自动加载资源。
假如你正确的设计了你的activity来处理启动有屏幕变化和恢复activity的状态像上面描述的你应该更加适应在activity的生命周期中。
这最好的方法是执行重启或存储activity的使用onsaveInstanceState和onRestoreInstanceState或者onCreate,正如上节说的。

协调activity

当一个activity启动一个时,他们都会经历生命周期的转换。第一activity暂停并停止(他不会停止,假如它的背景一直可见),当另一耳光activity被创建。在这种情况下存储数据在光盘或其他的地方,重要的是理解第一个activity在第二个activity创建前是没有完全停止的。相反的这个过程启动第一个重叠在关闭的第二个。
生命周期的回调被很好的定义,特别是两个activity在同一耳光进程中,一耳光启动另一个。这个操作顺序当activity A启动activity B。
1.activity A调用onPause。
2.activity B调用onCreate,onStart,和onResume方法(activity B已经成为用户的焦点)
3.然后activity A在屏幕上不可见,它的onStop方法就会执行。
这个是可以预测管理生命周期从一个activity A过渡到activity B就,比如你必须写数据库当一个activity停止以至于可以让接下来的activity可以读取,然后你可以先写入数据库在onpause代替onStop。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值