Acitivity生命周期 之 启动Activity

在activity的生命周期里面,系统回去按照一定的顺序去调用一些核心的回调函数,就像金字塔一样,一个台阶一个台阶的排列着。在activity生命周期里面,不同的阶段都是像金字塔里面一个独立台阶。当系统创建一个activity的时候,每一个回调函数,都会一步一步的把activity的状态向上移动,就向上金字塔一样,一个台阶一个台阶的向上。那么当我们的activity完全显示到前台,可以和用户交互的时候,这个时候,我们就达到了金字塔的顶端。

当用户离开activity的时候,系统会调用activity生命周期里面的其他一些方法,一步一步的从金字塔的顶端到达地段,移除掉这个activity。有些情况下,这个动作我们只进行一部分, 只走到下到金字塔的中间某个位置,从这个位置,我们又可以返回到金字塔的顶端,恢复到用户离开时的位置。

下面是关于activity生命周期一个简单的图示,像一个金字塔一样,我们可以看到有一个可以把activity状态向金字塔顶端前进的函数调用,就对应的有一个可以把activity状态向相反的方法:向金字塔底部前进的函数调用。activity可以从Stopped或者Paused状态到达Resumed状态。

由于整个activity生命周期的复杂性,我们不需要去实现全部的生命周期里面的函数.但是,你最好熟悉这些函数,去实现一些回调函数,以达到用户希望的效果。那么要很好的实现这些函数,以确保达到很好的效果,包括下面几个方法:

如果用户在使用你的app的时候接收到电话或者启动了另外的app,要保证不产生冲突而崩溃。

如果用户不在进行频繁的操作的时候,你的app不要去浪费的使用贵重的系统资源。

如果用户中途离开你的英语,那当用户返回的时候,要恢复用户离开时候的状态,不能丢失用户之前的处理动作。

如果当屏幕横竖切换的时候,要保证不能产生冲突崩溃,或者丢失用户当前的处理动作。

activity可以在多个状态之前切换,像上面图示的一样。其中,只有三个状态可以是静止存在的,activity在同一时间只可能处于下面3个中的一个状态 :

Resumed:在这个状态在,activity是运行在前台的,用户可以与它交互(也就是我们有时候提到的运行状态)

Paused:在这个状态,我们的activity是被另外一个应用遮盖住了一部分。遮盖住我们这个activity或者是半透明的,或者是只占据了屏幕的一部分。处于这个状态下的activity无法接受用户的任何输入,也无法执行任何代码。

Stopped:在这个状态下,我们的activity是完全不可见的,是完全隐藏的,就是我们说的处于后天,这个时候它的状态以及数据都是被保存的,但是无法执行任何代码。

其他状态(像Create和Started)都是非常短暂的,系统快速的调用对应的回调函数,使 activity进入下一个状态,具体是:当系统调养onCreate()函数后,马上又调用了onStart()函数,随后就很快调用了onResumed()函数。

上面所述的就是基本的activity的生命周期,下面我们看一下,在指定生命周期内,系统所做的行为动作。

指定你的APP第一个启动的Activity

当用户在桌面上点击你的APP的图标的时候,系统就为你指定为“launcher”或者说”main”的那个Activity调用onCreate()函数。这个activity就是你的APP的入口,就是启动后用户看到的第一个界面。

你可以在AndroidManifest.xml里面定义哪个activity要被设置为“launcher”或者”main”,下面我们称之为主activity,AndroidManifest.xml这个文件就在你的项目的根目录。

主activity声明的时候,必须使用<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>


注意:当我们用开发工具创建一个项目的时候,默认包含的那个activity被设置为主activity

如果MAIN或者LAUNCHER这2个在你的任何一个activity里面都没有设置,我们的APP就图标就不会出现在系统主屏幕的app列表里面.

创建一个新的实例

不管是用户点击桌面的图标启动一个activity,还是用户在你的应用里面点击的时候启动activity,都需要调用它的onCreate方法来创建被启动的activity的实例。

你必须要在代码里面实现onCreate函数,在这里面执行一些在整个activity的生命周期里面只需要执行一次动作。比方说设置这个activity的界面,也有可能是初始化一些类的变量等等。

比方说下面的这个onCreate函数里面,就进行了一些对这个activity的基础设置,如声明用户界面(定义在一个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);
    }
}


警告:利用SDK_INT来做这种平台上的保护,仅仅使用于2.0(API 5)以及之上的版本,再低版本上会报异常错误。

一旦执行onCreate结束,系统会马上连续的调用onStart和onResume这2个函数,你的activity不会在onCreate和onStart状态上停留。技术上来说,activity在系统执行调用onStart的时候就是可见的,但是onStart后面紧接着就执行了onResume()函数,然后会一直保持在Resumed这个状态,直到有电话进来,或者是用户启动了另外一个activity,或者屏幕熄灭。

后面我们来看下当我们把activity从Paused或者Stopped状态恢复到Resumed状态的时候,如何使用其它的2个生命周期里面的函数:onStart和onResume。

注意:我们看到onCreate函数有一个参数savedInstanceState,这个我们稍后在:重新创建activity里面细讲.

下面是图示2:我们可以看到activity的生命周期里面函数的调用步骤,特别强调系统在创建activity的时候,按顺序调用的这三个函数 :onCreate()onStart(), 和onResume().当这三个函数执行完成,activity就已经是可见的,用户可以与之交互,直到用户启动了另外一个activity.

QQ截图20130314150925

销毁Activity

在activity的生命周期里面,第一个调用的函数是onCreate(),对于的最后一个调用的函数是onCreate().系统调用这个方法是你的activity的这个实例要从系统内存中彻底清除的标志。

绝大部分时候我们不需要去实现它,因为本地类涉及到的变量等信息都会随着activity的销毁而销毁,我们的activity应该把绝大部分清除的工作放在onPause() 和onStop().但是如果你的activity里面有你在onCreate期间创建的后台运行的线程,或者是长时间运行,如果正常关闭可能会导致内存泄露的资源,你应该在onDestroy()里面杀死它们。

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


注意:系统调用onDestroy()函数是在系统调用了onPause() 和onStop()之后,绝大数情况是这样。但是有一种情况例外:在onCreate()里面调用finish()函数。因为在有些情况下,我们的activity可能只是充当一个临时的决策着,我们只是在onCreate函数里面启动另外一个activity,这个时候你在onCreate里面调用finish函数完成之后我们要销毁我们这个activity,系统会直接执行onDestory函数,而不会执行这个activity生命周期里面的其他函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值