热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Activity的是四种模式

1.概述Android的管理主要是通过Activity栈来进行的。当一个Activity启动时,系统根据其配置或调用的方式,将Activity压入一个特定的栈中,系统处于运行(Runningor

1 . 概述

Android的管理主要是通过Activity栈来进行的。当一个Activity启动时,系统根据其配置或调用的方式,将Activity压入一个特定的栈中,系统处于运行(Running or Resumed)状态。当按Back键或触发finish()方法时,Activity会从栈中被压出,进而被销毁,当有新的Activity压入栈时,如果原Activity仍然可见,则原Activity的状态将转变为暂停(Paused)状态,如果原Activity完全被遮挡,那么其状态将转变为停止(Stopped)。

2 .启动模式的作用

Activity启动模式就是属于Activity配置属性之一,叫它具有四种启动模式,分别是:1.standard ,2.singleTop,3.singleTask,4.singleInstance,一般如果不显示声明,默认为standard模式。launchMode 在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他 Activity实例公用一个task里。

3 . 模式的说明

(1standard模式:每次激活Activity(startActivity),都创建Activity实例,并放入任务栈


看代码:

 


 

   android:name=".test.MainActivity">

   

       android:name="android.intent.action.MAIN">

       android:name="android.intent.category.LAUNCHER"/>

   

 

   android:name=".test.SecondActivity"/>

   android:name=".test.ThirdActivity"/>

三个Activity都设有一个跳转按钮

MainActivity:

Intent intent = newIntent();

intent.setClass( MainActivity.this ,SecondActivity.class);

startActivity( intent );

SecondActivity :

but.setOnClickListener(newView.OnClickListener(){

    @Override

   public voidonClick(Viewv) {

        Intent intent =newIntent();

       intent.setClass( SecondActivity.this ,ThirdActivity.class);

       startActivity( intent );

   }

});

ThirdActivity:

but.setOnClickListener(newView.OnClickListener(){

    @Override

   public voidonClick(Viewv) {

        Intent intent =newIntent();

       intent.setClass( ThirdActivity.this ,MainActivity.class);

       startActivity( intent );

   }

});

操作步骤:点击第一个界面的button跳转到第二个,在第二个点击button跳转到第三个界面,点击第三个界面button跳转到第一个界面。

看结果:


在上面的基础上当按下Back键后,结果为:


总结:standard模式,这是系统默认的启动模式,这种模式就是创建一个Activity压入Task容器栈中,当当前Activity激活,并处在和用户交互时,此Activity弹出栈顶,当finish()的时候,在任务栈中销毁该实例。

 

(2singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;


看代码:

 

    android:launchMode="singleTop"

    android:name=".test.MainActivity">

    

        android:name="android.intent.action.MAIN">

        android:name="android.intent.category.LAUNCHER"/>

    

 

 

    android:launchMode="singleTop"

    android:name=".test.SecondActivity"/>

 

 

    android:name=".test.ThirdActivity"/>

操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button

SecondActivity界面的调转给为下:

but.setOnClickListener(newView.OnClickListener(){

    @Override

   public voidonClick(Viewv) {

        Intent intent =newIntent();

       intent.setClass( SecondActivity.this ,SecondActivity.class);//自己调到自己

       startActivity( intent );

   }

});

看结果:


不自己跳到自己时:

操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳大第三个界面,点击第三个界面button调到第一个界面

but.setOnClickListener(newView.OnClickListener(){

    @Override

   public voidonClick(Viewv) {

        Intent intent =newIntent();

       intent.setClass( SecondActivity.this ,ThirdActivity.class);

       startActivity( intent );

   }

});

看结果:


总结:singleTop模式:这种模式首先会判断要激活的Activity是否在栈顶,如果在则不重新创建新的实例,复用当前的实例,如果不在栈顶,则在任务栈中创建实例。条件是是否在栈顶,而不是是否在栈中。


(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop


看代码:

 

    android:launchMode="singleTask"

    android:name=".test.MainActivity">

    

        android:name="android.intent.action.MAIN">

        android:name="android.intent.category.LAUNCHER"/>

    

 

 

    android:name=".test.SecondActivity"/>

 

 

    android:name=".test.ThirdActivity"/>

操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳大第三个界面,点击第三个界面button调到第一个界面

当界面调到第三个界面时的结果为:

 

在上面的基础上点击第三个界面button是结果为:

 

总结:singleTask模式,这种模式启 动的目标Activity实例如果已经存在task容器栈中,不管当前实例处于栈的任何位置,是栈顶也好,栈底也好,还是处于栈中间,只要目标 Activity实例处于task容器栈中,都可以重用该Activity实例对象,然后,把处于该Activity实例对象上面全部Activity实 例清除掉,并且,task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。所以,如果你想你的应用不管怎么启动目标Activity,都只有 唯一一个实例对象,就使用这种启动模式。

(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

看代码:

 

    android:name=".test.MainActivity">

    

        android:name="android.intent.action.MAIN">

        android:name="android.intent.category.LAUNCHER"/>

    

 

 

    android:name=".test.SecondActivity"/>

 

 

    android:launchMode="singleInstance"

    android:name=".test.ThirdActivity"/>

操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳到第三个界面

看结果:

 

ThirdActivity单独在一个栈中。

总结:singleInstance模式,当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

 

总之,Android四大启动模式相当简单。默认standard模式,他是task容器栈可能存在相同的Activity实例;singletop模式 下,重用栈顶Activity实例,栈顶不存在,则创建新的Activity实例,该模式下有可能存在相同Activity实例;singletask模 式,task容器栈存在目标Activity实例,则重用该实例,task容器栈永远只有唯一activity实例,并且,其一是Activity实例被 清除掉。singleinstance模式,不同应用可以共享Activity实例,并且是处于不同容器栈中


推荐阅读
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
Superficial1987542_y3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有