standard、singleTop、singleTask、singleInstance

活动的四种启动模式

standard

standard是活动默认的启动模式,在不进行明确指定的情况下。所用活动都会自动的使用该模式启动。
在该模式下,每当启动一个新的活动,他就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        Log.d(TAG, this.toString());
        button1=findViewById(R.id.start_btn);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(StartActivity.this,StartActivity.class);
                //此处跳转的是当前的活动,便于研究standard
                startActivity(intent);
            }
        });
    }

在这里插入图片描述
如上图显示,连续点了两次跳转,每点击以此跳转按钮都会创建一个新的实例,此时返回栈也会存在三个实例,因此需要三次back键才能退出程序

singleTop

在启动活动时,若返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的实例,不过当该活动不在栈顶时还是会创建一个新的实例的。

可在AndroidManifest.xml中修改活动的启动模式,如下:

        <activity android:name=".ActivityStart.StartActivity"
            android:launchMode="singleTop">

singleTask

当活动的启动模式为singleTask时,每次启动活动时,都会在返回栈中先检查是否存在该活动的实例,如果发现存在,则会直接使用该实例,不会再另外创建实例,并把该活动之上的所有活动统统出栈,如果没有发现会创建一个新的实例

singleInstance

singleInstance不同与其他模式,singleInstance模式会启动一个新的返回栈来管理这个活动(如果singleTask模式指定了不同的taskAffity,也会启动一个新的返回栈)
假如我们的程序有一个活动是允许其他程序调用的,使用该模式可以实现其他程序和我们的程序共享这个活动的实例。不管是哪个程序访问这个活动们都共用另外创建的这个返回栈。

首先设置
Start1Activity的启动模式为singleInstance,其他活动的模式还是默认
StartActivity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
        button1=findViewById(R.id.start_btn);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(StartActivity.this,Start1Activity.class);
                startActivity(intent);
            }
        });
    }

Start1Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
    setContentView(R.layout.activity_start1);
    button1=findViewById(R.id.start_btn1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Start1Activity.this,Start2Activity.class);
            startActivity(intent);
        }
    });
}

Start2Activity

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
        setContentView(R.layout.activity_start2);
        button1=findViewById(R.id.start_btn2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Start2Activity.this,Start2Activity.class);
                startActivity(intent);
            }
        });
    }

AndroidManifest.xml

 <activity android:name=".ActivityStart.StartActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ActivityStart.Start1Activity"
            android:launchMode="singleInstance"></activity>
        <activity android:name=".ActivityStart.Start2Activity"></activity>

StartActivity和Start2Activity的栈ID一致,而Start1Activity的栈ID不同

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值