码迷,mamicode.com
首页 > 移动开发 > 详细

Android Activity跳转flag

时间:2015-07-10 11:14:55      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

参考自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搭配使用即可

Android Activity跳转flag

标签:

原文地址:http://www.cnblogs.com/lck14/p/4634310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!