在实际项目中我们应该根据特定的需求为每个活动指定相应的启动模式。启动模式一共分为4种:standar、singleTop、singleTask和singleInstance。可以在AndroidManifest.xml文件中通过标签指定android:launchMode属性来选择启动模式。

1、standard

standard是活动的默认启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。之前提到过,Android是使用返回栈来管理活动的。在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否在返回栈中存在,每次启动都会创建该活动的一个新的实例。

例:我之前的一个项目,直接在上面的修改的。源代码是黑色,添加的高亮了

  1. @Override
  2. protectedvoid onCreate(Bundle savedInstance){
  3. super.onCreate(savedInstance);
  4. Log.d("FirstActivity",this.toString());
  5. setContentView(R.layout.first_layout);
  6. Button button1=(Button)findViewById(R.id.button);
  7. button1.setOnClickListener(newView.OnClickListener(){
  8. @Override
  9. publicvoid onClick(View v){
  10. Intent intent=newIntent(FirstActivity.this,FirstActivity.class);
  11. startActivity(intent);
  12. }
  13. });
  14. }

代码看起来有点奇怪,在FirstActivity的基础上启动FirstActivity。从逻辑上来将是没有意义的,不过我们重点在于研究standard模式,因此不必在意实际用途。我同样在代码中加了一行打印代码,方便检测。这是运行程序每按一次button都会在logcat打印出一条信息。
从打印的信息可以看出,每单击一次按钮就会创建出一个新的FirstActivity实例。同时协议栈也会存在相应个数的实例,这是我们需要按下相应次数才能退出程序

standard模式的原理示意图

2、singleTop

当活动的启动模式指定为singleTop,在启动活动的时候如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例

例:只要在当前活动下增加一行模式选择就可以了

  1. android:name=".FirstActivity"//当前活动
  2. android:launchMode="singleTop";//选择singleTop模式

运行程序时,查看logcat会看到无论点击多少次button只有一个实例被创建,不过如果FirstActivity不处于栈顶位置还是会创建新的实例

singleTop模式原理示意图

3、singleTask

当活动的启动项目指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现就直接调用,并把这个活动之上的所有活动出栈。没有发现就重新创建。

例:

  1. android:name=".FirstActivity"//当前活动
  2. android:launchMode="singleTask";//选择singleTask模式
  1. @Override
  2. protectedvoid onDestory(){
  3. super.onRestart();
  4. Log.d("SecondActivtiy","onDestory");
  5. }

从FirstActivity界面进入到SecondActivity界面,然后在SecondActivity按下button返回到FirstActivity界面。
通过打印信息可以看出,在SecondActivity中启动FirstActivity的下面,于是SecondActivity会从返回栈中出栈,而FirstActivity会重新成为了栈顶活动,因此FirstActivity的onRestart()方法和SecondActivity()的onDestory()方法会得到执行。

singleTask模式的原理示意图


# singleInstance
singleInstance模式应该是最复杂的一个启动模式了。指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动。这样做的好处就在于,这种模式下会有一个单独的返回栈来管理活动,不管是哪个应用程序来访问这个活动,都可以用同一个返回栈,也就解决了共享活动实例的问题。

singleInstance模式的原理示意图:

Activity(活动)的启动模式的更多相关文章

  1. Android学习之基础知识四-Activity活动7讲(活动的启动模式)

    在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式.Activity的启动模式一共有4种:standard.singleTop.singleTask.singleInstance. ...

  2. Android学习笔记(六)——活动的启动模式

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动的启动模式共有四种: standard.singleTop.singleTask 和 singleInst ...

  3. Android:活动的启动模式

    启动模式一共有四种,分别是 standard .singleTop . singleTask 和 singleInstance , 可 以 在 AndroidManifest.xml 中 通 过 给 ...

  4. Day2 Activity生命周期/启动模式/最佳实践

    Android是使用任务(Task)来管理活动的,这个栈被称作返回栈(Back Stack). Activity类中定义了7个回调方法: onCreate().在活动第一次被创建时调用,应该在这个方法 ...

  5. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  6. Android Activity 四种启动模式

    task和back stack(任务和回退栈) 任务启动,task被加入到回退栈的栈顶,返回的时候回退栈的栈顶任务会被弹出,并被销毁,栈中的前一任务恢复运行,当activity销毁是,系统不会保留ac ...

  7. Activity四种启动模式与Flag及affinity属性详解

    Activity有四种加载模式:standard(默认).singleTop.singleTask.singleInstance standard:Activity的默认加载模式,即使某个Activi ...

  8. Android活动的启动模式

    1. standard 标准模式,是活动默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种模式. Android使用返回栈管理活动,在standard模式下,每当启动一个新的活动,它就 ...

  9. Activity四种启动模式

    转载博客:http://blog.csdn.net/shinay/article/details/7898492 Activity启动方式有四种,分别是:standardsingleTopsingle ...

  10. activity 四种启动模式

    前言 Activity的启动模式决定了Activity的启动运行方式 四种模式 Activity启动模式设置: <activity android:name=".MainActivit ...

随机推荐

  1. 概率DP入门学习QAQ

    emmmm博客很多都烂尾了...但是没空写..先写一下正在学的东西好了 概率DP这东西每次考到都不会..听题解也是一脸懵逼..所以决定学习一下这个东东..毕竟NOIP考过...比什么平衡树实在多了QA ...

  2. ACC026简要题解

    这场AGC是时间正好在NOI之前休养生息的日子里,果断选择了放弃(虽然也从没有用大号打过).在随便做完了前几题之后就踏上了去长沙的旅程.NOI系列比赛总是休闲无比,咕咕不断,竟然连开幕式都能咕,今天A ...

  3. Linux后台研发面试题

    本系列给出了在复习过程中一些C++后台相关面试题,回答内容按照笔者的知识点掌握,故有些问题回答较为简略 1.信号的生命周期 一个完整的信号生命周期可以用四个事件刻画:1)信号诞生:2)信号在进程中注册 ...

  4. java===java基础学习(13)---this,static(静态变量和静态方法)的使用

    package dog; public class PersonAndDog { public static void main(String[] args) { Dogs da_huang = ne ...

  5. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

  6. Android 开发之避免被第三方使用代理抓包

    现象:charles抓不到包,但wireshark,HttpAnalyzor可以抓到包. 关键代码: URL url = new URL(urlStr); urlConnection = (HttpU ...

  7. MariaDB 层常用业务

    前言  -  简单准备一下前戏 前面写过几篇mariadb 数据的随笔, 多数偏C/C++层面. 这次分享一下平时开发中, 处理的一些数据层面的业务. 对于MariaDB, 不做过多介绍. 如果你有U ...

  8. Network Embedding

    网络表示 网络表示学习(DeepWalk,LINE,node2vec,SDNE) https://blog.csdn.net/u013527419/article/details/76017528 网 ...

  9. LinkedList 源码分析

    LinkedList :双向链表结构, 内部存在frist节点 和 last节点.通过改变 首节点和 尾节点的引用来实现新增和修改 有一个内部类: //节点类,内部包括前节点和后节点,和数据项 // ...

  10. 高性能网络服务器--I/O复用 select poll epoll_wait之间的区别

    一.select select采用的是集合的方式,最多只能访问1024个套接字.可读,可写,异常,三种访问,并且采用的是轮训的方式进行每次访问都需要从内核向用户空间拷贝 二.poll poll采用的是 ...