如有想学好android的可以加我QQ77993937

--详解Android的Activity组件(上)

在上两篇幅中,对要学android的同学做了一些Java基础说明的铺垫,以及一些基础行业概念的铺垫,今天这篇想和大家探讨和分享下关于学习android知识体系的一些建议。其实学习android和学习其他编程语言是无异的。这一篇幅中,我们来详解一下一开始就会接触的一个控件Activity。先分下面三个部分来述说:
第一部分:关于Activity的状态
Android的设计架构者,借鉴了Java很多的一些设计特色,和J2ME的MIDlet一样,在android中,Activity的生命周期交给系统统一管理。与MIDlet不同的是安装在android中的所有的Activity都是平等的。
在android中,Activity拥有四种基本状态:

  1. Active/Runing一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
  2. Paused当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
  3. Stoped当Activity被另外一个Activity覆盖、失去焦点并不可见时处于Stoped状态。
  4. KilledActivity被系统杀死回收或者没有被启动时处于Killed状态。

当一个Activity实例被Create、Destory或者Start另外一个Activity时,其将在这四种状态之间进行转换,这种转换的发生根据用户的程序操作。下图说明了Activity在不同状态间转换的具体情形:

如上所示,Android程序员可以决定一个Activity的“生”,但不能决定它的“死”,也就时说程序员可以启动一个Activity,但是却不能手动的“结束”一个Activity。即使你调用Activity.finish()方法时,结果和用户按下BACK键一样:告诉ActivityManager该Activity实例完成了相应的工作,可以被“回收”。其实这一点,学过Java的同学其实都可以发现,其回收机制和JVM的很类似的。【PS:也难怪现在每年Oracle公司总是要来一次起诉下Google了】。随后ActivityManager激活处于栈第二层的Activity并重新入栈,同时原Activity被压入到栈的第二层,从Active状态转到Paused状态。例如:从ActivityA中启动了ActivityB,则当前处于栈顶端的是Activity2,第二层是ActivityA,当我们调用ActivityB.finish()方法时,ActivityManager重新激活ActivityA并入栈,ActivityB从Active状态转换Stoped状态,ActivityA.onActivityResult(intrequestCode,intresultCode,Intentdata)方法被执行,ActivityB返回的数据通过data参数返回给ActivityA。

第二部分:关于Activity的内存栈的概念
学过数据结构的同学,都听说过栈的概念,而在第一部分讲Activity的状态生命周期时,我们也已经提到这个词语“栈”,而Android是通过一种Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置。处于前台的Activity总是在栈的顶端,当前台的Activity因为异常或其它原因被销毁时,处于栈第二层的Activity将被激活,上浮到栈顶。当新的Activity启动入栈时,原Activity会被压入到栈的第二层。一个Activity在栈中的位置变化反映了它在不同状态间的转换。Activity的状态与它在栈中的位置关系如下图所示:

如上所示,除了最顶层的Activity外,其它的Activity都有可能在系统内存不足时被回收,一个Activity的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中Activity的实例,它根据Activity所处的状态来改变其在栈中的位置。其实在特别的时候,也有可能最顶层的Activity一样可能被干掉,根据操作系统的情况而言。所以大家也要知道,为什么我们在写Activity的时候,要注意实时记得保存下状态数据,因为Activity被干掉不是由我们来控制的。

第三部分:关于Activity的生命周期
在android.app.Activity类中,Android定义了一系列与生命周期相关的方法,在我们自己的Activity中,只是根据需要复写需要的方法,Java的多态性会保证我们自己的方法被虚拟机调用,这一点与J2ME中的MIDlet类似。

publicclassOurActivityextendsActivity{
protectedvoidonCreate(BundlesavedInstanceState);
protectedvoidonStart();
protectedvoidonResume();
protectedvoidonPause();
protectedvoidonStop();
protectedvoidonDestroy();
}

这些方法的说明如下:

  1. protectedvoidonCreate(BundlesavedInstanceState)一个Activity的实例被启动时调用的第一个方法。一般情况下,我们都覆盖该方法作为应用程序的一个入口点,在这里做一些初始化数据、设置用户界面等工作。大多数情况下,我们都要在这里从xml中加载设计好的用户界面。例如:setContentView(R.layout.main);当然,也可从savedInstanceState中读我们保存到存储设备中的数据,但是需要判断savedInstanceState是否为null,因为Activity第一次启动时并没有数据被存贮在设备中:

if(savedInstanceState!=null){
savedInstanceState.get("Key");
}

  1. protectedvoidonStart()该方法在onCreate()方法之后被调用,或者在Activity从Stop状态转换为Active状态时被调用。
  2. protectedvoidonResume()在Activity从Pause状态转换到Active状态时被调用。
  3. protectedvoidonPause()在Activity从Active状态转换到Pause状态时被调用。
  4. protectedvoidonStop()在Activity从Active状态转换到Stop状态时被调用。一般我们在这里保存Activity的状态信息。
  5. protectedvoidonDestroy()在Active被结束时调用,它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作。

此外,Android还定义了一些不常用的与生命周期相关的方法可用:

protectedvoidonPostCreate(BundlesavedInstanceState);
protectedvoidonRestart();如有想学好android的可以加我QQ77993937
protectedvoidonPostResume();

Android提供的文档详细的说明了它们的调用规则。所以我们需要还要掌握一项技能:认真阅读并能读懂API文档。

更多相关文章

  1. Android(安卓)应用性能调试
  2. activity中onSaveInstanceState方法调用时机详解
  3. androidTV 9.0 开发调用系统jar异常报错,jar引用已导入还是报错,分
  4. Activity启动过程分析
  5. android UI线程安全问题
  6. Android(安卓)EditText默认不弹出输入法的实现方法
  7. Android(安卓)SharedPreferences 实现原理
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 关于android receiver
  2. Android(安卓)permission第三方rxpermiss
  3. Android(安卓)Preferencescreen用法
  4. Android 解屏幕锁与点亮屏幕
  5. Android启动页的全屏处理方案
  6. Android在Context详细解释 ---- 你不知道
  7. [置顶] Android(安卓)菜单:OptionMenu 介
  8. android studio生成jar包
  9. android中Acticity之间的跳转
  10. Android 定时重启Android系统源(手机root