Activity 启动模式个人见解
2016-06-16 17:59
316 查看
Android 开发中我们打交道最多的就是Activity,Activity 有四种启动模式,每一种启动模式都代表着特定的使用场合了解Activity 的启动模式,可以对我们使用Activity得心应手。
代码如下,
两幅图让你清晰明了的懂
![](https://img-blog.csdn.net/20160616154129560)
当前MainActivity实例是 3364163
当前MainActivity的TaskID是:13
我们再去启动一个当前Activity 后,
![](https://img-blog.csdn.net/20160616155434231)
可以看到再次开启的MainActivity
实例是 436f4f9
TaskID 是 13
由此我们可以得出结论:
Standard模式下,所有的Activity全部是在一个堆栈中,每一个Activity都是一个单独的实例,当我们按返回键的时候,弹出栈顶的activity实例,然后在顶部activity下面的Activity显示出来,占据栈顶!
MainActivity:
BActivity :
步骤:
初始化MainActivity,先启动BActivity
在BActivity中启动MainActivity
此时,如果我们点击返回键,就会推出程勋,回到手机界面。
分析:
步骤1 的时候,在堆栈中产生了2个activity实例,MainActivity和BActivity ,接着去步骤2,这时候有了变化,因为堆栈中存在MainActivity实例,所以我们不会再去新创建一个新的MainActivity实例,而是把存在堆栈底部的MainActivity实例拿出来使用,那么问题来了,怎么拿出来??
很暴力的,MainActivity直接把在他上面的BActivity 弹出了堆栈,自己占据栈顶!此时,堆栈中只有MainActivity一个实例,所以按返回键,就自然退出程序了!
![](https://img-blog.csdn.net/20160616164905363)
在配上这幅图,绝壁懂了!
初始化MainActivity ,启动MainActivity 无任何变化,实例也未改变
![](https://img-blog.csdn.net/20160616171943789)
初始化MainActivity ,启动BActivity,在启动MainActivity
此时MainActivity 的实例发生变化
![](https://img-blog.csdn.net/20160616172119971)
得出结论:
SingleTop 模式下,启动的实例如果存在栈顶,ActivityManager并不会新建一个实例,而是选 择复 用原来的实例来保持singleTop中的唯一性,只会去调用onNewIntent方法如何实例不在栈顶,那么会再次创建一个实例,堆栈中会存在两个相同的实例。
![](https://img-blog.csdn.net/20160616173114868)
此图绝壁懂!
![](https://img-blog.csdn.net/20160616175054349)
这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入
使用代码实现
最后,说下在哪里配置启动模式
![](https://img-blog.csdn.net/20160616175653531)
到此,Activity的四种启动模式就啰嗦完毕,理解四种模式,合理的使用,会使开发事半功倍。如果有帮到你,就多来逛逛。谢谢
Activity Standard启动模式
standard是我们使用activity 的标准模式,大部分全部是默认standard模式,也称默认模式代码如下,
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId()); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,MainActivity.class)); } }); }
两幅图让你清晰明了的懂
当前MainActivity实例是 3364163
当前MainActivity的TaskID是:13
我们再去启动一个当前Activity 后,
可以看到再次开启的MainActivity
实例是 436f4f9
TaskID 是 13
由此我们可以得出结论:
Standard模式下,所有的Activity全部是在一个堆栈中,每一个Activity都是一个单独的实例,当我们按返回键的时候,弹出栈顶的activity实例,然后在顶部activity下面的Activity显示出来,占据栈顶!
Activity SingleTask 启动模式
先看代码MainActivity:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId()); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,MainActivity.class)); } }); findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,BActivity.class)); } }); }
BActivity :
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.b); tv = (TextView) findViewById(R.id.tv); tv.setText("当前activity是:" + this.toString() + "\n" + "当前TaskID:" + getTaskId()); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(BActivity.this, MainActivity.class)); } }); findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(BActivity.this, BActivity.class)); } }); }
步骤:
初始化MainActivity,先启动BActivity
在BActivity中启动MainActivity
此时,如果我们点击返回键,就会推出程勋,回到手机界面。
分析:
步骤1 的时候,在堆栈中产生了2个activity实例,MainActivity和BActivity ,接着去步骤2,这时候有了变化,因为堆栈中存在MainActivity实例,所以我们不会再去新创建一个新的MainActivity实例,而是把存在堆栈底部的MainActivity实例拿出来使用,那么问题来了,怎么拿出来??
很暴力的,MainActivity直接把在他上面的BActivity 弹出了堆栈,自己占据栈顶!此时,堆栈中只有MainActivity一个实例,所以按返回键,就自然退出程序了!
在配上这幅图,绝壁懂了!
Activity SingleTop 启动模式
步骤:初始化MainActivity ,启动MainActivity 无任何变化,实例也未改变
初始化MainActivity ,启动BActivity,在启动MainActivity
此时MainActivity 的实例发生变化
得出结论:
SingleTop 模式下,启动的实例如果存在栈顶,ActivityManager并不会新建一个实例,而是选 择复 用原来的实例来保持singleTop中的唯一性,只会去调用onNewIntent方法如何实例不在栈顶,那么会再次创建一个实例,堆栈中会存在两个相同的实例。
此图绝壁懂!
Activity SingleInstance启动模式
这个模式,如图这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入
使用代码实现
Intent i = new Intent(Intent.ACTION_MAIN); i.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i);
最后,说下在哪里配置启动模式
到此,Activity的四种启动模式就啰嗦完毕,理解四种模式,合理的使用,会使开发事半功倍。如果有帮到你,就多来逛逛。谢谢
相关文章推荐
- 市场行情数据
- 25岁的忧伤
- 转载:从程序员的角度看ASCII, GB2312, UNICODE, UTF-8
- 复杂自定义控件---自定义ViewPager的实现
- Java并发编程:Lock
- get utc+8 当时时间
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
- 损失函数
- 【HTML/JS】实现iFrame自适应高度,原来很简单!
- jenkins
- Linux crontab使用详解
- 机器学习算法汇总:人工神经网络、深度学习及其它
- 十一.列表生成式
- php获取文件创建时间、修改时间、访问时间
- spark streaming kafka1.4.1中的低阶api createDirectStream使用总结(转)
- 16进制
- python练习1-猜数游戏
- Android Camera 调用流程
- 个人信息
- http web 返回码概念