`
zyoo005
  • 浏览: 19095 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

如何改变Activity在当前任务堆栈中的顺序

阅读更多

 

本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序。

1. Intent对象的Activity启动标记说明:

FLAG_ACTIVITY_BROUGHT_TO_FRONT:

应用程序代码中通常不设置这个标记,而是由系统给单任务启动模式的Activity的设置。

FLAG_ACTIVITY_CLEAR_TASK:

如果给Intent对象添加了这个标记,那么在Activity被启动之前,会导致跟这个Activity关联的任何既存的任务都被清除。也就是说新的Activity会成为一个空任务的根,而其他任何Activity都会被销毁。它紧跟FLAG_ACTIVITY_NEW_TASK联合使用。

FLAG_ACTIVITY_CLEAR_TOP:

如果给Intent对象设置这个标记,并且要启动的Activity在当前任务中已经运行了,那么不是创建一个这个Activity的新的实例,而是把堆栈中这个Activity之上的所有其他Activity都关掉,然后把新的Intent对象发送给这个既存的Activity(这时它在堆栈的顶部)。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_REST:

如果给Intent对象设置了这个标记,那么在这个任务被复位时,在任务的Activity堆栈中这个标记点之后的Activity都应该被清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:

如果给Intent对象设置了这个标记,那么新的Activity不会被保留在最近启动的Activity的列表中。

FLAG_ACTIVITY_FORWARD_RESULT:

如果给Intent对象设置了这个标记,并且这个Intent对象被用于从一个既存的Activity中启动一个新的Activity,然后将这个既存Activity的回复目标转移到新的Activity。使用这种方式获取的新的Activity能够调用setResult(int)方法,把结果返回给原始的Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY:

这个标记通常不由应用程序代码来设置,如果是从历史中启动这个Activity,系统就会设置这个标记。

FLAG_ACTIVITY_MULTIPLE_TASK:

除非实现自己的顶层应用程序启动器,否则不使用这个标记。

FLAG_ACTIVITY_NEW_TASK:

如果给Intent对象设置了这个标记,在历史堆栈之上,这个Activity将成为一个新任务的起点。

FLAG_ACTIVITY_NO_ANIMATION:

如果给Intent对象设置了这个标记,那么将会阻止系统在Activity间切换的动画变换。

FALG_ACTIVITY_NO_HISTORY:

如果给Intent对象设置了这个标记,那么新的Activity将不会被保留在历史堆栈中。

FLAG_ACTIVITY_NO_USER_ACTION:

如果给Intent对象设置了这个标记,在新启动到前台的Activity被挂起之前,它会阻止

普通的onUserLeaveHint()方法的回调。如果电话拨号或闹钟程序就要使用这个标记来启动Activity。

FLAG_ACTIVITY_PREVIOUS_IS_TOP:

如果给Intent对象设置了这个标记,并且这个Intent对象被用于从一个既存的Activity中启动一个新的Activity,这个Activity不能用于接受发送给顶层Activity的新的Intent对象,通常认为使用这个标记启动的Activity会被自己立即终止。

FLAG_ACTIVITY_REORDER_TO_FRONT:

如果给Intent对象设置了这个标记,那么将会导致任务历史堆栈中既存的Activity被带到前台。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

如果给Intent对象设置了这个标记,并且这个Activity在一个新任务中被启动,也可以在既存的任务堆栈中被带到顶层,那么它就会被作为任务的前门来启动。

FLAG_ACTIVITY_SINGLE_TOP:

如果给Intent对象设置了这个标记,如果要启动的Activity已经在历史堆栈的顶层运行,那么这个Activity就不会被启动。

FLAG_ACTIVITY_TASK_ON_HOME:

如果给Intent对象设置了这个标记,那么它会导致新启动的任务被放到当前的主Activity任务之上。

2. 示例代码

2.1. 定义清单文件(AndroidManifest.xml)

 

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="my.android.test"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".ReorderOnLaunch"

                  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:name=".ReorderTwo" />

        <activity android:name=".ReorderThree" />

        <activity android:name=".ReorderFour" />

    </application>

    <uses-sdk android:minSdkVersion="9" />\

</manifest>
 

 

2.2. 定义字符串资源(strings.xml)

 

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World, ReorderOnLaunch!</string>

    <string name="app_name">ReorderOnLaunch</string>

    <string name="reorder_on_launch">This is the first of a sequence of four Activities.  A button on the fourth will use the Intent.FLAG_ACTIVITY_REORDER_TO_FRONT flag to bring the second of the activities to the front of the history stack. After that, proceeding back through the history should begin with the newly-frontmost second reorder activity, then the fourth, the third, and finally the first.</string>

    <string name="reorder_launch_two">Go to the second</string>

    <string name="reorder_two_text">This is the second in a sequence of four Activities.</string>

    <string name="reorder_launch_three">Go to the third</string>

    <string name="reorder_three_text">This is the third of a sequence of four Activities.</string>

    <string name="reorder_launch_four">Go to the fourth</string>

    <string name="reorder_four_text">This is the last in a sequence of four Activities.</string>

    <string name="reorder_second_to_front">Bring the second in front</string>

</resources>
 

 

2.3. 定义布局文件

reorder_on_launch.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:padding="4dip"

    android:gravity="center_horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="match_parent" android:layout_height="wrap_content"

        android:layout_weight="0"

        android:paddingBottom="4dip"

        android:text="@string/reorder_on_launch"/>

     <Button android:id="@+id/reorder_launch_two"

        android:layout_width="wrap_content" android:layout_height="wrap_content"

        android:text="@string/reorder_launch_two">

    </Button>

</LinearLayout>
 

 

reorder_two.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:padding="4dip"

    android:gravity="center_horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="match_parent" android:layout_height="wrap_content"

        android:layout_weight="0"

        android:paddingBottom="4dip"

        android:text="@string/reorder_two_text"/>

     <Button android:id="@+id/reorder_launch_three"

        android:layout_width="wrap_content" android:layout_height="wrap_content"

        android:text="@string/reorder_launch_three">

    </Button>

</LinearLayout>
 

 

reorder_three.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:padding="4dip"

    android:gravity="center_horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="match_parent" android:layout_height="wrap_content"

        android:layout_weight="0"

        android:paddingBottom="4dip"

        android:text="@string/reorder_three_text"/>

    <Button android:id="@+id/reorder_launch_four"

        android:layout_width="wrap_content" android:layout_height="wrap_content"

        android:text="@string/reorder_launch_four">

    </Button>

</LinearLayout>
 

 

reorder_four.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:padding="4dip"

    android:gravity="center_horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="match_parent" android:layout_height="wrap_content"

        android:layout_weight="0"

        android:paddingBottom="4dip"

        android:text="@string/reorder_four_text"/>

    <Button android:id="@+id/reorder_second_to_front"

        android:layout_width="wrap_content" android:layout_height="wrap_content"

        android:text="@string/reorder_second_to_front">

    </Button>

</LinearLayout>
 

 

 

2.4. 创建Activity

 

ReorderOnLaunch.java

package my.android.test;



import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;



publicclass ReorderOnLaunch extends Activity {

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.reorder_on_launch);

        Button twoButton = (Button)findViewById(R.id.reorder_launch_two);

        twoButton.setOnClickListener(mClickListener);

    }   

    privatefinal OnClickListener mClickListener = new OnClickListener(){

    publicvoid onClick(View v){

        startActivity(new Intent(ReorderOnLaunch.this, ReorderTwo.class));

    }

    };

}
 

 

ReorderTwo.java

 

package my.android.test;



import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;



publicclass ReorderTwo extends Activity {

    @Override

    protectedvoid onCreate(Bundle saveState){

       super.onCreate(saveState);

       setContentView(R.layout.reorder_two);      

       Button twoButton = (Button)findViewById(R.id.reorder_launch_three);

       twoButton.setOnClickListener(mClickListener);

    }

    privatefinal OnClickListener mClickListener = new OnClickListener(){

       publicvoid onClick(View v){

           startActivity(new Intent(ReorderTwo.this, ReorderThree.class));

       }

    };



}
 

 

ReorderThree.java

 

package my.android.test;



import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;



publicclass ReorderThree extends Activity {



    privatefinal OnClickListener mClickListener = new OnClickListener(){

       publicvoid onClick(View v){

           startActivity(new Intent(ReorderThree.this, ReorderFour.class));

       }

    };



    @Override

    protectedvoid onCreate(Bundle saveState){

       super.onCreate(saveState);

       setContentView(R.layout.reorder_three);

       Button twoButton = (Button)findViewById(R.id.reorder_launch_four);

       twoButton.setOnClickListener(mClickListener);

    }

}
 

 

ReorderFour.java

 

package my.android.test;



import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;



publicclass ReorderFour extends Activity {

    @Override

    protectedvoid onCreate(Bundle saveState){

       super.onCreate(saveState);    

       setContentView(R.layout.reorder_four);     

       Button twoButton = (Button)findViewById(R.id.reorder_second_to_front);

       twoButton.setOnClickListener(mClickListener);

    }



    privatefinal OnClickListener mClickListener = new OnClickListener(){

       publicvoid onClick(View v){

           Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);

           intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

           startActivity(intent);

       }

    };

}
 

 

 

 

分享到:
评论

相关推荐

    Activity堆栈管理demo

    任务(Task)是Android系统组织Activity的一个概念,它是一个包含多个Activity的堆栈,这些Activity按照它们被启动的顺序被压入堆栈中。任务有两种模式:标准模式(SingleTop)和栈顶复用模式(SingleTask)。在标准...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    ### Android 中从Activity1跳转到Activity2再回到Activity1所经历的生命周期 在Android开发过程中,理解Activity的...在实际开发中,正确处理这些生命周期方法是非常重要的,特别是在涉及复杂的用户交互和后台任务时。

    Android activity堆栈及管理实例详解

    本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序。 1. Intent对象的Activity启动标记说明: FLAG_ACTIVITY_BROUGHT_TO_FRONT 应用程序代码中通常不设置这个标记,而是由系统给...

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    在Android中,默认情况下,当设备方向发生改变时(从横屏变为竖屏或相反),系统会销毁当前`Activity`实例并重新创建它。这导致了一系列生命周期方法的调用顺序如下: 1. **onSaveInstanceState()**:系统调用此...

    Android学习笔记-Activity篇

    2. 定义launch模式:在AndroidManifest.xml中,可以通过`android:launchMode`属性定义Activity的启动模式,如标准模式(standard)、单实例模式(singleInstance)、单任务模式(singleTask)和单栈顶模式...

    activity四种启动模式demon

    3. **单任务模式(SingleTask)**:当Activity以这种方式启动时,系统会在当前任务栈中查找是否存在该Activity的实例。如果有,就将栈中所有在其之上的Activity移除,然后将焦点返回到这个Activity;如果没有,就...

    Android自学笔记-16-任务栈

    在任务栈中,Activity的顺序反映了用户的历史操作路径。 四、Intent Flag与任务管理 开发者可以通过设置Intent的Flag来控制Activity的启动行为,例如: - `FLAG_ACTIVITY_NEW_TASK`:创建一个新的任务栈,通常与`...

    Android模拟Activity进出栈Demo.zip

    3. **任务和栈的概念**:在Android中,任务(Task)是一组按顺序排列的Activity,这些Activity共享同一个堆栈。当用户启动一个新的Activity时,如果它没有指定父任务,那么它会被添加到当前任务的栈顶。 4. **...

    Android 任务管理器源码.zip

    5. **ActivityStackSupervisor**:这个类是AMS的辅助类,负责管理和调度不同的ActivityStack(任务堆栈)。它处理多窗口模式、屏幕方向变化、任务重排序等复杂场景。 6. **AppOpsService**:除了基本的任务管理,...

    安卓Android源码——模拟Activity进出栈.zip

    在安卓系统中,每个启动的Activity都会被放入一个称为任务(Task)的堆栈中,这个堆栈被称为Activity栈。当用户启动一个新的Activity时,系统会将其压入栈顶;而当用户返回到前一个Activity时,栈顶的Activity会被弹...

    Android高级应用源码-模拟Activity进出栈.zip

    每当用户启动一个新的Activity,系统都会将它压入当前任务的堆栈中。当用户按下返回键或者通过其他方式退出Activity时,系统会从堆栈顶部弹出该Activity。这种机制被称为“后进先出”(LIFO)原则,它确保了用户操作...

    Boot process and Manage of the Activity

    BACKStack是指位于当前Task中,但不在前台显示的Activity栈,用户在Back键被按下的时候会触发。Affinity是定义Activity之间关联性的属性,它可以指定一个Activity可以属于哪个Task,允许在跨应用的情况下控制...

    Android课程第一次实验报告_Andorid应用程序Activity生命周期.docx

    前端进程包含当前与用户交互的Activity,可视进程包含屏幕上的非前台Activity,服务进程包含运行中的Service,后台进程包含已停止的Activity,空进程则没有活动组件。系统在内存不足时,按照这些层次从低优先级开始...

    Switching_activity_AIDE(beporsam.ir)_between_android_

    使用:在启动Activity时,可以通过设置Intent的Flags来改变默认行为,例如FLAG_ACTIVITY_NEW_TASK用于创建新的任务栈,FLAG_ACTIVITY_CLEAR_TOP则会清除当前任务栈中的所有Activity,只保留目标Activity在栈顶。...

    Android任务管理器源码.zip

    在任务管理中,Intent常用来启动新的任务或者将当前任务与现有任务关联。 学习资料可能涵盖了如何使用ActivityManager类来获取当前运行的任务列表,如何分析任务堆栈,以及如何通过Intent flags来控制活动的行为,...

    Android编程中Activity的四种启动模式

    首次启动时,系统会在当前任务中创建Activity的新实例;如果该Activity已经存在,系统会销毁它上面的所有Activity,并调用已存在实例的onNewIntent()方法。此外,singleTask模式允许其他Activity与该Activity在同一...

    中文版Android开发指南

    Activity的加载模式有多种,如标准模式、单实例模式、单任务模式和单栈顶模式,它们影响Activity如何在任务堆栈中创建和管理。 ### 7. 清理堆栈 Android提供了清理堆栈的操作,例如,当用户按后退键时,系统会默认...

Global site tag (gtag.js) - Google Analytics