android home键返回返回键与Home键区别

下次自动登录
现在的位置:
& 综合 & 正文
android 按home键返回到桌面后,再按桌面应用图标又重新打开该应用的解决方法
android 按home键返回到桌面后,再按桌面应用图标又重新打开该应用的解决方法
这个问题困扰了我一下午,查了好多资料都不太跟这个问题沾边,但还是查到了。。记录下来,为了自己,也为了方便别人。
这个问题是因为在AndroidManifest.xml中,你的启动activity中加了android:launchMode="singleTask",将这行去掉就可以了。如下图:
关于为什么会引起这个问题,主要还是不太了解activity的launchMode,查了下资料,感觉楼主整理的不错,就引用过来,如下文:
Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:
standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D
D C B A将会依次弹出栈而显示在界面上。
singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A
singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
关于singleTask这个网上颇有争议,包括google api上的说明也让我看的是一头雾水,自己用实例亲测,终于算是搞清楚了
正解:1.singleTask 并不一定处于栈底
   2.singleTask 并一定会是栈底的根元素 
3.singleTask 并不一定会启动新的task  
 情况一:如果在本中启动singleTask的activity:假设ActivityA是程序的入口,是默认的模式(standard),ActivityB是singleTask 模式,由ActivityA启动,刚ActivityB不会位于栈底,不是根元素,不会启动新的task,此种情况ActivityB会和ActivityA在一个栈中,位于ActivityA上面
  情况二:如果ActivityB由另外一个程序启动:假设apkA是情况一中的应用,apkB是测试程序,在apkB中启动apkA中的ActivityB,刚ActivityB会位于栈底,是根元素,会启动新的task
注意:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记
singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A
B C。也就是说现在界面还显示C的内容,不是D。
好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上:
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。
PS:intent-filter中 &action android:name="android.intent.action.MAIN" /&和 &category android:name="android.intent.category.LAUNCHER" /&两个过滤条件缺一不可才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。
本文转自:
&&&&推荐文章:
【上篇】【下篇】android笔记08 按下Home键后重新返回程序,显示最后的Activity
android笔记08 按下Home键后重新返回程序,显示最后的Activity
查看次数28001 发表时间 19:36:52
问题描述在一个android应用程序中,如果有两个activity:A,B,其中A是主界面,B是由A跳转所得.那么当我们在B界面按下Home键时会返回桌面,这时无论是长按Home键调出最近访问程序,还是从菜单再进入一遍程序,我们都期望...
在一个android应用程序中,如果有两个activity:A,B,其中A是主界面,B是由A跳转所得.那么当我们在B界面按下Home键时会返回桌面,这时无论是长按Home键调出最近访问程序,还是从菜单再进入一遍程序,我们都期望能直接返回到B界面,但是有的时候我们却无法如愿而又找不出问题的所在,这篇笔记记录下了部分可能存在的情况,以及原理。
Activity的Launch Mode
四种模式中的standard(默认)和singletop模式很好理解。
对于singletask,上文作者也给出了详细的总结,即一个task栈中只能有一个实例,这个activity实例有可能在原来的任务栈中存在,那么再次调用时就会把它上面的所有activity对象清空,保证自己显示出来。这条非常重要。
对于singleInstance,会为activity新开辟出一个task栈,对于到底两个栈如何互相转换,上文中也已谈及。
详细的测试实例可以参考:
另:singleInstance的详细解释(来自:):
解释singleInstance模式比较麻烦。
首先要说一下Task(任务)的概念。
如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码,不是你拿到人家api后的源代码级调用。
Android可以做到,让别人的程序直接复用你的Activity(类似桌面程序的窗口)。
Android为提供这种机制,就引入了Task的概念。Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,就是intent-filter中配置为main和launch的那个(见一个APK文件部署产生多个应用安装的效果)。这个Activity是根(Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那三个模式,也会在这个栈(Task)中,只是实例化的策略不同而已。
验证的办法是调用和打印Activity的taskId:
&task id: &+this.getTaskId()
会发现,无论切换Activity,taskId是相同的。
当然也可以在这个单一的Task栈中,放入别人的Activity,比如google地图,这样用户看过地图按回退键的时候,会退栈回到调用地图的Activity。对用户来说,并不觉得在操作多个应用。这就是Task的作用。
但是,有这样的需求,多个Task共享一个Activity(singleTask是在一个task中共享一个Activity)。
现成的例子是google地图。比如我有一个应用是导游方面的,其中调用的google地图Activity。那么现在我比如按home键,然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity。
如果使用上面三种模式,是无法实现这个需求的。google地图应用中有多个上下文Activity,比如路线查询等的,导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。
singleInstance模式解决了这个问题。让这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由这个Activity接收和展示。
这里又有两个问题:
如果是这种情况,多个task栈也可以看作一个应用。比如导游应用启动地图Activity,实际上是在导游应用task栈之上singleInstance模式创建的(如果没有的话就新建,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity,地图Activity回退的时候,只是把这个栈移开了,这样就看到导游应用刚才的Activity了;
多个应用(Task)共享一个Activity要求这些应用都没有退出,比如刚才强调要用home键从导游应用切换到地图应用。因为,如果退出导游应用,而这时也地图应用并未运行的话,那个单独的地图Activity(task)也会退出了。
Intent的常用FLAG参数
Intent.FLAG_ACTIVITY_NEW_TASK
默认的跳转类型,会重新创建一个新的Activity,不过与这种情况,比方说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在Manifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.
FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于加载模式中的singletop,比如说原来栈中情况是A,B,C,D在D中启动D,栈中的情况还是A,B,C,D
FLAG_ACTIVITY_CLEAR_TOP
这个FLAG就相当于加载模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。类如:原来栈中的情况是A,B,C,D这个时候从D中跳转到B,这个时候栈中的情况就是A,B了
FLAG_ACTIVITY_BROUGHT_TO_FRONT
这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思! 比方说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以 FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个启动的,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B. 特别注意的是,我上面说的网上人描述的这个FLAG,会很容易让人误解成这样,A,B,C,D都是标准加载,然后我在D中启动A,这个intent加上FLAG_ACTIVITY_BROUGHT_TO_FRONT
,就会误认为变成B,C,D,A!!其实不是,这个时候应该是A,B,C,D,A.不信的人大家试试看。不过下面这个标记和这个标记就会让大家明白了!
FLAG_ACTIVITY_REORDER_TO_FRONT
就按在 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 最后说的,如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。
FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。
比如,在用户按下Home键(用户的choice),它将被调用。比如有电话进来(不属于用户的choice),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的choice?
它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有     FLAG_ACTIVITY_NO_USER_ACTION来确定的。
注意:通过调用finish()使该activity销毁时不会调用该函数
FLAG_ACTIVITY_NO_HISTORY
用这个标记顾名思义! 意思就是说用这个FLAG启动的Activity,一旦推出,他就不会存在于栈中,比方说!原来是A,B,C 这个时候再C中以这个FLAG启动D的 , D再启动E,这个时候栈中情况为A,B,C,E。
如果需要自己在按下Home键后还能从最近打开的程序中恢复回离开时的Activity,那么一定要注意自己最后的Activity是否存在task栈的最顶端。
例如:只要该栈中之前的任何一个Activity在manifest文件中定义了启动模式为singleTask,那么只要再次返回程序,一定会回到该Activity上,而它之上的Activity都被销毁了。
(转发请注明转自:)
&&相关推荐
&&&&&&( 19:36:52)
&&&&&&( 19:36:52)
&&&&&&( 19:36:52)
&&&&&&( 19:36:53)
&&&&&&( 19:36:53)
&&&&&&( 19:36:50)
&&&&&&( 19:36:50)
&&&&&&( 05:36:33)
&&&&&&( 05:36:33)
&&&&&&( 05:36:33)
&&发表评论
(不超过20个字符或10个汉字)
最新发布...
最新推荐...
浏览最多...
点击:129428
点击:120878
点击:107219
点击:84110
点击:72381
点击:69135
点击:68808
点击:66705
点击:60419
点击:57740& & 屏蔽返回键的代码:& & public boolean onKeyDown(int keyCode,KeyEvent event){& & switch(keyCode){& & case KeyEvent.KEYCODE_HOME:& & case KeyEvent.KEYCODE_BACK:& & case KeyEvent.KEYCODE_CALL:& & case KeyEvent.KEYCODE_SYM:& & case KeyEvent.KEYCODE_VOLUME_DOWN:& & case KeyEvent.KEYCODE_VOLUME_UP:& & case KeyEvent.KEYCODE_STAR:& & }& & return super.onKeyDown(keyCode, event);& & }& & 屏蔽home键的代码:& & public void onAttachedToWindow() {& & this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);& & super.onAttachedToWindow();& & }主题 : cocos2dx lua 响应android返回键和home键
级别: 新手上路
UID: 358543
可可豆: 24 CB
威望: 23 点
在线时间: 12(时)
发自: Web Page
cocos2dx lua 响应android返回键和home键&&&
cocos2dx lua 如何响应android返回键和home键。
级别: 新手上路
可可豆: 231 CB
威望: 231 点
在线时间: 77(时)
发自: Web Page
local function onrelease(code, event)
if code == cc.KeyCode.KEY_BACK then
cc.Director:getInstance():endToLua()
elseif code == cc.KeyCode.KEY_HOME then
cc.Director:getInstance():endToLua()
local listener = cc.EventListenerKeyboard:create()
listener:registerScriptHandler(onrelease, cc.Handler.EVENT_KEYBOARD_RELEASED)
local eventDispatcher = node:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, node)
级别: 新手上路
UID: 358543
可可豆: 24 CB
威望: 23 点
在线时间: 12(时)
发自: Web Page
对你竖大拇指,灰常感谢!
级别: 新手上路
UID: 358543
可可豆: 24 CB
威望: 23 点
在线时间: 12(时)
发自: Web Page
有点悲剧,我的电脑键盘响应,但是我的手机不响应。求救!!
级别: 新手上路
UID: 358543
可可豆: 24 CB
威望: 23 点
在线时间: 12(时)
发自: Web Page
对第一个回答者的答案,我的电脑键盘可以响应,但是手机无法响应。求有经验者前来搭救。。。
级别: 新手上路
可可豆: 231 CB
威望: 231 点
在线时间: 77(时)
发自: Web Page
我的手机都可以我的手机都可以我的手机都可以
级别: 新手上路
可可豆: 52 CB
威望: 52 点
在线时间: 25(时)
发自: Web Page
同问同问同问同问同问同问同问同问同问
级别: 侠客
可可豆: 88 CB
威望: 88 点
在线时间: 855(时)
发自: Web Page
好像cc.KeyCode列表的值跟实际值不对应,比如android返回键的值改为直接判断code == 6才正确,可以打断点看看
级别: 新手上路
可可豆: 4 CB
威望: 4 点
在线时间: 81(时)
发自: Web Page
同问home没有返回
关注本帖(如果有新回复会站内信通知您)
个人IDP证书一年费用? 正确答案:99美金
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版

我要回帖

更多关于 android 屏蔽home键 的文章

 

随机推荐