`
王世伟
  • 浏览: 25789 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Activity生命周期的学习以及Logcat的使用(转载)

 
阅读更多

原创地址:http://android.blog.51cto.com/268543/322518

 

Activities是由Activity stack管理的。当一个新的Activity被启动,它就会处于stack的top位置,成为当前运行的Activity。而前一个Activity依 然保留在stack里面,当需要调用这个Activity时就会回到stack的top位置成为当前运行的Activity。

 
   一个Activity有4个基本状态:
   1. active / running 状态,当Activity处于当前屏幕时;
 
   2. paused 状态,当Activity失去焦点但对用户依然可见时;即是,一个非全屏或者透明的Activity在该Activity的屏幕上面,并成为了当前的焦 点。而paused的Activity依然是alive状态的,它保留着所有的状态和成员信息并连接至窗口管理器,但当系统处于极低内存的情况下,仍然可 以杀死这个Activity。
 
   3. stopped 状态,当Activity完全被另一个Activity覆盖时;它仍然保留所有的状态和成员信息。但它不再被用户可见,所以它的窗口将被隐藏,当其它地方需要内存,则系统经常会杀死这个Activity。
 
   4. 当Activity是paused或者stopped状态时,系统可以通过要求它结束(调用它的finish()方法)或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。
 
   怎么来理解Activity的状态及其生命周期呢?引用网友的解释:
   “由于手机应用的一些特殊性,所以我们需要更多的去关注各个Android Component的运行时生命周期模型。(所谓手机应用的特殊性主要是指这样2点: 1. 手机应用的大多数情况下我们只能在手机上看到一个程序的一个界面 ,用户除了通过程序界面上的功能按钮来在不同的窗体间切换,还可以通过Back键和Home键来返回上一个窗口,而用户使用Back或者Home的时机是 非常不确定的,任何时候用户都可以使用Home或Back来强行切换当前的界面。 2. 往往手机上一些特殊的事件发生也会强制的改变当前用户所处的操作状态,例如无论任何情况,在手机来电时,系统都会优先显示电话接听界面。)了解这些 Component的生命周期模型一方面是让我们对软件在手机中的运行情况做到心中有数,更重要的,对于程序开发来说,生命周期中的每一个关键事件都会有 我们可以覆写于各种Component对应基类型的事件处理方法,了解各Component的生命周期就是让我们在开发程序时明白我们该怎样去编写各种事 件的处理代码。”
 
   “由于前面已经说到的手机应用的特殊性,一个Activity很可能被强制交换到后台 (交换到后台就是指该窗体不再对用户 可见,但实际上又还是存在于某个Task中的,比如一个新的Activity压入了当前的Task从而“遮盖”住了当前的Activity,或者用户按了 Home键回到桌面,又或者其他重要事件发生导致新的Activity出现在当前Activity之上,比如来电界面),而如果此后用户在一段时间内没有重新查看该窗体 (Android 通过长按Home键可以选择最近运行的6个程序,或者用户直接再次点击程序的运行图标,如果窗体所在的Task和进程没有被系统销毁,则不用重新加载 Process, Task和Task中的Activity, 直接重新显示Task顶部的Activity, 这就称之为重新查看某个程序的窗体),该窗体连同其所在的Task和Process则可能已经被系统自动销毁了,此时如果再次查看该窗体,则要重新执行 onCreate事件初始化窗体。而这个时候我们可能希望用户继续上次打开该窗体时的操作状态进行操作,而不是一切从头开始。例如用户在编辑短信时突然来 电,接完电话后用户又去做了一些其他的事情,比如保存来电号码到联系人,而没有立即回到短信编辑界面,导致了短信编辑界面被销毁,当用户重新进入短信程序 时他可能希望继续上次的编辑。这种情况我们就可以覆写Activity的void onSaveInstanceState(Bundle outState)事件,通过向outState中写入一些我们需要在窗体销毁前保存的状态或信息,这样在窗体重新执行onCreate的时候,则会通过 savedInstanceState将之前保存的信息传递进来,此时我们就可以有选择的利用这些信息来初始化窗体,而不是一切从头开始。”
 
   下面官方提供的这幅图,描述了Activity生命周期的整个过程:

activity_lifecycle

    可以看到,以上有3个关键的生命周期循环:
   1. 一个activity 完整的生命周期 自第一次调用 onCreate(Bundle)开始,直至调用onDestroy()为止。activity在onCreate()中设置所有"全局"状态以完成初始 化,而在onDestroy()中释放所有系统资源。比如说,如果activity有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。
 
   2. 一个activity的 可视生命周期 自 onStart() 调用开始直到相应的 onStop()调用。在此期间,用户可以在屏幕上看到此activity,尽管它也许并不是位于前台或者正在与用户做交互。在这两个方法中,你可以管控 用来向用户显示这个activity的资源。比如说,你可以在onStart() 中注册一个BroadcastReceiver 来监控会影响到你UI的改变,而在onStop() 中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

   3. 一个activity的 前台生命周期 自 onResume() 调用起,至相应的 onPause()调用为止。在此期间,activity位于前台最上面并与用户进行交互。activity会经常在暂停和恢复之间进行状态转换──比如 说当设备转入休眠状态或有新的activity启动时,将调用onPause() 方法。当activity获得结果或者接收到新的intent的时候会调用onResume() 方法。因此,在这两个方法中的代码应当是轻量级的。
 
   当一个activity从这个状态转变到另一个状态时,它被以下列protected方法所通知:
     
    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(); 
    } 
 

 
   要注意的是,onPause(),onStop(),onDestory()这3个方法是可以被系统直接kill的,当系统内存不足的时候。而 平常从一个activity转向/回到另一个activity时,当新activity是full screen(弹出窗口,例如AlertDialog是不算的)的时候就会call 前一个activity的onPause(),然后call onStop(),而无论onPause或者onStop,都有可能被kill,所以一般在onPause就会执行savedata操作将所有持久性数据 (比如用户的编辑结果)写入存储之中。
 
   现在我们来看看两个activity在同一个进程内的调用情况:
   1. 调用当前activity的 onPause() 方法。
   2. 接着调用新启动activity的onCreate()、 onStart()和onResume()方法。
   3. 然后,如果启动的activity不再于屏幕上可见,则调用它的onStop()方法。
 
  以下我使用Logcat记录下来的Activity调用过程中的方法调用顺序:
  1. 点击按钮去启动 Activity1,就会看到
  
    05-08 09:39:48.389: DEBUG/Activity1(313): onCreate   Activity 1 
    05-08 09:39:48.399: DEBUG/Activity1(313): onStart    Activity 1 
    05-08 09:39:48.399: DEBUG/Activity1(313): onResume   Activity 1 
 
 
  2. 点击back返回键后
 
    05-08 09:40:04.129: DEBUG/Activity1(313): onPause    Activity 1 
    05-08 09:40:04.628: DEBUG/Activity1(313): onStop     Activity 1 
    05-08 09:40:04.659: DEBUG/Activity1(313): onDestory  Activity 1 
 
  
   退出当前Activity时,onPause -> onStop -> onDestory
 
  3. 再次启动Activity
    05-08 09:40:18.249: DEBUG/Activity1(313): onCreate   Activity 1 
    05-08 09:40:18.249: DEBUG/Activity1(313): onStart    Activity 1 
    05-08 09:40:18.259: DEBUG/Activity1(313): onResume   Activity 1 
 
  和一般启动的顺序是一样的
 
  4. 从Activity1启动Acitivity2
    05-08 09:40:25.477: DEBUG/Activity1(313): onPause    Activity 1 
    05-08 09:40:25.687: DEBUG/Activity2(313): onCreate   Activity 2 
    05-08 09:40:25.687: DEBUG/Activity2(313): onStart    Activity 2 
    05-08 09:40:25.719: DEBUG/Activity2(313): onResume   Activity 2 
    05-08 09:40:26.277: DEBUG/Activity1(313): onStop     Activity 1 
 
   Activity1.onPause -> Activity2.onCreate -> Activity2.onStart -> Activity2.onResume ->Activity1.onStop
 
  5. 点击Home键回到桌面
    05-08 09:40:31.777: DEBUG/Activity2(313): onPause    Activity 2 
    05-08 09:40:32.658: DEBUG/Activity2(313): onStop     Activity 2 
 
  Activity2.onPause - > Activity2.onStop
 
  6. 回到原来的程序
    05-08 09:40:50.429: INFO/ActivityManager(58): Starting activity: Intent ... 
    05-08 09:40:50.649: DEBUG/Activity2(313): onRestart  Activity 2 
    05-08 09:40:50.649: DEBUG/Activity2(313): onStart    Activity 2 
    05-08 09:40:50.769: DEBUG/Activity2(313): onResume   Activity 2 
 
  Activity2.onRestart -> Activity2.onStart -> Activity2.onResume
 
  7. 点击comfirm, setResult(RESULT_OK),Activity2.finish(),返回到Activity1
    05-08 09:41:04.928: DEBUG/Activity2(313): onPause    Activity 2 
    05-08 09:41:04.988: DEBUG/Activity1(313): onRestart  Activity 1 
    05-08 09:41:04.998: DEBUG/Activity1(313): onStart    Activity 1 
    05-08 09:41:04.998: DEBUG/Activity1(313): onResume   Activity 1 
    05-08 09:41:05.419: DEBUG/Activity2(313): onStop     Activity 2 
    05-08 09:41:05.469: DEBUG/Activity2(313): onDestory  Activity 2 
 
  Activity2.onPause - > Activity1.onRestart - > Activity1.onStart - > Activity1.onResume - > Activity2.onStop
 
   8. 点击back返回键后
    05-08 09:41:51.868: DEBUG/Activity1(313): onPause    Activity 1 
    05-08 09:41:52.428: DEBUG/Activity1(313): onStop     Activity 1 
    05-08 09:41:52.468: DEBUG/Activity1(313): onDestory  Activity 1 
 
  Activity1 退出:onPause -> onStop -> onDestory
 

保存activity状态

   保存activity状态,是为了方便用户重新打开程序时,能够回到上次离开时的状态。这里面涉及到的方法有:
   protected void onSaveInstanceState (Bundle outState)
   protected void onRestoreInstanceState (Bundle savedInstanceState)
   当一个Activity被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息,它会将一个以名称-值对方式记录了activity动态状态的Bundle 对 象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的 onRestoreInstanceState()。这两个方法的内容一般是把要临时保存的数据放到Bundle里面,或者从里面拿出来。
   要注意的是,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说,Android会在activity易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK键)造成的销毁则不调用。在这种情况下,用户没打算再次回到这个 activity,所以没有保存状态的必要。因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一 些临时的状态,而不能用来保存持久性数据。而是应该用onPause()来达到这个目的:�在onPause()里面调用自定义命名的函数saveState(),在saveState里面保存数据到数据库。
 

Logcat的使用

1. import android.util.Log;
2. private static final String TAG = "Activity1"; 设置TAG
3. Log.d(TAG, message);  log记录信息
    其中Log.v() : VERBOSE
         Log.d() :  DEBUG
         Log.i() :   INFO
         Log.w() : WARN
         Log.e() : ERROR
     以上log的级别依次升高,Debug信息应当只存在于开发中,INFO、 WARN、ERROR这3种log将出现在发布版本中。
4. 在Eclipse查看Log:
     在菜单Window-> Show View选择other,在弹出的窗口中选择Android里面的LogCat,ok,就会看到LogCat窗口,在Filter那里可以输入过滤的词 语,一般是输入TAG的内容,这样子可以直接看到有关这个TAG的Log。
分享到:
评论

相关推荐

    Activity生命周期分析

    这是Activity生命周期中的活跃状态。 - `onPause()`:当Activity即将被另一个Activity覆盖,但仍然部分可见时,系统调用`onPause()`。在此方法中,你应该保存临时数据,但不应执行耗时操作,因为它会影响新Activity...

    Android学习3——Activity生命周期

    在“Android学习3——Activity生命周期”这个主题中,我们将深入探讨Activity如何启动、运行、暂停、停止以及销毁,并了解每个状态之间的转换。 Activity生命周期主要包括以下几个关键状态: 1. **初始状态...

    android Activity生命周期

    一、Activity生命周期概述 Activity的生命周期由创建、启动、运行、暂停、停止和销毁这6个状态构成。每个状态的变化都会触发特定的方法回调,开发者可以重写这些方法以执行相应的操作。 1. 创建(Creation): - `...

    安卓Activity生命周期MyLifeDemo

    这个名为"安卓Activity生命周期MyLifeDemo"的项目旨在帮助开发者深入理解Activity的生命周期及其管理方式。通过这个Demo,我们可以直观地看到Activity在不同状态之间的转换,并了解每个状态的意义以及如何在这些状态...

    日志跟踪Activity生命周期

    在博客“日志跟踪Activity生命周期”中,作者可能详细介绍了如何利用Android的日志系统(Logcat)来追踪这些生命周期回调。开发者可以通过在每个生命周期方法内添加`Log.d()`或`Log.i()`等方法来记录信息,例如: `...

    对安卓activity生命周期的理解

    在Android应用开发中,Activity是用户界面的主要组件,它负责展示屏幕上的交互元素,并处理用户的输入事件。...因此,对Android Activity生命周期的深入学习和实践是每个Android开发者的基础技能之一。

    实验一 第一个Android程序和Activity生命周期.zip

    实验一 第一个Android程序和Activity生命周期。实验要求: 1.用工程向导生成第一个Android程序,并在模拟器上运行 注意在新建应用的选择SDK版本时选API 18 2.熟悉Android应用程序的基本文件结构 3.了解使用开发环境...

    android activity的生命周期小例子

    在这个“android activity的生命周期小例子”中,我们将探讨Activity在不同场景下如何启动、暂停、恢复和终止,以及如何在后台打印Activity的调用方法。 Activity的生命周期主要由以下几个关键方法组成: 1. `...

    Android开发 - Activity生命周期

    Activity生命周期主要涉及以下几个关键状态: 1. **创建(Created)**:当Activity首次被创建时,会调用`onCreate()`方法。在这里,开发者通常初始化UI和设置基本的配置。 2. **启动(Started)**:`onStart()`方法...

    2-1(Activity生命周期).zip

    本资源“2-1 (Activity生命周期).zip”可能包含一个名为"MyFirstProject"的示例项目,旨在详细讲解Activity的各个生命周期状态及其转换。 Activity的生命周期分为以下几个主要阶段: 1. **创建(Created)**:当...

    动手学Android之七——Activity生命周期

    "动手学Android之七——Activity生命周期"这个主题深入探讨了Activity如何在应用程序中创建、运行、暂停、停止以及销毁的过程,这对于理解和优化应用性能至关重要。在这个例子程序中,开发者将有机会实践这些生命...

    两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)

    这是Activity生命周期中的活动状态。 4. **onPause()**:当Activity被部分或完全覆盖,但仍可见(例如弹出一个透明对话框)时调用。在此阶段,应保存临时数据,但不应进行耗时操作,因为这会影响用户体验。 5. **...

    两分钟让你明白Android_Activity生命周期

    通过创建一个简单的Demo,观察LogCat中的日志输出,可以更直观地了解Activity生命周期的每个步骤。在实践中,开发者需要根据具体应用需求,合理利用这些回调方法来优化用户体验,比如在适当的时候保存用户数据,释放...

    2-1(Activity生命周期).7z

    总之,这个"2-1(Activity生命周期).7z"文件是学习和理解Android Activity生命周期的重要资源,通过运行和分析这个示例,开发者可以更好地掌握如何在Activity的不同生命周期阶段进行有效的编程,从而创建更加稳定和...

    Android_Activity生命周期详解(图文)

    ### Android Activity 生命周期详解 #### 一、概述 在Android开发中,`Activity`是四大组件之一,用于构建用户界面,并负责与用户的交互。一个`Activity`通常对应着一个屏幕,当用户在一个应用的不同屏幕间导航时...

    Android应用开发-Activity生命周期.pptx

    例如,你可以创建一个过滤器,只显示与你的Activity生命周期方法相关的信息,便于跟踪Activity的状态变化。 总的来说,理解并熟练掌握Activity的生命周期和LogCat的使用是Android应用开发的基础,对于构建稳定、...

    Activity的生命周期

    7. **onDestroy()**: 这是Activity生命周期中的最后一个方法,表示Activity将被彻底销毁。可以在此清理所有资源,释放内存占用。 在Android Studio中,我们可以通过在Activity的生命周期方法内添加`Log.i()`语句来...

    AndroidActivity生命周期(图文)![归纳].pdf

    这是Activity生命周期中的活动状态。 4. **onPause()**:当Activity失去焦点但仍然部分可见(例如,弹出一个透明或半透明的对话框)时调用。在这个阶段,你应该保存非持久性数据并停止耗时操作。 5. **onStop()**...

    同时启动两个Activity测试

    在描述中提到的“activity生命周期”,当Activity启动和销毁时,它会经历一系列的生命周期回调方法,例如onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等。当同时启动两个Activity时,第一...

    acitvity生命周期方法调用顺序与测试日志

    在实际开发中,了解和掌握Activity生命周期可以帮助我们优化应用性能,避免内存泄漏,正确处理用户交互,以及在配置改变(如屏幕旋转)时适当地保存和恢复数据。测试日志是确保这些操作正确执行的有效手段,通过对...

Global site tag (gtag.js) - Google Analytics