Android Activity跳转flag

参考自http://my.oschina.net/u/1244156/blog/228483

关于几个flag

1.FLAG_ACTIVITY_NEW_TASK

当进行一个activity跳转,A->B,若跳转的activityB,在系统内无其(activityB)的task(亦即属于该activity的应用栈),则新建一个task;若已经有该activityB的task,则不再新建task;

若无包含该flag,则系统则不创建新task,该activity将放在调用者的task里

下图比较生动的展示了这个过程(参考自开头的博客链接)

无FLAG_ACTIVITY_NEW_TASK的情况:

activtyB直接进入调用者的task里

有FLAG_ACTIVITY_NEW_TASK的情况:

activityB在自己的task里

2.FLAG_ACTIVITY_CLEAR_TOP:此flag表示,当跳转时(activityA->activityB),若发现activityB已经在task里,且activityB不在task顶部,则会吧activityB顶部的activity全部清空,是activity保持在task的最顶部。默认情况下,activityB会重新创建自己(即重走activity的创建生命周期oncreat——>onresume)

我自己写了一个代码试验,内容为主Activity,BActivity以及CActivity,主Activity跳转到BActivity,BActivity跳转到CActivity

其中BActivity跳转到CActivity的intent中添加了该flag

代码如下:

主Activity

public class MainActivity extends Activity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("这里是主activity的onCreate");
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent(MainActivity.this,BActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        System.out.println("这里是主activity的onResume");
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        System.out.println("这里是主activity的onPause");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        System.out.println("这里是主activity的onDestroy");
    }
}

 

BActivity

public class BActivity extends Activity {
    
    private Button button=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.b_activity);
        System.out.println("这里是B-onCreat");
        
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent(BActivity.this,CActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        System.out.println("这里是B-onResume");
    }

    @Override
    protected void onNewIntent(Intent intent) {
        // TODO Auto-generated method stub
        super.onNewIntent(intent);
        System.out.println("这里是B-onNewIntent");
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        System.out.println("这里是B-activity的onPause");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        System.out.println("这里是B-activity的onDestroy");
    }
}

CActivity

public class CActivity extends Activity{
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.c_activity);
        System.out.println("这里是C-activity的onCreate");
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent(CActivity.this,BActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(intent);
            }
        });
        
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        System.out.println("这里是C-activity的onResume");
    }
    
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        System.out.println("这里是C-activity的onPause");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        System.out.println("这里是C-activity的onDestroy");
    }

}

1.初始化主Activity,打印显示该activity创建的过程

2.点击跳转按钮,来到BActivity,主activity被BActivity压在了task底部

3.继续点击跳转按钮,和第二步过程一样,CActivity压入task,此时task里有主activiy,BActivity,CActivity,CActivity在最顶端,主Activity在最底部

4.从CActivity进行加了flag的跳转,由图可以看出,首先CActivity进行了onPause,然后BActivity直接销毁后重新进行实例化,之后CActivity被销毁

可以看出CActivity的确被弹出task

5.在BActivity按了后退按钮,退到了是主Activity而不是CActivity,进一步可以说明CActivity已经被弹出task

3.FLAG_ACTIVITY_SINGLE_TOP:在第2个flag的解释中,默认情况activityB会重新创建自己,但若同时使用了FLAG_ACTIVITY_SINGLE_TOP,则该activityB不会重新传建自己,而是在onNewIntent里面进行重新实例化

这个也做了测试,只需把上面的代码intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);改为
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);即可

结果如下图,很明显此次CActivity跳转到BActivity时,进行的是onNewIntent方法,而不是销毁BActvity再重新实例化

4.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:此flag表示,若intent包含该flag,此intent转向的activityB,一旦该activityB所在的task重置,则该activtyB以及activityB以上的activity会清除掉。而task重置会发生在,当一个应用存放在后台,重新点击应用进入界面,此操作系统将自动携带FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的flag,此时task将会重置。

此flag的效果也进行了测验,通过将主Activity到BActivity的intent附上该flag即可测试

测试过程为打开主Activity,跳转到BActivity,在跳转到CActivity,按home键退出,再打开软件

通过看控制台的输出,可以明显看到,当从桌面点击程序回到程序,BActivity,CActivity都被销毁,打开程序后显示的界面是主Activity

另外在测试中可以看到FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET在Api21之后已经不推荐使用,建议使用FLAG_ACTIVITY_NEW_DOCUMENT,经测试,效果和FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET一样

5.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:这个flag与上一个flag可以互相结合着使用,总共有两种情况起作用:启动activity时,创建新的task;已存在后台的task被重新放到前台上

该flag适用于,当你希望你的应用在打开其他应用的activity后,按home键返回,之后再打开软件看到的依旧是你自己应用的界面,而不是其他应用的界面,避免给用户造成开错软件的错觉,则可以使用此flag,与FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET/FLAG_ACTIVITY_NEW_DOCUMENT搭配使用即可

时间: 2024-11-06 07:12:32

Android Activity跳转flag的相关文章

Activity跳转Flag你想知道的都在这了

Android 的一个特色就是 application A 的 activity 可以启动 application B 的 activity,尽管 A 和 B 是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体.Android 就是把这种误觉定义为 Task,它既不是 class,也不是 AndroidMainifest.xml 中的一个元素.从表现上看 Task 就像是一个 stack,一个一个的 activity 是构成 stack 的元素,做着入栈 (push) 和出栈

android activity 跳转传值问题研究

Java代码   intent = new Intent(); intent.setClass(LoginActivity.this, RegActivity.class); Java代码   startActivity(intent); 因为刚学android.所以在很多的时候.不知道从什么地方下手! 可是,我曾经记得我恩师说过这么一句话! 不管那个编程语言.能把一个简单的登陆做的好!算是已经基本入门了! 所以我测试做了一个android的登陆! 可是在运行中!我想弄一个按钮,为"注册&quo

Android——Activity跳转

目的:实现Activity之间的跳转 Activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:

Android Activity跳转动画,让你的APP瞬间绚丽起来

我们都知道绚丽的APP总会给用户耳目一新的感觉,为了抓住用户更大网络公司使出浑身解数让自己的产品更绚丽,而绚丽最简单的效果就是Activity跳转效果,不仅可以让用户看起来舒服,而且实现起来也特别简单,好,下面就让我们实现这些效果,告别原生态的跳转效果吧! 首先新建一个Android项目,起名叫作AndroidSwitch.实在不知道起什么名字了,就有道了一个这样的名字,首先让我们先看一下XML代码很简单,就一个LIstview 代码如下所示: <LinearLayout xmlns:andro

Android activity跳转方式

方法一:通过SetContentView切换Layout来实现界面的切换,这种方法相当于重绘Activity. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnInsert = (Button) this.findViewById(R.id.btnInsert); //

关于Android Activity启动的flag和启动模式

最近因为项目需求当中,需要按一个按键,退回到指定的Activity,有可能是连续退几个Activity,第一时间想到的是多写几个finish()......然后想想就不可能,查了下Activity的相关资料,假如需要回退到Activity A,那么把A的启动模式设置为singleTask就可以了,在Manifest.xml中A的声明里面加上一句话,Android::launchmode ="singleTask",当然这样会导致每次启动A的时候都会清除掉Activity栈中A上面的所有

android Activity跳转到指定的Fragment

在要跳转的activity中的按钮写: //一.先跳转到主MyActivityFragment,通过传递参数让他接受 case R.id.grxxbut: Intent show=new Intent(GrXxActivity.this,MyActivityFragment.class); show.putExtra("grxx",1); startActivity(show); finish(); break; //二.这个是fragment的主方法 public class MyA

Android activity跳转并且回调

假设A页面要跳到B页面,A页面需要获取B页面传回来的参数来确定显示哪个列表.主要代码如下: 在A页面中:               Intent intent =  new Intent();               intent.setClass(A.this,  B.class);               startActivityForResult(intent,REQUESTCODE);//REQUESTCODE定义一个整型做为请求对象标识 跳转到B,在B页面中:       

[Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4389674.html 需求:在ActivityA跳转到ActivityB,然后在ActivityB操作完返回数据给ActivityA. 这个很普遍的需求,一般情况是使用startActivityForResult的方式去完成. 但是当ActivityB为SingleTask时,这个方式就无效了.你会发现当你执行startActivityForResult后,o