在Android设计中遇到这样一个问题:

Activity A,在中设置它的一个为

AndroidManifest.xml代码

<intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
  A的launchMode为“singleTask”。Activity B,设置launchMode为“standard”。这样,A作为启动应用的入口Activity;在A中进行某个操作可以跳转到B。如果此时,点击‘Home’键返回到Home Screen后,再次点击应用图标进入应用,出现的界面为A,而非B。通过一些测试,发现,在重新进入应用时,在Back stack中,位于A之上的其他Activity均被销毁了。

开发的时候,由于用到了singleTask用法不当,造成了一些不必要的麻烦,现总结如下:
现有Activity:A,B,C,D;启动顺序是A->B->C->D,其中,B是singleTask的。
A到B后,A finish掉;B到C后,B不 finish; C到D后,C不 finish;在D启动B,就可以一下子将C、D kill掉,只保留B。但是,
这个时候你从B退出(整个程序退出了),长按Home键启动,进来的第一个是B,而不是A,这就已经不对了; 而且, 刚才就算你不退出,从B再进到C,按Home,再长按Home进入,回来的是B而不是C。

解决方案如下:

将singleTask改成singleTop。
这样以来,刚才从D启动B的时候,就要用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
也就是说,singleTask会自动执行clear top, 而singleTop需要手动;而从Home键启动,如果是singleTask的话就自动clear top了,所以到不了想要到的Activity。
这样就解决了问题,但是上面的说法是个人的理解。

Activity有四种加载模式:

standard
标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A-->A。singleTop
接下来就是singleTop模式。它的表现几乎和standard模式一模一样,一个singleTop Activity 的实例可以无限多,唯一的区别是如果在栈顶已经有一个相同类型的Activity实例,Intent不会再创建一个Activity,而是通过onNewIntent()被发送到现有的Activity。singleTask
这种模式和standard以及singleTop有很大不同。singleTask模式的Activity只允许在系统中有一个实例。如果系统中已经有了一个实例,持有这个实例的任务将移动到顶部,同时intent将被通过onNewIntent()发送。如果没有,则会创建一个新的Activity并置放在合适的任务中。singleInstance
这个模式非常接近于singleTask,系统中只允许一个Activity的实例存在。区别在于持有这个Activity的任务中只能有一个Activity:即这个单例本身。

设置的位置在AndroidManifest.xml文件中activity元素的Android:launchMode属性:

<activity android:name="ActB" android:launchMode ="singleTask"></activity>

Intent Flags

除了在AndroidManifest.xml中直接设置launch mode,我们还可以通过叫做 Intent Flags的东西设置更多的行为,比如:

Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

Task

Task是Android Framework中的一个概念,Task是由一系列相关的Activity组成的,是一组相关Activity的集合。Task是以栈的形式来管理的。

我们在操作软件的过程中,一定会涉及界面的跳转。其实在对界面进行跳转时,Android Framework既能在同一个任务中对Activity进行调度,也能以Task为单位进行整体调度。在启动模式为standard或singleTop时,一般是在同一个任务中对Activity进行调度,而在启动模式为singleTask或singleInstance是,一般会对Task进行整体调度。

对Task进行整体调度包括以下操作:

  1. 按Home键,将之前的任务切换到后台
  2. 长按Home键,会显示出最近执行过的任务列表
  3. 在Launcher或HomeScreen点击app图标,开启一个新任务,或者是将已有的任务调度到前台
  4. 启动singleTask模式的Activity时,会在系统中搜寻是否已经存在一个合适的任务,若存在,则会将这个任务调度到前台以重用这个任务。如果这个任务中已经存在一个要启动的Activity的实例,则清除这个实例之上的所有Activity,将这个实例显示给用户。如果这个已存在的任务中不存在一个要启动的Activity的实例,则在这个任务的顶端启动一个实例。若这个任务不存在,则会启动一个新的任务,在这个新的任务中启动这个singleTask模式的Activity的一个实例
  5. 启动singleInstance的Activity时,会在系统中搜寻是否已经存在一个这个Activity的实例,如果存在,会将这个实例所在的任务调度到前台,重用这个Activity的实例(该任务中只有这一个Activity),如果不存在,会开启一个新任务,并在这个新任务中启动这个singleInstance模式的Activity的一个实例。

参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0520/2897.html
http://blog.csdn.net/zhangjg_blog/article/details/10923643

android中singleTask的home键的问题相关推荐

  1. Android中监听Home键的4种方法总结

    本文主要介绍了Android中监听Home键的4种方法总结,主要讲解了onSaveInstanceState方法.onUserLeaveHint方法.ACTION_CLOSE_SYSTEM_DIALO ...

  2. android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...

    Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...

  3. android 监听home back,Android中监听Home键的4种方法总结

    昨天需要处理一个问题,需要监听home键.最开始想到使用onKeydonwn这个方法.但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能.因为home键是系统 ...

  4. android 中如何模拟back键

    主要是在使用Fragment时能够返回前一级,所以才找到了这些资料. 有两种方式可以实现,直接上代码 方法1: public void onBack(){new Thread(){public voi ...

  5. Android中singleTask模式没起作用!!

    看了这篇文章后终于找到了原因所在http://blog.csdn.net/luoshengyang/article/details/6714543 原来需要给不同的singleTask指定不同的tas ...

  6. Android 监听home键(android:launchMode=singleTask 与 onNewIntent(Intent intent) 的用法

    android:launchMode="singleTask" 和 onNewIntent(Intent intent)两个特性,现总结一下经验: android:launchMo ...

  7. android辅助功能模拟home键,Android launcher中模拟按home键的实现

    Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...

  8. android中的后退功能,如何在Android应用中实现一个返回键功能

    如何在Android应用中实现一个返回键功能 发布时间:2020-11-23 16:28:56 来源:亿速云 阅读:89 作者:Leah 今天就跟大家聊聊有关如何在Android应用中实现一个返回键功 ...

  9. android 模拟点击home,Android launcher中模拟按home键的实现

    Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...

最新文章

  1. AE 9.3代码 升级到AE10.0
  2. 查看mongodb数据路径_【数据库】mongodb数据库安装
  3. 一文全览,深度学习时代下,复杂场景下的 OCR 如何实现?
  4. MongoDB Modifiers(原子操作)
  5. C#将Excel数据表导入SQL数据库的两种方法(转)
  6. flink的web ui中五颜六色的方块是什么意思?
  7. 独家 | 2021双11背后的数据库硬核科技
  8. java线程的小问题与回答
  9. 读书随笔:The Book of Why——CHAPTER 1:The Ladder of Causation
  10. 程序员有了孩子,老大叫玲玲,老二叫玲依,老三叫...
  11. python求解在给定递减数组中寻找两个数和等于定值,乘积最小
  12. vba 定义类_类接口的实现及应用
  13. Java8(JDK1.8)新特性
  14. 计算机网络组建课设心得,计算机网络课程设计心得体会
  15. uniapp的分享到朋友圈和朋友(APP)
  16. NEAT(基于NEAT-Python模块)实现监督学习和强化学习
  17. Spring Destroying singletons ... root of factory hierarchy 问题【已解决】
  18. 内蒙古大学计算机考研892,893计算机考研真题分享
  19. 关于猎聘网投递简历后的“已储备”状态
  20. vivoX80Pro和华为P50Pro哪个值得入手参数对比

热门文章

  1. Dotween曲线运动
  2. LeetCode题解(1279):红绿灯路口(Python)
  3. 关于ABOV单片机的低功耗设计
  4. EOCR电动机保护器过电流值最大能设置到多少A
  5. windows store下载_《勇者斗恶龙XIS决定版》体验版开放下载,可游玩约10小时
  6. 微信小程序|基于小程序+云开发制作一个租房小程序
  7. 做小程序开发需要什么软件?
  8. 大学选人工智能专业好不好?
  9. 什么是神经网络理论,神经网络理论基础
  10. java byte 赋值 原码,Java基础第二天学习笔记