4.1 启动Acitivity

来源:互联网 发布:微盘今日数据 编辑:程序博客网 时间:2024/06/10 03:07

与其他以main()函数启动一个应用软件的编程方式不同的是,Android系统针对Acitivity所处的生命周期阶段,触发对应的回调方法以启动Activity实例中的代码。启动或者销毁一个Acitivity都分别有一个特定的回调方法序列。

本章节大致介绍了一些最为重要的生命周期方法,并指导开发者如何处理创建Activity的第一个生命周期回调方法。

理解生命周期回调方法

在一个Acitivity存续周期内,Android系统调用一系列塔状排列的生命周期回调方法,Activity生命周期中的每个阶段就如同这个塔状结构上的一个阶梯。从Android系统创建一个Activity的新实例开始,各个回调方法将Activity的状态依次向塔顶移动。当迁移到塔顶位置的状态,Activity在前台运行并能够与用户进行交互。

当用户执行离开Activity的操作,android系统调用其他的一些方法使Activity的状态向塔底移动,最终终结Activity的生命周期。某些情况,Activity的状态会停在塔中部位置(如用户切换到其他Activity的时候),直到等到系统使得该Activity状态返回塔顶,继续从上次用户离开的位置重新开始执行。

虽然复杂度较低的应用软件可以省略一些方法的实现,但是理解所有的方法有助于开发者确保自己的软件能够更准确地实现用户的期望。开发者还需确保自己的应用软件:

  • 软件在来电或者切换到其他软件时不会崩溃
  • 软件在不被使用时释放关键的系统资源
  • 软件能够记录用户进度以恢复运行
  • 软件能够适应屏幕在横向和纵向显示之间切换

正如后续将要介绍的,Activity在上图描绘的各个状态之间迁移的情形有若干种,其中有三种状态为稳态状态,能够维持Activity存续一段更长的时期。

Resumed

该状态下的Activity运行在系统前台,用户可以与之进行交互

Paused

该状态下的Activity被运行在前台的另一个半透明显示或者不能充满整个屏幕的Activity部分遮挡,这时候的Activity不能接收用户的输入。

Stopped

该状态下的Activity被彻底隐藏,不能为用户所见——即运行在后台。这个状态下的Activity实例及其所有的状态信息如成员变量都被保持,但不被运行。

其他的状态(如Create和Started)都是瞬态状态,处于这些状态的Activity会被Android通过相应的回调方法迁移到下一状态。比如,在系统调用OnCreate之后,OnStart随之调用,而OnResume又紧随其后。

以上就是Activity基本生命周期的介绍,接下来介绍的是一些具体的生命周期行为。

指定软件的主Activity

当用户从HOME屏幕点击应用软件图标,系统调用由开发者指定的launcher(或者main)Acitity的OnCreate方法,这个Activity即作为应用软件用户接口的主要入口。

主Activity在工程根目录下AndroidMenifest.xml文件中指定。

应用软件的主Activity在manifest文件中使用<intent-filter>元素指定,包含MAIN动作和LAUNCHER分类,如

<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 Tools创建的Android工程会自动生成一个在manifest文件中使用这个元素声明的Activity类。

没有指定MAIN动作或者LAUNCHER分类都会导致应用软件的图标不会在HOME屏幕上的应用软件列表中显示。

创建一个新的实例

大多数应用软件都包含了多个不同的Activity,允许用户执行多种不同的操作。无论是由用户点击应用软件图标触发创建的主Activity还是应用软件为响应用户动作启动的其他Activity,系统都会通过调用相应的OnCreate()方法创建一个该Activity实例。

在OnCreate()方法的实现中,应包含该Activity生命周期内只会执行一次的基本启动逻辑。例如,OnCreate()实现应包括用户界面的定义,以及一些类范围变量的初始化。

下面的OnCreate()方法实现了一个Activity的基本建立过程,如声明在界面布局XML文件中定义的用户界面,定义成员变量及对一部分用户界面。

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); 
   
} 
}

警告:通过SDK_INT来避免过老版本的系统调用新提供的API只能在Android 2.0(API Level 5)及以上版本才能使用,否则将会产生运行时异常。

OnCreate()执行结束后,系统继而马上调用OnStart()和OnResume(),因此Created和Started状态只是一个瞬时状态。在技术层面,OnStart()被调用后,用户即可见到Activity的界面,然而随之调用的OnResume()使得Activity迁移到Resumed状态,直到某些导致状态迁移的事件发生,例如来电使得用户切到另一个Activity的界面,又或是屏幕关闭。

在接下来的课程中,将会介绍另外两种启动方法,OnStart()和OnResume(),在将Activity从Paused或者Stopped状态恢复运行的过程中的作用。

注意:OnCreate()方法包含一个名为savedInstanceState的参数,该参数将在后续的重创建一个Activity中详细介绍。

销毁一个Activity

与Activity生命周期第一个回调方法OnCreate()相对应的是生命周期最后一个方法OnDestroy()。当Activity实例彻底从系统内存中移除时,系统调用该Activity的OnDestroy()。

由于OnPause()和OnStop()方法中已经实现了大部分的清除操作而局部的引用类也会随Activity的销毁而销毁,大多数应用软件不必执行OnDestroy()方法。然而,如果一个Activity在OnCreated()方法中创建过后台线程,又或者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(); 
}

注意:除了在OnCreate()方法中显式调用finish(),系统都会在OnPause()或者OnStop()之后调用OnDestroy()。在某些情况下,比如一个Activity只是用来作为启动下一个Activity的选择器,开发者就需要在OnCreate()方法中调用finish()来销毁该Activity,这样,系统就会立即调用OnDestroy(),而不会涉及任何其他生命周期方法。

0 0
原创粉丝点击