Android应用开发:Activity(4)

目录

7、Activity 的启动模式

(1)Standard

(2)singleTop

(3)singleTask

(4)singleInstanse


7、Activity 的启动模式

(1)Standard

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

class FirstActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("FirstActivity",this.toString())
        setContentView(R.layout.first_layout)

        button1.setOnClickListener {
            val intent = Intent(this,FirstActivity::class.java)
            startActivity(intent)
        }
    }
}

重新运行程序,在 FirstActivity 的基础上启动 FirstActivity,连续点击两次按钮,可以看到 Logcat 中的打印信息如下:

可以得知,每点击一次按钮,就会创建出一个新的 FirstActivity 实例。此时返回栈中也会存在 3 个 FirstActivity 实例,因此需要连按三次 Back 键才能退出程序。

(2)singleTop

        当 Activity 的启动模式指定为 singleTop,在启动 Activity 时如果发现返回栈的栈顶已经是该 Activity, 则认为可以直接使用它,不会再创建新的 Activity

① 修改 AndroidManifest.xml 中的 FirstActivity 的启动模式;

<activity
            android:name=".FirstActivity"
            android:launchMode="singleTop"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

② 重新运行程序,查看 Logcat,会看的已经创建了一个 FirstActivity 的实例,如图所示:

        之后不管点击多少次按钮都不会有新的打印信息出现,因为目前 FirstActivity 已经处于返回栈的栈顶,每当想要再启动一个 FirstActivity 时,都会直接使用栈顶的 Activity ,因此 FirstActivity 只会有一个实例,仅按一次 Back 键就可以退出程序。

        不过当 FirstActivity 并未处于栈顶位置时,再启动 FirstActivity 还是会创建新的实例。

(3)singleTask

        singleTop 模式在该 Activity 没有处于栈顶的位置时,可能会创建多个 Activity 实例。而用 singleTask 则可以让某个 Activity 在整个应用程序的上下文中只存在一个实例

        当 Activity 的启动模式指定为 singleTask ,每次启动该 Activity 时,系统首先会在这个返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例,并且在这个 Activity 之上的所有其他 Activity 统统出栈,如果没有发现就会创建一个新的 Activity 实例。

① 修改 AndroidManifest.xml 中的 FirstActivity 的启动模式;

android:launchMode="singleTask"

② 在 FirstActivity 中添加 onRestart( ) 方法,并打印日志

class FirstActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("FirstActivity",this.toString())
        setContentView(R.layout.first_layout)

        button1.setOnClickListener {
            val intent = Intent(this,SecondActivity::class.java)
            startActivity(intent)
        }
    }

     override fun onDestroy() {
        super.onDestroy()
        Log.d("SecondActivity","onDestroy")
    }
}

③ 在 SecondActivity 中添加 onDestroy( ) 方法,并打印日志

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Log.d("SecondActivity",this.toString())
        setContentView(R.layout.second_layout)

        button2.setOnClickListener {
            val intent = Intent(this,FirstActivity::class.java)
            startActivity(intent)
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("SecondActivity","onRestart")
    }
}

        重新运行程序,在 FirstActivity 界面点击按钮进入 SecondActivity,然后再 SecondActivity 界面点击按钮,又会重新进入 FirstActivity(此时 SecondActivity 出栈,返回栈中只剩下一个 FirstActivity 的实例,按一下 Back 键就可以退出程序)。

(4)singleInstanse

        指定为 singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity(其实如果 singleTask 模式指定了不同的taskAffinity,也会启动一个新的返回栈),不管哪个应用程序来访问这个 Activity ,都共用一个返回栈,可以解决程序共享 Activity 的问题

① 修改 AndroidManifest.xml 中的 SecondActivity 的启动模式;

android:launchMode="singleInstance"

② 修改 FirstActivity 中 onCreate( )方法的代码

调用父类的 getTaskId( ) 的方法,打印当前返回栈的id。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //Log.d("FirstActivity",this.toString())
        Log.d("FirstActivity","Task id is $taskId")
        setContentView(R.layout.first_layout)

        button1.setOnClickListener {
            val intent = Intent(this,SecondActivity::class.java)
            startActivity(intent)
        }
    }

③ 修改 SecondActivity 中 onCreate( ) 方法的代码

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Log.d("SecondActivity","Task id is $taskId")
        setContentView(R.layout.second_layout)

        button2.setOnClickListener {
            val intent = Intent(this,ThirdActivity::class.java)
            startActivity(intent)
        }
    }

④ 修改 ThirdActivity 中 onCreate( ) 方法的代码

class ThirdActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("ThirdActivity","Task id is $taskId")
        setContentView(R.layout.third_layout)
    }
}

⑤ 重新运行程序,在 FirstActivity 界面点击按钮进入 SecondActivity,然后再 SecondActivity 界面点击按钮进入 ThirdActivity,查看 Logcat 中的打印信息

        SecondActivity 是存放在一个单独的返回栈里的,而且只有 SecondActivity 一个 Activity。

        按下Back 键,ThirdActivity 直接返回到 FirstActivity,再按下 Back 键,又会回到 SecondActivity ,再按 Back 键才会退出程序

        ThirdActivity 按 Back 键时从返回栈中出栈,FirstActivity就会成为栈顶,在 FirstActivity 中按下 Back 键,此时返回栈已经情空,就会显示另一个返回栈的栈顶。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值