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