Activity的四种启动模式

本文深入解析了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,阐述了它们在不同场景下的工作原理及如何在AndroidManifest中进行配置。通过具体代码示例,展示了Activity之间的跳转及数据传递过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的android:launchMode属性(四种启动模式)(在AndroidManiFest配置)

  1. standard:标准模式,默认
  2. singleTop:Task栈顶复用模式
  3. singleTask:Task栈内复用模式
  4. singleInstance:全局单例模式

Activity是由谁管理的

  • Activity是由任务栈管理的,每启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity
  • standard是默认的启动模式,即标准模式。每启动一个Activity,都会创建一个新的实例

singleTOP模式

  • 当要启动的目标Activity已经位于栈顶的时候,不会创建新的实例,会复用栈顶Activity,并且其onNewIntent()方法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例
  • 在这里插入图片描述

singleTask

  • 在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用其onNewIntent()方法,并且该Activity上面的Activity会被清除;如果栈没有就会创建新的实例

SingleInstance

  • 全局复用,不管哪个Task栈,只要存在目标Activity,就复用。每个Activity占有一个新的Task栈

package com.example.test0508.jump;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.test0508.R;

public class AActivity extends AppCompatActivity {

    private Button mBtnJump1;
    private Button mBtnJump2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        Log.d("AActivity","--onCreate--");
        Log.d("AActivity","taskId:" + getTaskId()+"  ,hashCode" + hashCode());
        /**
         * 数据传递
         */
        mBtnJump1 = findViewById(R.id.btn_jump1);
        mBtnJump1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(AActivity.this,BActivity.class);//从Activity.this跳到B.class
                //数据传递
                Bundle bundle = new Bundle();
                bundle.putString("name","李");
                bundle.putInt("age",21);
                intent.putExtras(bundle);
                startActivity(intent);
                //这个0是请求码,判断哪一个控件返回
//                startActivityForResult(intent,0);
            }
        });
        mBtnJump2 = findViewById(R.id.btn_jump2);
        mBtnJump2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(AActivity.this,AActivity.class);
                startActivity(intent);
            }
        });
    }


    /**
     * 接受B返回的数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(AActivity.this,"返回的数据"+data.getExtras().getString("title"),Toast.LENGTH_SHORT).show();
    }

    /**
     * 打印任务栈相关信息
     */


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("AActivity","--onNewIntent--");
        Log.d("AActivity","taskId:" + getTaskId()+"  ,hashCode" + hashCode());
    }
}

package com.example.test0508.jump;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.test0508.R;


public class BActivity extends AppCompatActivity {


    private TextView mTvTitle;
    private Button mBtnFinish;
    private Button mBtnBtoA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        mTvTitle = findViewById(R.id.tv_jump_title);


        Log.d("BActivity","--BonCreate--");
        Log.d("BActivity","taskId:" + getTaskId()+"  ,hashCode" + hashCode());

        /**
         * 从A那边获取数据并设置到自己的text里面
         */
        final Bundle bundle = getIntent().getExtras();
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        mTvTitle.setText("name:" + name + "age" + age);

        /**
         * 结束按钮,并返回数据给A
         */
        mBtnFinish = findViewById(R.id.btn_jump_finish);
        mBtnFinish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("title","我回来了");
                intent.putExtras(bundle1);
                setResult(Activity.RESULT_OK,intent);
                finish();//关闭掉
            }
        });
        mBtnBtoA = findViewById(R.id.btn_jump_btoA);
        mBtnBtoA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(BActivity.this,AActivity.class);
                startActivity(intent);
            }
        });

    }




    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("BActivity","--BonNewIntent--");
        Log.d("BActivity","taskId:" + getTaskId()+"  ,hashCode" + hashCode());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值