"standard,singleTop,singleTask,singleInstance"-Android启动模式
安卓有4种启动模式,下面我们就进行详细的讲解
用栈的思维去理解,就能理解这些启动模式的本质了
先设置两个页面:
A(为测试对象),B两个页面,两个页面都有跳至对方的按钮
一.标准模式(standard)
(默认的,不用设置)
例一:
A->A->A,然后按返回键三次就会退出所有的A界面,过程:A<-A<-A
例二:
A->B->A->A->B,返回过程:A<-B<-A<-A<-B;
就是栈的特点,逐个放入,返回时从栈顶出栈
结论:标准的进栈,出栈
二.单个顶部模式(singleTop)
(在自己的Activity里声明属性:android:lunchuMode=”singleTop”)
这里A是设置的,B是标准的
A->B->A->B 那么返回的过程:A<-B<-A<-B
A->A->B->A->B->B:返回结果是:A<-B<-A<-B<-B
A->A->A->:返回结果:<-A,直接退出;
逐个放入栈,但是设置顶部模式的不能连续两个一起放.所以:设置的顶部模式的窗口活动只能作为一个,不能叠加
结论:放入栈中的新活动,如果刚刚存放的页面在下方(意为相连),那么此活动将不会被连续添加,除非又隔着一个新的活动
三.单个任务模式(singleTask)
(android:lunchMode=”singleTask”)
A->B->A:返回 <-A,直接退出,因为存在了A又放入了A,那么A就把前面的B给顶掉并仅剩一个自己
A->B->A->B:返回 <-A<-B,到A直接退出,把上方A之间的B给顶掉并仅剩一个自己,然后才再放B
逐个放入栈,设置了单个任务的会压掉其他的,并剩一个自己,相当于栈中自己的上方不会有第二个自己.
结论: 栈中自己的上方不会有第二个自己
四.单个实例模式(singleInstance)
(android:lunchMode=”singleTask”)系统就会为这个实例创建一个单独的栈,并且只能放自己这个类型有且只有一个
是单例,所以一个栈只能放一种类型并且设置的单利活动只能放一个,并且新添加的栈会排在前面
如下图:左边设置A为标准,B为单一实例;右边A设置为单一实例,B设置为标准
想必大家都看到上面的问题所在了吧,左边是正常的,右边就出现了问题,我上网查了许多的博客和资料,发现全部都是左边的情况(A标准,B单一实例),没有一篇文章是将右边的情况的(A单,B标),我为此了加了8个群,进去问了半天,除了两个人貌似能回答右边的 情况外没人能够讲解,别人说我没必要那么研究每一步,说开发用户不会用到这个,用其它方案解决,但是我觉得既然发现问题就认真去做,起码这是一个编程人员所需要有的严肃对待性精神
然后希望又来了大家,请看下面的情况,多添加一个页面,又发现正常了
我们设置A是单一实例,B是默认,C是默认,但为什么出现左边的那个问题,有个人说是推出栈,但是我再问他解释的时候他没回答.所以大家,这个小问题想放在这,我下次得到答案后回来这里更新,我们只需要记住不变的原理就行(单一实例,一个单独栈只放一个自己).
下面给出代码方便大家观看
A界面代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void gotoA(View view) {
startActivity(new Intent(this, MainActivity.class));
}
public void gotoB(View view) {
startActivity(new Intent(this,MainActivityB.class));
}
public void gotoC(View view) {
startActivity(new Intent(this,MainActivityC.class));
}
}
B界面代码:
//内容同上,只把A改成B
public class MainActivityB extends AppCompatActivity {
C界面代码
//内容同上,只把B改成C
public class MainActivityC extends AppCompatActivity {
布局:
A界面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#df4848">
<TextView
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Page A"/>
<Button
android:layout_width="match_parent"
android:onClick="gotoA"
android:text="gotoA"
android:layout_height="wrap_content"/>
<Button
android:text="gotoB"
android:layout_width="match_parent"
android:onClick="gotoB"
android:layout_height="wrap_content"/>
<Button
android:text="gotoC"
android:layout_width="match_parent"
android:onClick="gotoC"
android:layout_height="wrap_content"/>
</LinearLayout>
A界面布局:
改背景颜色和本页文本即可
android:background="#487adf"
<TextView
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Page B"/>
C界面布局:
同样改背景颜色和本页文本即可
android:background="#86bf89"
<TextView
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Page C"/>
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="goodjobtome.com.lunchmode"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainActivityB" />
<activity android:name=".MainActivityC" />
</application>
</manifest>
效果:
"standard,singleTop,singleTask,singleInstance"-Android启动模式的更多相关文章
- Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android 四种加载方式详解(standard singleTop singleTask singleInstance) .
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android -- Activity的生命周期,Activity四种启动模式 Standard, SingleTop,SingleTask,SingleInstance
1. 示例图 . 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: Activity的完整生命周期自第一次调用onCreate()开始,直至调 ...
- Activity的启动模式全解standard,singleTop,singleTask,singleInstance
在android中控制Activity的启动模式的属性主要控制两大功能: 1,控制activity 进入哪一个任务task 中, 有两种可能,进入启动task中,进入指定taskAffinity的 ...
- Android [启动方式:standard singleTop singleTask singleInstance]
栈顶Activity是当前正在显示的. 以A.B举例 1.standard 不同的Activity都存放在同一个栈中,每次创建实例都会堆放到栈顶,逐次返回直至退出. 创建实例B 创建实例A 点击返回时 ...
- android 启动模式介绍
Android启动模式 (1)Task:与Android系统是个多任务的系统中的任务是不同的.后者更倾向于多进程和多线程来说的,而这里的任务与application(应用程序)和activity(活动 ...
- Android启动模式launchMode
在Android里,有4种Activity的启动模式并分别介绍下: standard singleTop singleTask singleInstance AndroidManifest.xml配置 ...
- Android启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Android 启动模式--任务(Task)--桟 的误区
Android 启动模式--任务(Task)--桟 的误区 写这篇文章是因为前几天的一次面试,面试官说SingleInstance模式会新建一个桟,而SingleTask不会.首先不说这个对不对(非要 ...
随机推荐
- rdb转为rdf
dump-rdf -f N-TRIPLE -b http://localhost:2020/ -o iswc.nt terrsearch.ttl
- 【sourcetree】sourcetree连接远程仓库需要登陆但是一直登陆不上的问题 解决方法
授权类型选用 基础 .只需要登陆你在bitbucket的用户名和密码 如下 .即可成功连接远程仓库
- Angularjs: call other scope which in iframe
Angularjs: call other scope which in iframe -------------------------------------------------------- ...
- 在 Edison 上自动启动 Arduino Sketch
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- Cg入门8:Vertex Shader - 更好的数据组织方式struct
数据结构的使用:与C语言语法一样 參数的传递:參数匹配的是映射的语义的类型 输入输出:採用结构体,输入输出相应的參数的in和out可省略.函数的參数结构体就是输入參数集,函数的返回结构体就是输出參数集 ...
- python web框架企业实战具体解释(第六期)\第三课时-ajax&jquery&webpy
main.py __author__ = 'Liao' import web import time urls = ( '/gettime','gettime', '/(.*)', 'hello' ) ...
- mysql 安装与配置、使用
http://www.cnblogs.com/shenliang123/p/3203546.html CentOs中mysql的安装与配置 在linux中安装数据库首选MySQL,Mysql数据库的第 ...
- Yii自动生成项目
我喜欢尝试新鲜的东西.以前一直用gii生成工具,前几天突然发现用shell的方法,感觉很不错.特此总结一下yii的几个命令. gii的工具页面: - Controller Generator ...
- GTK入门学习:布局容器之水平布局
假设我们希望窗体里多放加入几个控件,直接加入是不成功的.由于窗体仅仅能容纳一个控件的容器. 这时候.我们须要借助布局容器,我们先把布局容器加入到窗体里.然后再把所须要加入的控件放在布局容器里. 布局容 ...
- 手把手编写自己的PHPMVC框架
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...