Android开发笔记(十六)——Activity的4种启动模式

摘要:
AndroidManifest中的一个重要属性是launchMode启动模式:活动的Android:launchMode四个属性:标准模式,默认singleTop:任务顶部重用模式singleTask:堆栈中的任务重用模式singleInstance:全局单实例模式测试准备:继续使用上次创建的AActivity和BActivity。StandardActivity由任务堆栈管理。每次启动活动时,都会将其放置在堆栈上。按返回键从堆栈顶部删除活动。标准是默认的启动模式,即标准模式。每次启动活动时,都会创建一个新实例。

AndroidManifest 中比较重要的一个属性是 launchMode 启动模式:

Acyivity的 android:launchMode 四个属性:

  • standard:标准模式,默认
  • singleTop:Task栈顶复用模式(栈是先进后出,当我们启动一个Activity,如果这个目标Activity位于栈顶,不会创建一个新的实例,而是会直接复用这个栈顶的Activity)
  • singleTask:Task栈内复用模式(不一定要在栈顶,只要栈内有就可以直接复用,不管位置)
  • singleInstance:全局单例模式(前两个必须是在同一个栈内,这个是只要在存取的所有栈里面只要有的就可以复用)

测试准备

继续使用上次创建的AActivity和BActivity。

在AActivity中的onCreate函数中添加:

Log.d("AActivity","-----onCreate-----");
Log.d("AActivity","---taskid:"+getTaskId()+"---   ---hash:"+hashCode()+"---");
logtaskName();  //打印任务栈的名称

onNewIntentlogtaskName 函数写在onCreate函数后面:

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("AActivity","-----onNewIntent-----");
        Log.d("AActivity","---taskid:"+getTaskId()+"---   ---hash:"+hashCode()+"---");
        logtaskName();  //打印任务栈的名称
    }

    private void logtaskName(){
        try {
            ActivityInfo info = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
            Log.d("AActinity",info.taskAffinity); //info.taskAffinity可以理解为当前Activity所在任务栈的名称
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }

在BActivity中同样操作,在A添加一个Button使其在A页面跳转到A页面,在B添加一个Button使其在B页面跳转到A页面。

standard

  • Activity是由任务栈管理的,每启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity。
  • standard是默认的启动模式,即标准模式。每启动一个Activity,都会创建一个新的实例。

演示

Android开发笔记(十六)——Activity的4种启动模式第1张

  • 从主页面MainActivity跳转到AActivity中时,MainActivity的任务栈为包名,后面所有的Activity都隶属于这个栈
  • 当没有设置任务栈的名称时候,默认为应用的包名
  • 当点击Button从A页面跳转到A页面时,这里taskid是一样的,也就是这两个Activity处在同一个任务栈当中,但是他们的哈希码是不一样的,表示这两个Activity不是同一个实例,说明从A页面跳转到A页面时又创建了一个新的实例。(因为是标准启动,每启动一个Activity,都会创建一个新的实例
  • 当点击Jump从A页面跳转到B页面时:可以看到任务栈还是相同的,但是哈希码不同,因为BActivity本身不存在于任务栈当中,是一个新的实例

singleTop

  • 当要启动的目标Activity已经位于栈顶时,不会创建新的实例,会复用栈顶的Activity,并且其 onNewIntent() 方法会被调用;
  • 如果目标Activity不在栈顶(在栈里但不在顶部;或者根本不在栈内),则和standard一样创建新的实例。

演示

Android开发笔记(十六)——Activity的4种启动模式第2张

  • 从主页面MainActivity跳转到AActivity中时,调用onCreate方法
  • 从AActivity再次跳转到AActivity中时(此时目标Activity是AActivity,目标Activity在栈顶中),这时打印出来的哈希码和之前一直,也就是说此时复用了栈顶的Activity,并且其onNewIntent()方法被调用
  • 从AActivity跳转到BActivity中时(此时目标Activity是BActivity,目标Bctivity不在栈中),此时哈希码发生了变化,说明创建了新的实例。
  • 从BActivity再次跳转到AActivity中时(此时目标Activity是AActivity,目标Activity在栈中但是不在栈顶中),此时哈希码发生了变化,说明创建了新的实例。

singleTask

  • 在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用其 onNewIntent() 方法,并且该Activity上面的Activity会被清除(出栈)
  • 如果栈中没哟,则创建新的实例。

当没有设置任务栈的名称时候,默认为应用的包名,如果自己有设置任务栈名称(在 AndroidManifast 中对应的activity设置属性 android:taskAffinity ),那就不属于默认包名的任务栈了。当从这个Activity开始启其他Activity时候,都会被加入这个新设置的栈中。

singleInstance

  • 全局复用,不管哪个Task栈,只要存在目标Activity就复用;
  • 每个Activity占有一个新的Task栈。

通常使用standard和singleTop、singleTask,singleInstance用的比较少。

免责声明:文章转载自《Android开发笔记(十六)——Activity的4种启动模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CloseHandle()函数的使用tinyhttpd源码分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android开发笔记(二十一)——数据存储之SharedPreference轻量级数据存储

xml文件,K-V形式 SharedPreferences:读取数据 SharedPreferences.Editor:写入数据 代码示例: 在EditText中输入内容,点击保存,通过SharedPreferences来保存数据,点击显示按钮,把数据读取出来,显示在下面的TextView上。 SharedPreferencesActivity的jav...

【原】移动web页面兼容处理的思考

本月收到一份关爱里程碑的邮件,入职满3周年了,从一个懵懂的新人到从容淡定的小油条,在外辛苦打工不容易,能收到一封简单的关怀邮件也是有感欣慰,这里祝愿公司越发展越好。 进入主题,移动网页设计中,很多同学常问一个问题:这么多种移动设备,要兼容哪几类呢? 相信很多人会回答主流的系统ios、android,但是这2个系统又有多个版本,如ios就有4、5、6、7,a...

如何在不同的语言/平台中获取Android ID

如何在不同的语言/平台中获取Android ID# 最近开发工作中需要使用到AndroidID,在Unity和native code中也需要使用,java获取很方便,Unity中也不难,最难的是在native code中获取。 获取android ID需要有一个上下文实例,也就是Context实例,看下面的java获取方式: 在java中获取## Andr...

Android SDK +Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建

AndroidSDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建 这几天一直在研究 AndroidSDKC/C++平台的搭建,尽管以前有成功在Windows XP做过,由于当时没有留下有用的记录,花了很多的冤枉时间,今天写出来以备后用。由于Android SDK和Eclipse都是用Java编写的,因此需要先在Windows...

文件签名<魔塔50层>android反编译破解

发一下牢骚和主题无关: 缘由:该游戏作者有点可爱,原来就是拿别人的游戏,还在游戏中参加积分的轨制,打到20层后,需要积分。看不惯,就把它破解了,打到20层后,直接跳过要积分进程。 本文不提供破解后的安装包! 进程: 首先下载目标apk,我是从这里下载的:http://www.wandoujia.com/apps/com.ss.magicTower 然后下载...

Android 性能优化:使用 Lint 优化代码、去除多余资源

http://blog.csdn.net/u011240877/article/details/54141714 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 读完本文你将了解到: 前言 什么是 Lint Lint 工作方式简单介绍 从命令行运行 Lint Android Studio 中使用 Lint 团队中建立代码规范利器提...