如果你喜欢分享,一起加入群: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>跟上一个结论没什么两样,这里就不重复了。