Android入门之 活动启动模式<笔记>

活动启动模式分四种:standard**、singletopsingleInstancesingleTask。可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

1.standard启动模式

standard是默认的启动模式,在不显示指定的情况下,所有活动默认选择这种启动模式。 在standard模式下,每启动一个新的活动,它就会在返回中入栈,并处于栈顶。在standard模式中,系统不会在乎这个活动是否在返回栈中已经存在,每次启动都会创建一个新的实例。举个例子:
在主活动添加如下代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("MainActivity",this.toString());
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    //standard 模式启动活动
    button1.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               Intent intent = new Intent(MainActivity.this,MainActivity.class);
               startActivity(intent);
           }
       }
    );

启动程序,点击两次BUtton1键,可以看到logcat中打印如下(需要使用logcat过滤器才能这样直观看到三个连续的信息)
在这里插入图片描述

如代码所示,在 MainActivity 的基础上启动 MainActivity,启动之后,你需要点击3次Back键才能退出程序。原理示意图(这里引用了《第一行代码Android》书中的图片):

题外话:点击Back键的时候让我想起了哔哩哔哩,当你看了很多个视频之后,需要点很多下返回键才能回到 “首页”,就在想哔哩哔哩是不是就用的这种模式?先在这留个疑问,以后实力强了再回来解答。

2.singeltop

在此模式下,启动一个新的活动,如果发现返回栈的栈顶已存在该活动,则直接使用它,不会创建新的实例。
看清楚是栈顶,也就是说,我在MainActivity进入另一个不同的活动SecondActivity,此时栈顶变为SecondActivity,如果我再次启动一个MainActivity活动,系统又会创建一个新的实例出来。还是用图来理解一下吧:
在这里插入图片描述
实例,要修改启动模式,需在AndroidManifest.xml 中注入以下代码(注意看注释):

activity android:name=".MainActivity"
         android:launchMode="singleTop">//在原有的代码基础上添加这一行就可以了
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

题外话:好像哔哩哔哩和这个更像,在一个视频A中的推荐视频B中看不到自己当前看的视频,当你进入推荐视频B时,在推荐视频B中的推荐中看到A,又可以点击A视频看了,然后再点返回就是先看到B然后是A。哦哦哦,恍然大悟啊,就是这个原理没错了。

3.singleTask

每次启动会在返回栈中检查是否存在该活动的实例,如果存在,则直接使用,如果没有就会新创建一个活动。需要修改任然是 改AndroidManifest.xml 中的代码:

<activity android:name=".MainActivity"
          android:launchMode="singleTask">//依照前面修改这一行就可以了
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

原理的话就是这样的:
在这里插入图片描述

4.singleInstance

singleInstace启动模式是四个模式中最复杂的一个模式,不同于其他三种模式,指定为singleInstanceqidong 模式的活动,会启用一个新的单独的栈来管理这个活动。(注意这个”单独的”和“这个活动”,因为后面ondActivity进入ThirdActivity活动,竟然会跳回到刚开始的返回栈,我就很疑惑,这里解疑了)
它这么做的意义是什么?如果两个程序想共享一个活动怎么办,使用前面三种j模式肯定没法办到,因为在每一个程序中都有自己的返回栈,同一个活动在不同的栈中必然会创建新的实例。singleInstace就很好的解决了这个问题。
以下是实践案例主要代码:

/*MainActivity活动*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("MainActivity","Task id is"+getTaskId());
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               Intent intent = new Intent(MainActivity.this,SecondActivity.class);
               startActivity(intent);
           }
       }
    );
/*SecondActivity*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("ScondActivity","Task id is"+getTaskId());
    setContentView(R.layout.second_layout);
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
            startActivity(intent);
        }
    });
    }

大致过程就是:
1.AndroidManifest.xml文件中修改MainActivitySecondActivit的android:launchMode的属性值
android:launchMode="singleInstance"
2.在MainActivity界面点击按钮启动SecondActivity活动,此时singleInstance发生作用,启用一个新的返回栈B。在SecondActivity界面中点击按钮进入ThirdActivity。

在这里插入图片描述
图中FirstActivity即我代码中的MainActivity

写在后面:
本人只是Android刚入门的小白一名,妄想通过技术改变自己的命运。但最近发现自己学习效率太低了,而且特别容易忘,就想通过写csdn博客笔记的方式来逼自己学习以及加深记忆。这篇笔记我花了一上午和一晚上的时间来学习整理,如有错误之处,还请多多包涵并加以指正,欢迎大家来互相交流,共同成长。
希望大家都能成长的道路上越走越远,越走越强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值