zoukankan      html  css  js  c++  java
  • android.app.Activity 的介绍

    发现当前Android的资料不是非常多,并且对于Activity的介绍也非常少。所以把官方文档的android.app.Activity的介绍翻译了一下,增加了一些自己的理解。各位假设认为我自己理解的不正确,请无视。欢迎邮件讨论。

    android.app 
    public class

    android.app.Activity

    java.lang.Object

    android.content.Context

    android.app.ApplicationContext    ViewInflate.Factory

    android.app.Activity      KeyEvent.Callback Window.Callback

    Activity 是用户唯一能够看得到的东西。差点儿全部的activity都与用户进行交互。所以Activity主要负责的就是创建显示窗体,你能够在这些窗体里使用setContentView(View)来显示你自己的UI。

    activity展如今用户面前的常常是全屏窗体,你也能够将activity作为浮动窗体来使用(使用设置了windowIsFloating的主题),或者嵌入到其它的activity(使用ActivityGroup)中。以下是两个差点儿全部Activity的子类都实现了的方法。

    onCreate(Bundle) 这种方法是初始化 activity的地方. 最重要的是。你常常须要在这里使用setContentView(int) 来设置UI布局所使用的layout资源, 当你须要使用程序控制UI中的组件时能够使用 findViewById(int) 来获得相应的视图。

    当用户离开activity时你能够在onPause() 进行对应的操作. 更重要的是。用户做的不论什么改变都应该在该点上提交 (常常提交到ContentProvider 这里保存数据)。

    假设要使用 Context.startActivity()来启动activity, activity都必须在启动者应用包的AndroidManifest.xml文件里有相应的 <activity> 定义。

    Activity类是 application's overall lifecycle 的一个重要部分。

    这里涉及到的主题:

    1. Activity 生命周期
    2. 配置改变
    3. 启动Activity并获得结果
    4. 保存持久状态
    5. 许可
    6. 进程生命周期

    Activity 生命周期

    系统中的Activity能够通过一个activity栈来进行管理。当一个新的activity启动的时候,它首先会被放置在activity栈顶部并成为running状态的activity —— 之前的activity也在activity栈中。但总是被保存在它的下边,仅仅有当这个新的activity退出以后之前的activity才干又一次回到前景界面。

    全部的activity本质上有四种状态:

    • activity在屏幕的前景中(activity栈的顶端)。它是active或者running状态。
    • activity失去了焦点可是仍然可见(这个activity顶上遮挡了一个透明的或者非全屏的activity),它的状态是paused。

      一个paused状态的activity全然是alive的(它维护自己全部的状态和成员信息,并且仍然在window manager的管理中),但当系统内存极度贫乏时也会将其killed。

    • activity因为其它的activity而全然变暗,它就进入了stopped状态。它仍然保持着全部的状态和成员的信息,但是,他对于用户来说不可见,当别的地方须要内存的时候它常常会被killed。

    • activity是paused或者stopped。系统须要将其清理出内存的时能够命令其finish或者简单kill其进程。当它又一次在用户面前显示的时候,它必须全然又一次启动而且将其关闭之前的状态所有恢复回来。

    以下的图表是Activity的状态图。直角矩形代表了callback方法。你能够实现这些方法从而使Activity在改变状态的时候运行你制定的操作。带颜色的椭圆形是Activity的主要状态。

     这里有三个比較关键的生命周期。

    • 从最初调用onCreate(Bundle)到终于调用onDestroy()称为完整生命周期。Activity会在onCreate()进行全部“全局”状态的设置。在onDestroy()中释放全部持有的资源。

      举个样例。假设它有一个从网络上下载数据的后台线程,那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。

    • 从activity调用onStart()開始。到调用相应的onStop()为止称为可见生命周期。在这段时间内用户能够在屏幕上看到这个activity,虽然并不一定是在前景也不一定能够和用户交互。在这两个方法之间你能够维护那些activity在用户显示时所需的资源。举个样例来说,你能够在onStart()中注冊一个IntentReceiver来监控那些能够对你的UI产生影响的环境改变。当你的UI不继续在用户面前显示时你能够在onStop()中注销这个IntentReceiver

      每当activity在用户面前显示或者隐藏时都会调用相应的方法,所以onStart()和onStop()方法在整个生命周期中能够多次被调用。

    • 从activity调用onResume()開始,到调用相应的onPause()为止称为前景生命周期。这段时间activity处于其它全部activity的前面,且与用户交互。一个activity能够常常在resumed和paused状态之间转换——比如手机进入休眠时、activity的结果返回时、新的intent到来时——所以这两个方法中的代码应该很的简短。

    以下的Activity方法定义了activity完整的生命周期。他们全都是hook方法,你能够重载这些方法从而使activity在状态改变时运行你所期望的操作。

    全部activity都应该实现自己的onCreate(Bundle)方法来进行初始化设置。大部分还应该实现onPause()方法提交数据的改动而且准备终止与用户的交互。虽然我们计划在系统中加入很多其它的工具来管理应用,如今大多activity仍须要实现onFreeze()而且在onCreate(Bundle)中运行相应的状态恢复。其它的方法能够在须要时进行实现,当实现这些方法的时候须要注意的是一定要调用父类中的相应方法。

    Java代码 
    1. <span style="font-size: small;">public class Activity extends ApplicationContext {  
    2.      protected void onCreate(Bundle icicle);  
    3.      protected void onStart();  
    4.      protected void onRestart();  
    5.      protected void onResume();  
    6.      protected void onFreeze(Bundle outIcicle);  
    7.      protected void onPause();  
    8.      protected void onStop();  
    9.      protected void onDestroy();  
    10.  }   
    11.   
    12.    
    13. </span>  
    一般来说activity的生命周期变化看起来比較象以下的表格:

    (此处译者进行了大块的改动。请參考原文阅读以下表格)


    方法

    描写叙述

    Killable?

    下一方法

    onCreate()

    Activity初次创建时被调用,你应该在这里进行一般的静态设置:创建view、将数据绑定到list等等。假设activity之前存在冻结状态,那么此状态将在Bundle中提供。

    假设activity首次创建,本方法后将会调用onStart(),假设activity是停止后又一次显示。则将调用onRestart()。

    No

    onStart() or onRestart()

     

    onStart()

    当activity对用户即将可见的时候调用。

    其后调用onRestart()或onResume()(框架是否进行选择性调用onResume()不过推測)

    No

    onRestart() or onResume()

    onRestart()

    当activity从停止状态又一次启动时调用。其后调用onResume()。

    No

    onResume()

     

    onResume()

    当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经能够传递给它。

    假设其它的activity在它的上方恢复显示,则将调用onFreeze()。

    No

    onFreeze()

    onFreeze()

    当你的activity被暂停而其它的activity恢复与用户交互的时候这种方法会被调用(在其它activity显示之前),你能够使用这种方法保存你当前的用户状态(一般来说是当前实例的用户状态)。暂停之后。为了回收资源供给前景activity,系统会在须要的时间停止(或者kill)你的应用。

    以后假设你的activity启动一个新的实例又一次与用户进行交互,你保存在这里的状态都将通过onCreate()方法传递给新的实例。

    其后总是调用onPause()方法。

    No

    onPause()

    onPause()

    当系统要启动一个其它的activity时调用(其它的activity显示之前),这种方法被用来提交那些持久数据的改变、停止动画、和其它占用CPU资源的东西。

    因为下一个activity在这种方法返回之前不会resumed。所以实现这种方法时代码运行要尽可能快。

    假设activity又一次回到前景时将调用onResume()。 假设对用户彻底不可见则会调用onStop()。

    Yes

    onResume() or
    onStop()

    onStop()

    当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其他activity被切换至前景、当前activity被销毁时都会发生这样的场景。

    当activity又一次回到前景与用户交互时调用onRestart(),假设activity将退出则调用onDestory()。

    Yes

    onStart() or
    onDestroy()

    onDestroy()

    在你的activity被销毁前所调用的最后一个方法,当进程终止时会出现这样的情况(对activity直接调用finish()方法或者系统为了节省空间而暂时销毁此activity的实例,你能够通过isFinishing()的返回值来区分这两种情况)。

    Yes

    nothing


    ①: 这个表格本人认为还有些值得商榷的地方,建议作为參考阅读,无论是原文还是译文。

     

    注意上表中“Killable”这一列 —— 对于那些标记killable的方法,当这些方法结束后,activity的进程可能在不论什么时间被系统kill而不再运行activity中的不论什么代码。因此你应该利用onFreeze()(保存你当前UI的状态)和onPause()(将全部的改动写回持久存储),这样activity才干在被kill的时候正确的保存当前的状态。

    假设须要了解一个进程的生命周期与他所运行的activity之间的关系 參见 进程生命周期 部分。

           对于那些标记killable的方法。从这些方法启动開始直到返回之前,activity的进程都不回被系统kill。举个样例。一个activity在onPause()方法返回后处于killable的状态。这样的状态会一直持续到onResume()方法開始运行。

    配置改变

    假设设备的配置(在Resources.Configuration中进行了定义)发生改变,那么全部用户界面上的东西都须要进行更新。以适应新的配置。

    由于Activity是与用户交互的最基本的机制。它包括了处理配置改变的专门支持。

           除非你特殊指定,否则当配置发生改变(比方屏幕方向、语言、输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常的activity生命周期过程(onFreeze(Bundle)onPause()onStop(), 和 onDestroy())进行的。

    假设activity之前正在前景画面。当这个实例的onDestroy()调用完毕后将会启动这个activity的一个新的实例,并将前面那个实例中onFreeze(Bundle)所保存的内容传递给新的实例。

    因为不论什么的应用资源(包含layout文件)都有可能因为不论什么配置值而改变。因此处理配置改变的唯一安全的方法就是又一次获取全部的资源,包含layout、画图资源(原文drawables)、字符串资源。因为activity已经怎样保存自己的状态并从这些状态中重建自身,所以activity又一次启动自身来获得新的配置将是一个很便利的途径。

           在一些特殊的情况中。你可能希望当一种或者多种配置改变时避免又一次启动你的activity。你能够通过在manifest中设置android:configChanges属性来实现这点。你能够在这里声明activity能够处理的不论什么配置改变,当这些配置改变时不会又一次启动activity,而会调用activity的onConfigurationChanged(Resources.Configuration)方法。假设改变的配置中包括了你所无法处理的配置(在android:configChanges并未声明)。你的activity仍然要被又一次启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。

    启动Activity并获得结果

    startActivity(Intent)方法能够用来启动一个新的activity,这个activity将被放置在activity栈的栈顶。这种方法仅仅有一个參数http://code.google.com/android/reference/android/conten

  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6999508.html
Copyright © 2011-2022 走看看