安卓Activity的四大启动模式

一直想写一篇activity的四种启动模式的文章,闲来整理了一下;

 

一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。

Activity一共有以下四种launchMode

1.standard(standard是系统默认的启动模式)

2.singleTop

3.singleTask

4.singleInstance

我们可以在<activity android:name=".MainActivity" android:launchMode="standard">里设置lannchMode

 

一、standard

 

由于standard是系统默认的launchMode,我们可以不用设置,当然,为了方便区分,也可以设置为standard。创建一个类来演示

 

 

public class MainActivity extends AppCompatActivity {

    private Button first_btn;
    private TextView first_tv;
    private Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        first_btn= (Button) findViewById(R.id.first_btn);
        first_tv= (TextView) findViewById(R.id.first_tv);

        first_tv.setText(this.toString());
        first_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent=new Intent(MainActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

}

我们注意到有一个Textview,这是用来显示当前activity实例的序列号,Button按钮用来跳转到下一个activity

 

 

默认进入时会看到:

       

点击按钮后:

再次点击:

我们不难发现,每张图片的序列号都不一样,说明每次点击都产生了一个新的activity实例,

并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的Activity实例。

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

 

二、singleTop

这里就不再上图片了,直接用语言描述

①在同一个activity跳转,序列号是不变的,

也就是说使用的都是同一个Activity实例;如果按一下后退键,程序立即退出,说明当前栈结构中只有一个Activity实例

 

②在不同的activity跳转

从第一个activity跳到第二个,序列号发生变化,产生了新的实例,再从第二个activity跳到第一个,我们发现,序列号还是发生了变化,

这是因为系统发现栈内有一个firstActivity的实例,但是不是位于栈的最顶层,所以重新生成一个firstActivity的实例。

如果发现有一个相同的实例位于栈的最顶层,则会重复利用,不会产生新的实例

 

三、singleTask

从第一个activity跳到第二个,序列号发生变化,产生新的实例,

 

再从第二个activity跳回去第一个,你会发现第一个activity的序列号没有发生变化,说明没有产生第一个activity的实例,

在这个跳转过程中系统发现有存在的FirstActivity实例,于是不再生成新的实例,而是将FirstActivity之上的Activity实例统统出栈,

将FirstActivity变为栈顶对象显示出来

 

 

在以上基础上再跳回第二个activity,第二个activity的序列号又发生了变化,说明产生新的实例。

 

四、singleInstance

 

这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。

我们修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",由于涉及到了多个栈结构,

我们需要在每个Activity中显示当前栈结构的id,所以我们为每个Activity添加如下代码:

1. TextView taskIdView = (TextView) findViewById(R.id.taskIdView);  

2. taskIdView.setText("current task id: " + this.getTaskId());  

 

当我们点击跳转时,我们发现这两个Activity实例分别被放置在不同的栈结构中

 

我们看到从FirstActivity跳转到SecondActivity时,重新启用了一个新的栈结构,来放置SecondActivity实例,

然后按下后退键,再次回到原始栈结构;当SecondActivity中再次跳转到FirstActivity,这个时候系统会在原始栈结构中生成一个FirstActivity实例,

然后回退两次,注意,并没有退出,而是回到了SecondActivity,为什么呢?

是因为从SecondActivity跳转到FirstActivity的时候,我们的起点变成了SecondActivity实例所在的栈结构,这样一来,我们需要“回归”到这个栈结构。

 

 

 

PS:如果有不足之处,欢迎留言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值