• Activity启动模式详解(二)--->singleTask


    MainActivity如下:

    [java]  
    package cc.testlaunchmode2;  
      
    import android.os.Bundle;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Button;  
    import android.widget.TextView;  
    import android.app.Activity;  
    import android.content.Intent;  
    /** 
     * Demo描述: 
     * Activity加载模式详解 
     * 在该Demo中主要讨论singleTask 
     *  
     * 技术描述: 
     * Activity有四种加载模式--> 
     * 1 standard: 标准(默认)模式 
     *   当通过这种模式来启动Activity时,Android总会为目标 
     *   Activity创建一个新的实例,并将该Activity添加到当前 
     *   Task栈中.注意,这种方式不会启动新的Task,只是将新的 
     *   Activity添加到原有的Task 
     *    
     * 2 singleTop: Task顶单例模式 
     *   该模式和standard模式基本一致,但有一点不同:当将要被 
     *   启动的Activity已经位于Task栈顶时,系统不会重新创建 
     *   目标Activity实例,而是直接复用Task栈顶的Activity 
     *    
     * 3 singleTask: Task内单例模式 
     *   采用该加载模式时,Activity在同一个Task内只有一个实例. 
     *   当系统采用singleTask模式加载Activity时,又分为以下 
     *   三种情况: 
     *   (1)如果将要启动的Activity不存在,那么系统将会创建该 
     *      实例,并将其加入Task栈顶 
     *   (2)如果将要启动的Activity已存在,且存在栈顶,那么此时 
     *      与singleTop模式的行为相同 
     *   (3)如果将要启动的Activity存在但是没有位于栈顶,那么 
     *      此时系统会把位于该Activity上面的所有其他Activity 
     *      全部移出Task,从而使得该目标Activity位于栈顶 
     *       
     * 4 singleInstance: 全局单例模式 
     *   在此种加载模式下,无论从哪个Task中启动目标Activity,只会 
     *   创建一个目标Activity实例且会用一个全新的Task栈来装载该 
     *   Activity实例. 
     *   当系统采用singleInstance模式加载Activity时,又分为以下 
     *   两种情况: 
     *   (1)如果将要启动的Activity不存在,那么系统将会先创建一个 
     *      全新的Task,再创建目标Activity实例并将该Activity实例 
     *      放入此全新的Task中 
     *   (2)如果将要启动的Activity已存在,那么无论它位于哪个应用 
     *      程序,哪个Task中;系统都会把该Activity所在的Task转到 
     *      前台,从而使该Activity显示出来 
     *  
     * Android对于Activity的管理方式--> 
     * Android采用Task来管理多个Activity. 
     * 当启动一个APP时,Android就会为之创建一个Task 
     * 然后启动这个应用的入口Activity. 
     * 但是Android并没有为Task提供API,开发者无法真正 
     * 地访问Task,只能调用Activity的getTaskId()方法来 
     * 获取其所在的Task的ID.事实上,我们可以把Task理解成 
     * Activity栈,Task以栈的形式来管理Activity:将不断启 
     * 动的Activity压入栈.即:先启动的Activity被放入栈底, 
     * 后启动的Activity放在Task栈顶 
     *  
     * 测试步骤及解释: 
     * 1 进入MainActivity,点击按钮进入AnotherActivity. 
     * 2 此时在AnotherActivity界面.目前在Task栈中有两个 
     *   Activity.由下至上为:MainActivity-->AnotherActivity 
     * 3 在AnotherActivity界面点击按钮,系统以标准模式 
     *   再次加载一个MainActivity 
     * 4 此时在MainActivity界面.目前在Task栈中有三个Activity. 
     *   由下至上为:MainActivity-->AnotherActivity-->MainActivity 
     * 5 此时在MainActivity界面,再点击按钮准备进入AnotherActivity 
     *   系统将以singleTask模式再次加载AnotherActivity.正因为 
     *   是以singleTask模式加载,所以会清除AnotherActivity上部 
     *   的所有Activity. 
     * 6 此时在AnotherActivity界面.目前在Task栈中有两个 
     *   Activity.由下至上为:MainActivity-->AnotherActivity 
     *   这就和第二步的状态一致了 
     *  
     * 备注说明: 
     * 注意配置文件 
     * android:launchMode="standard" 
     * android:name="cc.testlaunchmode2.MainActivity" 
     * ............................................... 
     * android:launchMode="singleTask" 
     * android:name="cc.testlaunchmode2.AnotherActivity" 
     *  
     * 参考资料: 
     * Android疯狂讲义(第二版) 
     * Thank you very much 
     */  
    public class MainActivity extends Activity {  
        private Button mButton;  
        private TextView mTextView;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            init();  
        }  
          
        private void init(){  
            mTextView=(TextView) findViewById(R.id.textView);  
            mTextView.setText("当前Activity:"+" "+this.toString()+" "+"当前TaskId:"+this.getTaskId());  
            mButton=(Button) findViewById(R.id.button);  
            mButton.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View view) {  
                    Intent intent=new Intent(MainActivity.this, AnotherActivity.class);  
                    startActivity(intent);  
                }  
            });  
        }  
          
          
      
    }  
     
    AnotherActivity如下:
    [java]  
    package cc.testlaunchmode2;  
      
    import android.os.Bundle;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Button;  
    import android.widget.TextView;  
    import android.app.Activity;  
    import android.content.Intent;  
      
    public class AnotherActivity extends Activity {  
        private Button mButton;  
        private TextView mTextView;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.another);  
            init();  
        }  
          
        private void init(){  
            mTextView=(TextView) findViewById(R.id.textView);  
            mTextView.setText("当前Activity:"+" "+this.toString()+" "+"当前TaskId:"+this.getTaskId());  
            mButton=(Button) findViewById(R.id.button);  
            mButton.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View view) {  
                    Intent intent=new Intent(AnotherActivity.this, MainActivity.class);  
                    startActivity(intent);  
                }  
            });  
        }  
          
      
    }  
     
    main.xml如下:
    [html]  
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
       >  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="Activity加载模式详解"   
            android:layout_centerHorizontal="true"  
        />  
          
        <Button  
            android:id="@+id/button"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="以singleTask方式启动AnotherActivity"   
            android:layout_centerHorizontal="true"  
            android:layout_marginTop="100dip"  
            />  
          
        <TextView  
            android:id="@+id/textView"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_centerInParent="true"  
         />  
      
    </RelativeLayout>  
     
    another.xml如下:
    [html]  
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
       >  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="Activity加载模式详解"   
            android:layout_centerHorizontal="true"  
        />  
          
        <Button  
            android:id="@+id/button"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="以standard方式启动MainActivity"   
            android:layout_centerHorizontal="true"  
            android:layout_marginTop="100dip"  
            />  
          
        <TextView  
            android:id="@+id/textView"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_centerInParent="true"  
         />  
      
    </RelativeLayout>  
     
    AndroidManifest.xml如下:
    [html]  
    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="cc.testlaunchmode2"  
        android:versionCode="1"  
        android:versionName="1.0" >  
      
        <uses-sdk  
            android:minSdkVersion="14"  
            android:targetSdkVersion="14" />  
      
        <application  
            android:allowBackup="true"  
            android:icon="@drawable/ic_launcher"  
            android:label="@string/app_name"  
            android:theme="@style/AppTheme" >  
            <activity  
                android:launchMode="standard"  
                android:name="cc.testlaunchmode2.MainActivity"  
                android:label="@string/app_name" >  
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />  
      
                    <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
            </activity>  
              
            <activity    
                android:launchMode="singleTask"  
                android:name="cc.testlaunchmode2.AnotherActivity">  
            </activity>  
        </application>  
      
    </manifest>  
  • 相关阅读:
    JavaScript (new)创建一个对象的过程
    我所理解的promise的then方法
    promise与async和await的区别
    JS Promise实例 then()方法
    电脑上不去网
    es6----set map应用场景
    ES6新特性一览
    es6继承
    es6中class类的全方面理解(一)
    时间处理金字教程
  • 原文地址:https://www.cnblogs.com/guiqw/p/5160254.html
Copyright © 2020-2023  润新知