(android文档原创翻译)管理Activity的生命周期<一>

(英文原文链接地址)

1.启动你的Activity

    不同其它的应用程序通过main()方法来启动,android系统是按照一定的顺序通过调用其生命周期(lifecycle)的回调方法来启动或者结束一个activity。本节简要介绍了Activty的最为重要的生命周期,并且示意了怎样处理一个Activity的生命周期.


理解什么叫做生命周期的callbacks

    在Activity的生命周期中,android系统会按顺序调用一系列类似于金字塔形排列的生命周期方法,即activity生命周期的每个阶段都属于金字塔的某一层.当系统创建一个Activity的时候,生命周期中的每一个方法的调用都会让Activity让生命周期金字塔的状态发生跳转(改变),而处于金字塔顶端的状态即为activity当前生命周期的可见和可交互的阶段。
    当用户需要离开Activity的时候,系统会调用其它的一些方法让Activity的生命周期跳转到其它方法中.在一些cases中,Activity仅会部分的沿着金字塔进行跳转和等待(例如当用户切换到其它的APP时候).如图

    图1.为活动周期的简化图示,表示activity的生命周期*金字塔,显示了activity的生命周期之间的变化,以及生命周期的各个状态之间的转换
    
根据你Activity的复杂性,你不需要implement生命周期中的所有方法,但是你要明确的知道每一个生命周期的意义,确保应用是以用户期望的方式运行,为了实现确保你的应用能够满足用户的期望,你需要注意但不限于以下几点:
  • 当用户接到一个电话或者切换到其它的应用,应用不会被crash掉.当用户没有使用一些资源的时候,记得释放掉它们
  • 当离开你的应用后再返回,你的应用不应该丢失掉前面的状态信息
  • 当应用发生横竖屏切换的时候,确保应用不被crash掉并且不要丢失前面的状态信息
在随后的学习的课程中,有几种状态用于表示图1中不同状态之间的转换,但是只有三种状态时处于静态的,也就是说activity能够长时间的存活在这三个状态中:
Resumed   在这个生命周期中,Activity是处于前台,并且用户能够与之交互(有时我们也叫做"运行"状态)
paused        在这个状态中,Activity被其它的Activity部分覆盖,其它处于前台状态Activity是半透明或者不会全部遮盖,被覆盖的activity是不能接受用户的输入也不会执行任何代码.
Stopped     在这个状态中,Activity完全被隐藏而且用户是不可见的,Activity是被认为是处于后台的,当进入stop状态时,这个Activity的所有状态信息如成员变量会被保留,但是不能够执行任何的代码
    至于其它的状态(Creaded and Stated)应用的生命周期会快速的进行转换,如系统调用onCreate()后,它会立即调用onStart(),然后快速的跳转到onResume() 以上是关于Activity的生命周期的基本知识,接下来我们将学习到关于Activity的特殊的行为。

    

指定你APP的启动Activity

      当用户在home屏幕中点击你应用的图标时,系统会调用你声明作为程序入口的"launcher activity""的onCreate方法,你有几种方法可以指定你APP的入口。
你可以在AndroidManifest.xml中指定APP的main activity,AndroidManifest.xml是在你项目的根目录下面.
这个main activity必须被显式的在mainfest 下面的<intent-filter>中声明,在<intent-filter>中包括了MAIN action 和LAUNCHER category.例如:

   
   <activity android:name=".MainActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
  提示:当你使用android SDK创建一个android project的时,系统会在项目文件夹下面创建一个默认的启动activity
   

如果你没有显式的声明MAIN Action或者LAUNCHER catgory的时候,你的APP的icon将不会出现在Home屏幕(也就是我们手机的桌面上)列表中.


创建一个新的实例

绝大多数的APP中都包含了多个activity,他允许用户在多个Activity中进行切换,当用户点击APP的icon时一个mian activity将会被创建,系统会调用onCreate()方法来创建一个activity的实例。
你必须实现onCreate方法来开始一个activity的逻辑和这个activity的生命周期,例如,你在onCreate中定义用户的界面并实例化一些变量.
例如,你在下面的例子的onCreate的方法中显式的声明了用户的用户接口(定义在XML文件),定义了成员变量,并且配置了一些UI配置。

    TextView mTextView; // Member variable for text view in the layout
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Set the user interface layout for this Activity
        // The layout file is defined in the project res/layout/main_activity.xml file
        setContentView(R.layout.main_activity);
        
        // Initialize member TextView so we can manipulate it later
        mTextView = (TextView) findViewById(R.id.text_message);
        
        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // For the main activity, make sure the app icon in the action bar
            // does not behave as a button
            ActionBar actionBar = getActionBar();
            actionBar.setHomeButtonEnabled(false);
        }
    }

一旦onCreat()执行完毕,系统会快速的调用onStart()和onResume()方法,你的Activity不会停留在Created和Stated状态,当系统调用onStart()方法时候activity是变成可见的状态,但是onResume()方法会快速的被调用并处于Resumed状态直到某些事情发生或者改变,例如当电话被呼叫时候,应用被切换到其它的Activty或者屏幕发生横竖排改变时.
在接下来的其它的课程中,你讲学习到当用户从Stoped和Paused状态回到resumed状态的过程中onStart()和onResume()方法非常有用的。
*Note:onCreate()方法中包含了一个savedInstanceState参数,这个问题在后面的Recreating an Activity.课程中进行讨论

Figure 2. Another illustration of the activity lifecycle structure with an emphasis on the three main callbacks that the system calls in sequence when creating a new instance of the activity: onCreate(), onStart(), and onResume(). Once this sequence of callbacks complete, the activity reaches the Resumed state where users can interact with the activity until they switch to a different activity.


销毁(Destroy)Activity

当Activity第一次创建的时候会调用OnCreate()方法,它最终会调用onDestroy()方法,当onDestroy()方法执行完后系统会将Activity的实例从内存中移除.
大多数的app应用不需要实现onDestroy这个方法,因为Activity的实例引用会随着Activity的销毁而回收,在onPause()和onStop()的状态中而被清除.然而,如果你的Activity中有后台线程或者长时间被引用的资源,那么你必须在onDestroy()中进行清除回收,否则会造成内存泄漏.


 @Override
    public void onDestroy() {
        super.onDestroy();  // Always call the superclass
        
        // Stop method tracing that the activity started during onCreate()
        android.os.Debug.stopMethodTracing();
    }

  Note:在onPause()和onStop()执行完后系统会调用OnDestroy()方法,除非:你自己在onCreate()方法调用finish()方法.在一些cases中,例如当前的Activity用来临时启动其它的Activity的时候,你可能会在onCreate()中使用finish()方法来结束当前的Activity,这个时候系统会立即调用onDestroy()方法而不会进过其它的生命周期.


    NEXT:pausing and Resuming an activity


pS:以上链接请自备VPN账号,作为一个android开发的没有VPN账号很多信息只能是二手信息,这里我推荐使用(红杏软件

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。