13.Activity的LaunchMode(四种)启动模式

Activity的四种launchMode
Activity的四种launchMode(详细)_文档下载http://www.wendangxiazai.com/b-73d04d785ef7ba0d4a733bdf.html
Activity的四种launchMode
Activity的四种launchMode(详细)_文档下载http://www.wendangxiazai.com/b-73d04d785ef7ba0d4a733bdf.html

Activity有以下四种加载模式(实际项目开发中用的不多,多用Fragment):

why:我们在开发项目的过程中,会涉及到该应用中多个Activity组件之间的跳转,或者夹带其它应用的可复用的Activity。例如我们可能希望跳转到原来某个Activity实例,而不是产生大量重复的 Activity。这样就需要我们为 Activity 配置特定的加载模式,而不是使用默认的加载模式。


[1] standard 模式(默认-标准模式)

        自己可以启动自己(会创新一个新的Activity)

        默认模式,不需要配置launchMode,每次激活Activity时都会创建Activity实例,并放入任务栈中。

[2] singleTop 模式(顶单例模式)

        在栈顶只允许有一个相同的Activity

        自己不能启动自己

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

[3] singleTask 模式(内单例模式)

        如果要启动的Activity存在,则干掉要启动的Activity上面的所有的Activity

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

[4] singleInstance 模式(全局单例模式)

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


设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性(如图):


话不多说,直接上代码查看演示

效果图(主要看下图划线部分是否变化):


layout

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zking.android13_activity.MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是MainActivity"
        android:textSize="30sp"
        android:background="#00ff00"/><!--为了看效果的TextView-->


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_main_text"
        android:textSize="25sp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="(当前为A页面)跳自己"
        android:onClick="jumpMain"/><!--跳转(跳自己 即A跳A)-->

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳B页面"
        android:onClick="jumpB"/>

</LinearLayout>
activity_b.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zking.android13_activity.BActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是BActivity"
        android:textSize="30sp"
        android:background="#00ffff"/><!--为了看效果的TextView-->

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:id="@+id/tv_b_text"/><!--文本框-->

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳Main(A页面)"
        android:onClick="jumpMain"/>

</LinearLayout>
Java

MainActivity.java

package com.zking.android13_activity;

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

/**
 * A页面
 */
public class MainActivity extends AppCompatActivity {

        private TextView tv_main_text;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                 tv_main_text = (TextView) findViewById(R.id.tv_main_text);
                 //查看当前Activity在内存里的地址
                 //拿到当前任务栈的id,id一样代表一个栈
                 tv_main_text.setText("当前Activity实例:"+this+"\n当前任务栈在:"+this.getTaskId());
        }

        public void jumpMain(View view){//跳自己
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        public void jumpB(View view){//A跳B
                Intent intent=new Intent(this,BActivity.class);
                startActivity(intent);
        }

}
BActivity.java

package com.zking.android13_activity;

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

public class BActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_b);

                TextView tv_b_text = (TextView) findViewById(R.id.tv_b_text);
                //打印B在内存当中的地址
                tv_b_text.setText("当前Activity地址:"+this+"\nB的任务栈在:"+this.getTaskId());
        }

        public void jumpMain(View view){//跳A页面
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

}

查看一个效果图:

:






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值