Android-intent.addFlags-Activity啟動模式


之前寫的Android-Activity啟動模式(launchMode)Android-Activity啟動模式-應用場景,講解的都是在AndroidManifest.xml配置launchMode="四種啟動模式"

Activity啟動模式分為四種:

  

  如果不配置:launchMode,默認就是:standard 標准的

  standard 標准的

  singleTop 獨占頂端

  singleTask 單任務

  singleInstance 單實例

 


 

standard 標准的,特點是:啟動一個Activity就進棧一個Activity,啟動六個Activity就進棧六個Activity

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  // 該Flag相當於Activity啟動模式中的standard。

 

注意:⚠️ intent.addFlags(Activity模式); 為給指定調整的Activity設置此模式

 

/**
     * 啟動 NewActivity
     * @param view
     */
    public void startNewActivity(View view) {
        Intent intent = new Intent(this, NewActivity.class);
        // intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 該Flag相當於Activity啟動模式中的singleTask
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 該Flag相當於Activity啟動模式中的standard。
        // intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以該旗標啟動的Activity不會保留在Activity棧中
        startActivity(intent);
    }

  


 

 

singleTop 獨占頂端,特點是LoginActivity在頂端的時候,啟動LoginActivity會自動重用LoginActivity,不會進棧

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相當於Activity加載模式中的singleTop模式

注意:⚠️ intent.addFlags(Activity模式); 為給指定調整的Activity設置此模式

 

  /**
     * 啟動自己
     * @param view
     */
    public void startThis(View view) {
        Intent intent = new Intent(this, LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相當於Activity加載模式中的singleTop模式
        startActivity(intent);
    }

LoginActivity intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); :

(當LoginActivity在頂端,無論點擊啟動自己多少此都不會進棧 而是重用)

(當點擊返回back鍵的時候,任務棧里面只有一個Activity的引用)

01-02 20:46:06.493 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:07.244 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:07.960 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.545 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.677 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.811 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.947 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.079 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.218 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.364 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.494 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.628 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.761 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.914 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了

 


 

 

singleTask 單任務,特點是單任務,不會有兩個NewActivity引用,NewActivity一旦進棧 就不會再次進棧了

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 該Flag相當於Activity啟動模式中的singleTask

 

注意:⚠️ intent.addFlags(Activity模式); 為給指定調整的Activity設置此模式

 

/**
     * 啟動 NewActivity
     * @param view
     */
    public void startNewActivity(View view) {
        Intent intent = new Intent(this, NewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 該Flag相當於Activity啟動模式中的singleTask
        // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 該Flag相當於Activity啟動模式中的standard。
        // intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以該旗標啟動的Activity不會保留在Activity棧中
        startActivity(intent);
    }

例如:NewActivity設置了 singleTask啟動模式:當啟動過一次NewActivity,再次啟動NewActivity的時候,會自動從棧底往上找,一旦找到NewActivity(一直殺到最頂端)

 

01-02 21:16:54.414 3192-3192/liudeli.activity D/launchMode: LoginActivity 任務棧ID: 89
01-02 21:17:12.164 3192-3192/liudeli.activity D/launchMode: NewActivity 任務棧ID: 89
01-02 21:17:15.201 3192-3192/liudeli.activity D/launchMode: LoginActivity 任務棧ID: 89
01-02 21:17:17.884 3192-3192/liudeli.activity D/launchMode: LoginActivity 任務棧ID: 89
01-02 21:17:18.698 3192-3192/liudeli.activity D/launchMode: LoginActivity 任務棧ID: 89
01-02 21:17:21.416 3192-3192/liudeli.activity D/launchMode: NewActivity 任務棧ID: 89

 


 

 

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以該旗標啟動的Activity不會保留在Activity棧中

 

注意:⚠️ intent.addFlags(Activity模式); 為給指定調整的Activity設置此模式

 

如果不給 NewActivity 添加intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);,任務棧里面會有四個Activity引用

目前給 NewActivity 添加intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);,任務棧里面會有三個Activity引用,NewActivity不會重復的保存到任務棧中

 

 


 

 

完整代碼:

AndroidManifest.xml

     <activity android:name=".launch_mode.LoginActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <activity android:name=".launch_mode.NewActivity" />

 

LoginActivity

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) {
        Intent intent = new Intent(this, NewActivity.class);
        // intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 該Flag相當於Activity啟動模式中的singleTask
        // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 該Flag相當於Activity啟動模式中的standard。
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以該旗標啟動的Activity不會保留在Activity棧中
        startActivity(intent);
    }

    /**
     * 啟動自己
     * @param view
     */
    public void startThis(View view) {
        Intent intent = new Intent(this, LoginActivity.class);
        // intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相當於Activity加載模式中的singleTop模式
        startActivity(intent);
    }

    /**
     * 當Activity被重用了就會調用此方法
     * @param intent
     */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("launchMode", "onNewIntent LoginActivity被重用了");
    }
}

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

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM