Activity的4种启动模式

来源:互联网 发布:eclipse编译java 编辑:程序博客网 时间:2024/04/27 21:22
  Activity是android应用程序中比较重要的一个组件,Activity的生命周期网上也有很多的,讲解的也很到位和精彩,自己在学习Activity的启动模式时,在网上看了很多人的博客还是感觉没有弄明白,经过多次看大牛的博客和自己敲代码实现各种启动模式下的Activity的实例,自己也算清楚了点。现在分享下自己的理解Activity的启动模式。

    Android的系统中Activity的启动模式有4种,分别是
    1.standard
    2.singleTop
    3.singleTask
    4.singleInstance

    Activity的启动模式在Activity的跳转(startActivity(Intent))中有着很特殊的作用,它决定这这次启动Activity是否要生成新的实例,
是否重用已经存在的Activity实例,是否和其它Activity公用一个Task,或者是否重新生成一个新的的Task。
    上面说道Task,为了弄清楚Activity的launch模式,首先先来了解下,Task和Activity的区别和联系:
     Task是一个类似于数据结构中的栈的实例,一个Task可以放置多个Activity的实例,Task管理Activity的创建和销毁,或者可以理解为Task是一个Activity的容器。默认情况下,当一个应用程序启动,会创建一个以之对应的Task来管理Activity实例,一个Activity启动另外一个Activity是,默认情况下(singleInstance除外),2个Activity是放在用一个Task中,新启动的Activity被压入启动Activity的Task栈中,单用户点击back键后,新Activity从Task栈中出栈,开始的Activity就处在栈顶,显示在屏幕上。注意:
Task和Task之间是相互独立的,当一个程序运行时,点击home键,然后在去启动另外一个应用程序,整个过程中Task来回切换,开始的Task被转移到后台(任然保留这Task里面的所有Activity),新启动的Task被移到前台,当再次点击Home键时,重新启动先前的应用程序,2个Task在前台和后台相互切换。Task保存了所有的Activity实例。说这么多,实际上Task就是Activity的管理的一个栈。不同的启动模式,对应这不同的管理方式。
    
    接下来正式进入Activity的启动模式详解
    Activity的启动模式在manifest文件中注册,<activity>标签中注册。
    1. standard
    这种方式是Activity的默认启动方式,可以在manifest文件中注册和不注册。
    这种启动方式是最简单的,也是采用最多的。
    下面的代码是FirstActivity的standard的启动模式。
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
packagecom.star.launchmode;
 
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.View;
importandroid.widget.TextView;
 
publicclass FirstActivity extendsActivity {
 
    privateTextView text;
     
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        text.setText(this.toString());
    }
 
    publicvoid gotoActivity(View view) {
        Intent i = newIntent();
        i.setClass(this, FirstActivity.class);
        startActivity(i);
    }
     
    @Override
    publicboolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        returntrue;
    }
     
}


下面代码是FirstActivity的布局文件
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:text="@string/hello_world"/>
    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/text"
        android:text="GotoActivity"
        android:textColor="#000"
        android:onClick="gotoActivity"
        />
 
<!--         android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" -->
</RelativeLayout>


manifest文件中未对FirstActivity的注册启动模式,默认是Standard

接下里的图片是运行程序后的得到实例,通过观察Activity的实例来分析Activity的启动模式,如下图:


我们注意到都是FirstActivity的实例,但序列号不同,并且我们需要连续按后退键两次,才能回到第一个FristActivity。standard模式的原理如下图所示:

如图所示,每次跳转系统都会在task中生成一个新的FirstActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的FirstActivity实例。

这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。


本来计划一篇全部写完Activity的启动模式,不知不觉中快1点了,明天还要上班,就先到这把。明天有空,我续上。

第一次启动程序

第一次启动程序

点击一次按钮

点击一次按钮


在次点击按钮

在次点击按钮