android的activity详解

由于开发的需要,要对activity有所了解,现在介绍一下android的activity。首先看一下Android的docs中提供的activity的时间触发图。


四大状态 :

如上所示,Android 程序员可以决定一个 Activity 的“生”,但不能决定它的“死”,也就时说程序员可以启动一个 Activity,但是却不能手动的“结束”一个 Activity。当你调用Activity.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity 并重新入栈,同时原 Activity 被压入到栈的第二层,从 Active 状态转到 Paused 状态。例如:从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,第二层是 Activity1,当我们调用Activity2.finish()方法时,Activity Manager 重新激活 Activity1 并入栈,Activity2 从 Active 状态转换 Stoped 状态,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被执行,Activity2 返回的数据通过data参数返回给 Activity1。


Active:已由用户启动,正在前台运行。 
  Paused:已由用户启动,正在运行且可视,但是由于提示或者其他覆盖部分的屏幕。这是用户可以看到activity,但不能与activity进行互动。例如有来电,给出接听或者拒绝的选择。 
  Stopped:已由用户启动,正在运行,但是由于其他activity而被隐藏,无法向用户直接呈现有效的信息,但是可以通过notification进行通信。 
  Dead:activity没有启动或者终结,例如为了释放紧缺的内存空间。


Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:

view plaincopy to clipboardprint?
    public class Activity extends ApplicationContext {
    protected void onCreate(Bundle savedInstanceState);
    protected void onStart();
    protected void onRestart();
    protected void onResume();
    protected void onPause();
    protected void onStop();
    protected void onDestroy();
}

这些方法的说明如下:

protected void onCreate(Bundle savedInstanceState)一个 Activity 的实例被启动时调用的第一个方法。一般情况下,我们都覆盖该方法作为应用程序的一个入口点,在这里做一些初始化数据、设置用户界面等工作。大多数情况下,我们都要在这里从 xml 中加载设计好的用户界面。例如:

setContentView(R.layout.main); 

当然,也可从 savedInstanceState中读我们保存到存储设备中的数据,但是需要判断 savedInstanceState是否为 null,因为 Activity 第一次启动时并没有数据被存贮在设备中:
 if(savedInstanceState!=null){ 
    savedInstanceState.get("Key"); 
 }


protected void onStart()该方法在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用。

protected void onResume()在 Activity 从 Pause 状态转换到 Active 状态时被调用。

protected void onResume()在 Activity 从 Active 状态转换到 Pause 状态时被调用。

protected void onStop()在 Activity 从 Active 状态转换到 Stop 状态时被调用。一般我们在这里保存 Activity 的状态信息。

protected void onDestroy()在 Active 被结束时调用,它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作。


这写方法的调用时机:

activity中的重写方法:

onCreate(Bundle),在以前我们经常在onCreate()中加载XML的布局文件。在onCreate()中,对UI进行初始化,并完成其他初始化(只需的处理一次,例如绑定某些监听器)。onCreate()在下面三种情况中会被调用:
  
  1.Activity首次启动,也就是自系统加电后第一次启动,Bundle参数为null
  2.如果Acivity曾运行,并后来被killed掉,在调用时参数是onSaveInstanceState()的Bundle。
  3.Activity已经运行,但因为不同设备的状态需要不同的资源,例如竖屏改为横屏,acivity将会re-create,而onCreate()会被调用
  onDestroy():在activity生命周期的最后,即关闭时被调用,可以是通过finish()由activity主动关闭,也可能是因为系统需要内存而被动关闭。注意如果RAM紧缺的时候,可能onDestroy()不会被调用,但acvitiy仍会被关闭。在onDestroy()中对onCreate()中获得的资源进行释放。
  
  onStart(),onRestart()和onStop()
  
  onStart()一个activity第一次被调用时,将在前台呈现UI时或者被隐藏后重新在前台呈现时调用,即当用户可以看见或者重新看见activity时调用。
  
  onReStart()在一个activity被stop后重启时调用。
  
  onStop()就是在activity的状态变为stopped状态时调用。
  
  onPause()和onResume()
  
  onResume()在activity成为前台程序时调用,也就是用户可和activity互动时调用。当activity初次调用,或者从一个stopped状态中恢复,先是UI可视-onStart(),然后UI可互动-onResume()。当一个pop-up对话框(例如一个来电,将导致acivity进入Paused状态)消除的情况会触发onResume(),因为Paused的状态中UI是可视,只是被覆盖而无效,因此不会有UI可视-onStart()调用,只有UI可互动-onResume()调用。在onResume()中可进行UI的刷新。
  
  任何使得用户不在关注你的Activity,例如其他activity启动,onPause()被调用,在这里我们可以undo在onResume中do的,停止后台进程,释放原来占用的资源(例如摄像头),一旦onPause()被调用后,当acivity被系统killed的时候,不会收到事件提醒,即不会触发onDestory()。


一个activity的执行场景:

1、运行一个activity:

先后执行的重写函数:onCreate()->onStart()->onResume三个方法.

2、BACK键:

当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法。

3、HOME键:  当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,

而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法。

4、当按HOME键进入后台后,再次运行时:先后分别执行了onRestart()->onStart()->onResume()三个方法


在看一个场景例子
  
  我们通过考察activity中调起令一个activity的情况来看看activity的状态变化事件。
  
  场景1:如果我们在一个activity(activity1)中通过intent启动另一个activity(activity2),那么触发的过程是:
  
  activity1-onPause()->activity2-onCreate()->activity2-onStart()->activity2-onResume()->activity1-onStop()
  
  activity1:失去了用户的焦点,无法和用户进行互动,被activity2覆盖,调用了onPause(),然后是activity2的启动调用过程,通常activity2不是覆盖部分,而且完全占据屏幕,由此activity1被隐藏,activity1进入了Stopped状态,调用activity1-onStop()。如果acvity2已对话框的方式,而不是全屏幕,即activity1不会并因此,仍然保留在Paused状态,则不会触发activity1-onStop()。
  
  activity2:对于一个activity的启动顺序为初始化onCreate()->用户可视onStart()->用户可互动(获得焦点)onResume()
  
  场景2:我们按菜单的返回键,从activity2退出,并恢复为activity1
  
  activity2-onPause()->activity1-onRestart()->activity1-onStart()->activity1-onResume()->activity2-onStop()->activity2-onDestory()
  
  activity1:在场景1中进入Stopped状态,重新恢复,进入onRestart()状态,UI可视onStart(),获得焦点用户可互动onResume()
  
  activity2:按返回键,acivity将被注销,根据android给出来的图,依次进行onPause()失去焦点不可互动->onStop()不可视->onDestory()被关闭。
  
  在mars-android的视频教学中通过一个activity的stack,成为task来解释这种依次调起activity的情形。但是在我下载的更新的reference中,在相应的html中已经删除了相关的内容。但在另外的文档中找到Task的描述。当用户从一个activity跳到一个activity,可以是不同的app,Android系统记录activity的线程导航历史,这就是activitystack,也称为backstack。当前屏幕最前面的UI就是stack最上面的一个activity,当这个activity调起一个新的activity时,这个activity-new将加入这个stack,作为stack最上面的元素,当用户按下BACK键时,将最上面也就是当前UI显示的activity-new从stack中拿走,并删除这个activity-new(进入Deaded状态)。这样可以很好地理解Android处理按下BACK键的情况,这些activity是按一定顺序,不可改变(当然如果我们使用finish()可以删除其中某个acitivity,从stack中去除),处理方式是stack的先进后出。
  
  
  数据保存
  
  Android可能会因为内存的缘故踢走你的activiy,activiy会保存一些状态,利用这我们可以保存一些我们所需的数据。保存数据的方式为onSaveInstanceState(),要注意,由于activity会频繁地执行之,所以一定要保证高效,只将我们的data存放如Bundle。获取数据有两个途径,一是onCreate(Bundle)中的参数携带该data,二是在onRestoreInstanceState()。我们可以选择所需的数据,这个数据甚至可以是一个callback。


activity完全覆盖原activity,原activity进入Stopped状态,另一种情况是部分覆盖,使原来的activity进入Paused状态,而不是Stopped。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值