Activity的4种启动模式

  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
package com.star.launchmode;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
 
public class FirstActivity extends Activity {
 
     private TextView text;
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         text = (TextView) findViewById(R.id.text);
         text.setText( this .toString());
     }
 
     public void gotoActivity(View view) {
         Intent i = new Intent();
         i.setClass( this , FirstActivity. class );
         startActivity(i);
     }
     
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return true ;
     }
     
}


下面代码是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
< RelativeLayout xmlns: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点了,明天还要上班,就先到这把。明天有空,我续上。

第一次启动程序

第一次启动程序

点击一次按钮

点击一次按钮


在次点击按钮

在次点击按钮

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值