Android 开发入门-活动的启动模式

2.5.1 standard

默认的启动模式。系统不关心这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

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

2.5.2 singleTop

在启动活动时如果返回栈的栈顶已经是该活动,则直接使用,不创建新的活动实例。

# app/src/main/AndroidManifest.xml




    
        
            
                
                
            
        
    

但如果该活动不是位于返回栈的栈顶,还是会创建新的活动实例。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("FirstActivity", this.toString());
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 在 FirstActivity 活动中启动 SecondActivity 活动
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });
}
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("SecondActivity", this.toString());
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 在 SecondActivity 活动中启动 FirstActivity 活动,会创建一个新的 FirstActivity
                Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
                startActivity(intent);
            }
        });
    }

2.5.3 singleTask

每次启动该活动时系统会在返回栈中检查是否存在该活动的实例,如果已经存在则直接使用该实例,并把这个活动之上的所有活动出栈,如果不存在则创建一个新的活动实例。

# app/src/main/AndroidManifest.xml




    
        
            
                
                
            
        
    

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

@Override
protected void onRestart() {
    super.onRestart();
    Log.d("FirstActivity", "onRestart");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("SecondActivity", this.toString());
    setContentView(R.layout.second_layout);
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 在 SecondActivity 活动中启动 FirstActivity 活动,不会创建一个新的 FirstActivity,而是复用旧的活动,触发 FirstActivity 的 onRestart 和本活动的 onDestory
            Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
            startActivity(intent);
        }
    });
}

@Override
protected void onDestory() {
    super.onDestory();
    Log.d("SecondActivity", "onDestory");
}

2.5.4 singleInstance

为活动实例创建单独的返回栈,该活动位于新的返回栈中,其他活动位于原返回栈中。

                            #指定活动启动模式
    
        
        
        
    
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("FirstActivity", "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 v) {
            // 在 FirstActivity 活动中启动 SecondActivity 活动
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("SecondActivity", "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 v) {
            // 在 SecondActivity 活动中启动 ThirdActivity 活动
            Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
            startActivity(intent);
        }
    });
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("ThirdActivity", "Task id is " + getTaskId());
    setContentView(R.layout.third_layout);
}

结果是:FirstActivity 和 ThirdActivity 位于同一个返回栈中,SecondActivity 独立存放在新的返回栈中。

活动启动顺序:FirstActivity -> SecondActivity -> ThirdActivity

活动退出顺序:ThirdActivity -> FirstActivity -> SecondActivity -> 程序退出。

你可能感兴趣的:(android)