关于Activity启动,总有些东西你可能不清楚(二)
2017-04-04 21:34
357 查看
如果你喜欢分享,一起加入群: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都会出栈(包括自己),并且在创建一个新的实例入栈。
下面我们就根据源码来验证上面三条结论吧:
==第一条结论==
布局就是普通布局文件,里面有按钮可以跳转而已,布局文件和manifest文件都不粘了。
结果
图一
参照第一条结论,是不是相当于在secondActivity中设置了singTask属性。
==第二条结论==
我们把代码稍微修改下
在manifest里面对secondActivity进行修改
结果
大家可以看到使用FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK配合使用不仅不会调用onNewIntent方法,还会把secondActivity销毁掉运行onDestory(),并且重新创建新的实例放入栈中。
下面我们来看看三次点击,栈里面都发生了些什么(四条信息,第一条是进来之后就有的):
第一次点击
新开辟了一个栈,将secondActivity放入栈中。
第二次点击
将ThirdActivity放入新栈中
第三次点击
将secondActivity和ThirdActivity统统弹栈,并在此创建一个secondActivity放入栈中。
==第三条结论==
跟上一个结论没什么两样,这里就不重复了。
更新了图片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.printl c05c n("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>
跟上一个结论没什么两样,这里就不重复了。
相关文章推荐
- 关于Activity启动,总有些东西你可能不清楚(一)
- 关于应用程序启动,你可能不知道的东西
- SVN管理android项目用svn控制版本,svn本身是不会识别哪些该传,哪些不该传,这就导致有些关于路径的东西(比如拓展jar的路径)也被上传了,而当别人下载后,那个路径对于这个人可能完全不存在,
- 关于应用程序启动,你可能不知道的东西
- 关于启动Activity之间的及普通按钮的点击事件
- 关于activity的4中启动方式
- 关于DHCP――一些你可能不知道的东西
- 关于Activity缩小到通知栏,再点击通知栏启动的效果_QQ效果
- 关于Android隐式启动Activity
- 关于Android隐式启动Activity的分析和说明
- 关于activity的singletask启动模式记录
- 关于Android隐式启动Activity
- activity关于onNewIntent函数的触发与启动模式的关系
- 你是老鸟吗?但是有些你可能目前都不知道的东西
- 关于Android隐式启动Activity
- 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解
- 关于Android隐式启动Activity(2)
- 有些东西从看的明到看的有感觉了,层次可能就不一样了。
- (转)关于启动Activity的ActivityNotFoundException
- Android关于Activity和task以及近期任务栏启动的相关思考