Activity启动模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity启动模式相关的知识,希望对你有一定的参考价值。

一、任务栈:

      当一个Activity启动了另外一个Activity的时候,新的Activity就会被放置到返回栈的栈顶并将获得焦点。前一个Activity仍然保留在返回栈当中,但会处于停止状态。当用户按下       Back键的时候,栈中最顶端的Activity会被移除掉,然后前一个Activity则会得重新回到最顶端的位置。返回栈中的Activity的顺序永远都不会发生改变,我们只能向栈顶添加           Activity,或者将栈顶的Activity移除掉。因此,返回栈是一个典型的后进先出(last in, first out)的数据结构

 

二、 Activit启动模式:

     standard 模式

          这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

     singleTop 模式

          如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实               例,只要不在栈顶,都会创建新的实例。

     singleTask 模式

           如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存            在该实例,将会创建新的实例放入栈中。

      singleInstance 模式

           在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用            该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

三、新建项目

  

四、两个布局文件

技术分享
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_start_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动MainActivity"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_start_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动BActivity"
        android:textAllCaps="false" />
</LinearLayout>
activity_main
技术分享
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_b_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_b_start_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动MainActivity"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_b_start_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动BActivity"
        android:textAllCaps="false" />
</LinearLayout>
activity_b_main

 

五、两个Class文件

技术分享
package com.example.launchmode;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tvMsg;
    private Button btnStartSelf, btnStartB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvMsg = (TextView) findViewById(R.id.tv_msg);
        btnStartSelf = (Button) findViewById(R.id.btn_start_main);
        btnStartB = (Button) findViewById(R.id.btn_start_b);

        tvMsg.setText(String.format("TaskID:%d\\nCurrent Activity id%s", getTaskId(), toString()));
        btnStartSelf.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MainActivity.class));
            }
        });
        btnStartB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, BMainActiity.class));
            }
        });
    }
}
MainActivity
技术分享
package com.example.launchmode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


/**
 * Created by 袁磊 on 2017/2/13.
 */
public class BMainActiity extends Activity {
    private TextView tvMsg;
    private Button btnStartMain, btnStartSelf;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b_main);
        tvMsg = (TextView) findViewById(R.id.tv_b_msg);
        btnStartMain = (Button) findViewById(R.id.btn_b_start_main);
        btnStartSelf = (Button) findViewById(R.id.btn_b_start_b);

        tvMsg.setText(String.format("TaskID:%d\\nCurrent Activity id%s", getTaskId(), toString()));
        btnStartMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(BMainActiity.this, MainActivity.class));
            }
        });
        btnStartSelf.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(BMainActiity.this, BMainActiity.class));
            }
        });
    }
}
BMainActivity

 

六、注册清单文件

      启动页面设置启动模式

      技术分享

      注册BMainActivity

      技术分享

 

七、运行效果(安装Demo,点击Button观察结果)

      技术分享

 

 

     

 

 

 

 

 

 

以上是关于Activity启动模式的主要内容,如果未能解决你的问题,请参考以下文章

从 Activity 的 Fragment 中保存数据

用于数据加载的 Android 活动/片段职责

activity启动模式之singleInstance

Activity的启动模式

java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android

用代码理解Acticity启动模式