如果你喜欢分享,一起加入群:524727903
更新了图片2017.10.22
FLAG_ACTIVITY_CLEAR_TOP
现不妨说一下结论
例如A启动B
1. FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP配合使用相当于B在manifest文件中设置singTask,==会==回调onNewIntent();
2. FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK配合使用相当于B在manifest文件中设置singTask,==不会==回调onNewIntent();
3. 只设置FLAG_ACTIVITY_CLEAR_TOP,在此上面的Activity都会出栈(包括自己),并且在创建一个新的实例入栈。
下面我们就根据源码来验证上面三条结论吧:
==第一条结论==
public class MainActivity extends AppCompatActivity {
private TextView tv;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String yaoyan = savedInstanceState.getString("yaoyan");
System.out.println("onCreate-yaoyan = " + yaoyan);
}
System.out.println("MainActivity.onCreate.this = " + this);
}
public void jumpsecondActivity(View view) {
Intent intent = new Intent();
intent.setClass(this,secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}
public class secondActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scond_activity);
System.out.println("secondActivity.onCreate.this"+this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
System.out.println("secondActivity.onNewIntent.this = " + this);
}
public void jumpMainActivity(View view){
Intent intent = new Intent();
intent.setClass(this,ThiredActivity.class);
startActivity(intent);
}
}
public class ThiredActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thired_activity);
System.out.println("ThiredActivity.onCreate.this = " + this);
}
public void jumpOther(View view) {
Intent intent = new Intent();
intent.setClass(this, secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
System.out.println("ThiredActivity.onNewIntent.this = " + this);
}
}
布局就是普通布局文件,里面有按钮可以跳转而已,布局文件和manifest文件都不粘了。
结果
图一
参照第一条结论,是不是相当于在secondActivity中设置了singTask属性。
==第二条结论==
我们把代码稍微修改下
public void jumpsecondActivity(View view) {
Intent intent = new Intent();
intent.setClass(this,secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
public void jumpOther(View view) {
Intent intent = new Intent();
intent.setClass(this, secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
在manifest里面对secondActivity进行修改
<activity android:name=".secondActivity"
android:taskAffinity="com.xie.yaoyan"></activity>
结果
大家可以看到使用FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK配合使用不仅不会调用onNewIntent方法,还会把secondActivity销毁掉运行onDestory(),并且重新创建新的实例放入栈中。
下面我们来看看三次点击,栈里面都发生了些什么(四条信息,第一条是进来之后就有的):
第一次点击
新开辟了一个栈,将secondActivity放入栈中。
第二次点击
将ThirdActivity放入新栈中
第三次点击
将secondActivity和ThirdActivity统统弹栈,并在此创建一个secondActivity放入栈中。
==第三条结论==
public void jumpsecondActivity(View view) {
Intent intent = new Intent();
intent.setClass(this,secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
public void jumpOther(View view) {
Intent intent = new Intent();
intent.setClass(this, secondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
<activity android:name=".secondActivity"></activity>
跟上一个结论没什么两样,这里就不重复了。