android中singleTask的home键的问题
在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进行整体调度包括以下操作:
- 按Home键,将之前的任务切换到后台
- 长按Home键,会显示出最近执行过的任务列表
- 在Launcher或HomeScreen点击app图标,开启一个新任务,或者是将已有的任务调度到前台
- 启动singleTask模式的Activity时,会在系统中搜寻是否已经存在一个合适的任务,若存在,则会将这个任务调度到前台以重用这个任务。如果这个任务中已经存在一个要启动的Activity的实例,则清除这个实例之上的所有Activity,将这个实例显示给用户。如果这个已存在的任务中不存在一个要启动的Activity的实例,则在这个任务的顶端启动一个实例。若这个任务不存在,则会启动一个新的任务,在这个新的任务中启动这个singleTask模式的Activity的一个实例
- 启动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键的问题相关推荐
- Android中监听Home键的4种方法总结
本文主要介绍了Android中监听Home键的4种方法总结,主要讲解了onSaveInstanceState方法.onUserLeaveHint方法.ACTION_CLOSE_SYSTEM_DIALO ...
- android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...
Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...
- android 监听home back,Android中监听Home键的4种方法总结
昨天需要处理一个问题,需要监听home键.最开始想到使用onKeydonwn这个方法.但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能.因为home键是系统 ...
- android 中如何模拟back键
主要是在使用Fragment时能够返回前一级,所以才找到了这些资料. 有两种方式可以实现,直接上代码 方法1: public void onBack(){new Thread(){public voi ...
- Android中singleTask模式没起作用!!
看了这篇文章后终于找到了原因所在http://blog.csdn.net/luoshengyang/article/details/6714543 原来需要给不同的singleTask指定不同的tas ...
- Android 监听home键(android:launchMode=singleTask 与 onNewIntent(Intent intent) 的用法
android:launchMode="singleTask" 和 onNewIntent(Intent intent)两个特性,现总结一下经验: android:launchMo ...
- android辅助功能模拟home键,Android launcher中模拟按home键的实现
Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...
- android中的后退功能,如何在Android应用中实现一个返回键功能
如何在Android应用中实现一个返回键功能 发布时间:2020-11-23 16:28:56 来源:亿速云 阅读:89 作者:Leah 今天就跟大家聊聊有关如何在Android应用中实现一个返回键功 ...
- android 模拟点击home,Android launcher中模拟按home键的实现
Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...
最新文章
- AE 9.3代码 升级到AE10.0
- 查看mongodb数据路径_【数据库】mongodb数据库安装
- 一文全览,深度学习时代下,复杂场景下的 OCR 如何实现?
- MongoDB Modifiers(原子操作)
- C#将Excel数据表导入SQL数据库的两种方法(转)
- flink的web ui中五颜六色的方块是什么意思?
- 独家 | 2021双11背后的数据库硬核科技
- java线程的小问题与回答
- 读书随笔:The Book of Why——CHAPTER 1:The Ladder of Causation
- 程序员有了孩子,老大叫玲玲,老二叫玲依,老三叫...
- python求解在给定递减数组中寻找两个数和等于定值,乘积最小
- vba 定义类_类接口的实现及应用
- Java8(JDK1.8)新特性
- 计算机网络组建课设心得,计算机网络课程设计心得体会
- uniapp的分享到朋友圈和朋友(APP)
- NEAT(基于NEAT-Python模块)实现监督学习和强化学习
- Spring Destroying singletons ... root of factory hierarchy 问题【已解决】
- 内蒙古大学计算机考研892,893计算机考研真题分享
- 关于猎聘网投递简历后的“已储备”状态
- vivoX80Pro和华为P50Pro哪个值得入手参数对比