• Android-Activity启动模式(launchMode)


    Activity启动模式是非常重要的一块内容,启动模式直接关系到用户的体验 和 性能的提升等

    Activity启动模式分为四种:

      

      如果不配置:launchMode,默认就是:standard 标准的

      standard 标准的

      singleTop 独占顶端

      singleTask 单任务

      singleInstance 单实例


    standard 标准的,特点是:启动一个Activity就进栈一个Activity,启动六个Activity就进栈六个Activity

     


    singleTop 独占顶端,特点是NewActivity在顶端的时候,启动NewActivity会自动重用NewActivity,不会进栈

    NewActivity设置为 独占顶端模式(singleTop) 的配置:

         <!-- 启动模式 实验的Activity singleTop -->
            <activity android:name=".launch_mode.NewActivity"
                      android:launchMode="singleTop"
                      />

    NewActivity设置为 独占顶端模式(singleTop) 的效果图:

    (当NewActivity在顶端,无论点击启动自己多少此都不会进栈 而是重用)

    (当点击返回back键的时候,任务栈里面只有两个Activity的引用)

    12-12 20:15:24.624 2347-2347/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 457
    12-12 20:15:40.820 2347-2347/liudeli.activity D/launchMode: NewActivity 任务栈ID: 457
    12-12 20:15:44.081 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
    12-12 20:15:47.190 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
    12-12 20:15:48.611 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
    12-12 20:15:50.180 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
    12-12 20:15:50.535 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了


     singleTask 单任务,特点是单任务,不会有两个NewActivity引用,NewActivity一旦进栈 就不会再次进栈了

    例如:NewActivity设置了 singleTask启动模式:当启动过一次NewActivity,再次启动NewActivity的时候,会自动从栈底往上找,一旦找到NewActivity(一直杀到最顶端)

    NewActivity设置为 独占顶端模式(singleTask) 的配置:

         <!-- 启动模式 实验的Activity singleTask -->
            <activity android:name=".launch_mode.NewActivity"
                      android:launchMode="singleTask"
                      />

     NewActivity设置为 独占顶端模式(singleTask) 的效果:

    (当启动过一次NewActivity,启动三次LoginActivity 然后再次启动NewActivity的时候 会从栈底往上找 一旦找到 直接杀到栈顶 然后NewActivity会被重用

    (当点击返回back键的时候,任务栈里面只有两个Activity引用)

    12-12 20:44:34.646 2935-2935/? D/launchMode: LoginActivity 任务栈ID: 462
    12-12 20:44:38.398 2935-2935/liudeli.activity D/launchMode: NewActivity 任务栈ID: 462 
    12-12 20:44:40.501 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462 
    12-12 20:44:41.919 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
    12-12 20:44:42.884 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
    12-12 20:44:43.752 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
    12-12 20:44:47.421 2935-2935/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了 


    singleInstance 单实例,特点就是:再次启动NewActivity的时候会重用,不会进栈

    singleTop 和 singleInstance 对比:

      singleTop只有在顶端才会被重用

      singleInstance在任意端都会被重用,singleInstance还会单独开启一个任务栈

    NewActivity设置为 独占顶端模式(singleInstance) 的配置:

         <!-- 启动模式 实验的Activity singleInstance -->
            <activity android:name=".launch_mode.NewActivity"
                      android:launchMode="singleInstance"
                      />

    NewActivity设置为 独占顶端模式(singleInstance) 的效果:

    (当启动过一次NewActivity,在启动LoginActivity,当再次启动NewActiviy的时候会断开(第一次启动NewActivity的引用),连接现在新的引用) 

    (点击返回Back的时候,任务栈里面只有三个Activity的引用了)

    12-12 21:19:12.011 3374-3374/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 463
    12-12 21:19:27.999 3374-3374/liudeli.activity D/launchMode: NewActivity 任务栈ID: 464
    12-12 21:19:36.304 3374-3374/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 463
    12-12 21:19:41.347 3374-3374/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了


    测试四种启动模式的代码:---------------------

    LoginActivity.java

    package liudeli.activity.launch_mode;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    import liudeli.activity.R;
    
    public class LoginActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
    
            /**
             *  每款应用程序启动后,会默认有一个任务栈(用于存放Activity的引用)
             *  任务栈有栈ID,随着应用程序的启动 栈ID是累加的
             */
            int taskId = getTaskId();
            Log.d("launchMode", "LoginActivity 任务栈ID: " + taskId);
        }
    
        /**
         * 启动 NewActivity
         * @param view
         */
        public void startNewActivity(View view) {
            startActivity(new Intent(this, NewActivity.class));
        }
    
        /**
         * 启动自己
         * @param view
         */
        public void startThis(View view) {
            startActivity(new Intent(this, LoginActivity.class));
        }
    }

    activity_login.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="启动新的Activity"
            android:onClick="startNewActivity"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="启动自己"
            android:onClick="startThis"
            android:layout_alignParentRight="true"
            />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LoginActivity 永远都是标准模式"
            android:layout_centerInParent="true"
            android:textSize="20sp"
            />
    
    </RelativeLayout>

    NewActivity.java

    onNewIntent() 方法可以监听Activity是否被重用了
    package liudeli.activity.launch_mode;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    import liudeli.activity.R;
    
    public class NewActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_new);
    
            /**
             *  每款应用程序启动后,会默认有一个任务栈(用于存放Activity的引用)
             *  任务栈有栈ID,随着应用程序的启动 栈ID是累加的
             */
            int taskId = getTaskId();
            Log.d("launchMode", "NewActivity 任务栈ID: " + taskId);
        }
    
        /**
         * 启动登录Activity
         * @param view
         */
        public void startLoginActivity(View view) {
            startActivity(new Intent(this, LoginActivity.class));
        }
    
        /**
         * 启动自己
         * @param view
         */
        public void startThis(View view) {
            startActivity(new Intent(this, NewActivity.class));
        }
    
        /**
         * 当Activity被重用了就会调用此方法
         * @param intent
         */
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            Log.d("launchMode", "onNewIntent NewActivity被重用了");
        }
    }

    activity_new.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="启动登录Activity"
            android:onClick="startLoginActivity"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="启动自己"
            android:onClick="startThis"
            />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="newActivity"
            android:layout_centerInParent="true"
            android:textSize="20sp"
            android:textColor="#f00"
            />
    
    </RelativeLayout>
  • 相关阅读:
    skywalking请求头传输协议
    一篇文章带你搞懂SkyWalking调用链追踪框架
    zuihou-admin-cloud很经典的一个微服务开发平台,能够详细的看里面的视频https://www.kancloud.cn/zuihou/zuihou-admin-cloud/1411215
    skywalking权限验证功能
    哔哩哔哩中Openshift红帽培训
    ElasticSearch中文社区视频教程地址
    浅谈一些有趣的区间问题
    浅谈区间最小点覆盖
    洛谷 P1325 雷达安装
    CF12B Correct Solution?
  • 原文地址:https://www.cnblogs.com/android-deli/p/10111298.html
Copyright © 2020-2023  润新知