这次做项目碰到一个难题。按以前的认识, android的APP运行到哪个页面,按Home返回,再点击桌面图标,程序应该回到刚才显示的界面才对。可是出现了一个bug,客户的手机上,按Home键再返回,程序会重新开始运行,而不是回到刚才的界面。这让我很头疼。。。。
首先要搞清楚点击桌面图标,到底程序是怎么打开的。先看关键源码
void startActivitySafely(Intent intent, Object tag) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { startActivity(intent); } catch (ActivityNotFoundException e) { ...... } catch (SecurityException e) { ...... } }
这里intent包含的信息为:action = "android.intent.action.Main",category="android.intent.category.LAUNCHER"
程序启动中加了个 Intent.FLAG_ACTIVITY_NEW_TASK的属性,在这里有些人对改Flag的认识有误差,以为有这个Flag的就会重新启动一个Task来存放Activity实例。对该Flag的研究,详情见 http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html
关键点是:FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中,前面这句话有点拗口,请多读几遍),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。
那么LauncherMode对按Home键再点击图标有什么影响呢。
我们来做个试验, LauncherMode为standard, singleTop, singleTask都再同一个栈里面的,就没什么好试的了,SingleInstance比较特别,
程序入口ActivityA不设置LauncherMode, ActivityB设为SingleInstance,ActivityC不设置LauncherMode。
试验1:ActivityA->ActivityB->Home键->点击桌面图标。
结果启动了ActivityA, 结论:点击图标程序会启动属于该运用的主Task,即程序第一个启动页面所在的Task, 因为ActivityB不在主Task中,所以系统启动主Task栈顶的ActivityA。
试验2:ActivityA->ActivityB->ActivityC->Home键->点击桌面图标
结果启动了ActivityC,结论同上。
试验3:ActivityA->ActivityB->ActivityC->返回键->返回键
结果第一次返回到了ActivityA,再按返回键回到ActivityB。结论,按返回键实际上是对Task中实例的出栈操作,程序先弹出当前Activity所在栈的所有实例,再去弹出其他栈的实例。
在这里说一些android:allowTaskReparenting=""属性,设置该属性,表示允许其他Task暂时无视该Activity的taskAffinity对栈的影响,可以把该Activity压入自己的栈中。等到该Activity原来的task启动了,改Activity立马根据taskAffinity回到自己的Task中。
例:在"TaskOne应用"中有一个天气预报Activity A, Activity A与"TaskOne应用"中的其它Activity有默认的关系
(taskAffinity属性都没有设置), 并且allowTaskReparenting属性设置为true, 现在存在一个"TaskTwo应用
"启动了"TaskOne应用"中的天气预报Activity A, 这时Activity A与"TaskTwo应用"中的Activity在同一个Task,
命名这个Task堆栈为TaskA, 这时"TaskOne应用"启动, 并且又打开发天气预报Activity A, 这时Activity A会从TaskA堆栈中转移到
"TaskOne应用"所在的堆栈, 即Activity A可以在多个堆栈中来回转移.
详情见http://blog.csdn.net/koko7958/article/details/8082367
http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html
一个新的activity,默认情况下,被加载进调用startActivity()方法的activity对象所在的那个任务中。它被压入和调用者所在的同一个栈中
taskaffinity和Intent.FLAG_ACTIVITY_NEW_TASK或者taskAffinity和SingleTask一起用会开启一个新的Task来存放activity实例,而SingleTask和Intent_FLAG_ACTIVITY_NEW_TASK一起用并不会开启一个新的Task,所以我猜想singleTask模式启动的activity也是有设置Intent.FLAG_ACTIVITY_NEW_TASK属性的。单独使用taskaffinity属性并不会开启一个新的Task。
FLAG_ACTIVITY_CLEAR_TOP也要慎用
public static final int FLAG_ACTIVITY_CLEAR_TOP
If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.
相关推荐
Android Launcher 开发指南 Android Launcher 是 Android 操作系统中的桌面应用程序,负责管理桌面图标、widget 和其他桌面元素。下面我们将一步步指导您如何开发一个自己的 Launcher,並使其替代系统的默认 ...
Android_launcher 开发概述 Android_launcher 是 Android 系统中的一個重要组件,负责管理用户的桌面环境。作为一个 GUI,它不仅需要提供对所有应用程序的映射,还需要具备良好的交互性和美观的界面设计。在 ...
在Android系统中,桌面启动器(Launcher)是用户与Android设备交互的起点,负责展示应用图标、列表和各种小部件。Android允许开发者创建自己的Launcher应用,可以替换掉系统默认的桌面应用。 知识点二:...
Android系统的桌面启动器(Launcher)是用户与设备交互的核心界面,它负责展示应用快捷方式、小部件以及主屏幕布局。其中,`Launcher3`是Android开源项目AOSP(Android Open Source Project)中的默认启动器实现。...
Android Launcher 源码详解 Android Launcher 是 Android 系统中一个非常重要的组件,负责显示桌面程序和管理应用程序图标。了解 Launcher 的源码可以帮助我们更好地理解 Android 系统的设计思想和实现机制。本文...
Android操作系统的核心组件之一就是Launcher,它是用户与系统交互的入口,负责展示桌面图标、应用抽屉等。在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2...
"安卓Android源码——Android Launcher 源码修改可编译.zip" 这个标题表明我们关注的是Android操作系统的源代码,特别是与启动器(Launcher)相关的部分。Launcher是用户与Android系统交互的主要界面,它管理应用...
### Android Launcher ...通过以上对《androidlauncher应用开发完整清晰版》一书的内容总结,可以看出该书旨在全面深入地介绍Launcher开发的核心技术和实践经验,适合希望深入了解Android桌面开发的技术人员阅读学习。
在Android系统中,主启动器(Launcher)是用户与设备交互的核心组件,它负责展示应用图标、快捷方式以及壁纸等,使用户能够启动各种应用程序。然而,Android平台的开放性允许开发者创建次级启动器(Secondary ...
- **隐私保护**:Android 11加强了对用户隐私的保护,如一次性权限和位置访问限制,这些改变也影响了Launcher3的行为。 2. **设计原理** - **组件结构**:Launcher3由多个组件组成,包括主屏幕、应用抽屉、搜索...
在Android开发中,自定义Launcher是一项常见的需求,它允许开发者创建独特的用户界面,提供与原生系统不同的启动器体验。本项目"android 自定义 模仿Launcher"旨在为平板和手机构建一个可自定义的启动器应用。由于...
在Android操作系统中,Launcher是用户与设备交互的首要界面,它负责展示应用图标、壁纸以及管理桌面快捷方式等。本项目是基于最新的Launcher3进行的定制开发,主要目标是将原本的双层桌面结构改为单层,同时增加了一...
可以在Android4.4.2 及以上Android版本上 运行的Launcher3,运行可靠,已经测试。纯净版,无任何附加代码。可供您测试使用或者日常使用。 纯净版,无任何附加。官方代码直接编译得到的。
通过对Android Launcher3源码的深入研究,我们可以了解到循环翻页的实现细节,这对于我们定制自己的桌面应用或者优化系统性能有着重要的指导意义。理解这些底层机制,可以让我们更好地控制用户界面的行为,提供更...
本话题聚焦于如何将官方的Launcher3源代码导入Android Studio,并进行编译,以便我们能对这个启动器进行自定义修改。 【描述】"修改官方Launcher3以适应Android Studio的编译流程" 原生的Launcher3是Android操作...
本压缩包"安卓Android源码——高仿小米launcher(ZAKER)跨屏拖动item.zip"提供了对小米Launcher(ZAKER风格)跨屏拖动item功能的实现,这对于开发者来说是一个宝贵的资源,可以帮助他们学习如何构建类似的应用启动器...
在Android中,每个Activity都有一个`onBackPressed()`方法,它会在用户按下返回键时被调用。我们可以覆盖这个方法来自定义返回键的行为。 **2. 实现步骤** - 在你的Activity类中,重写`onBackPressed()`方法。 - 在...
在Android 4.0(Ice Cream Sandwich,简称ICS)时代,对Launcher的定制提供了更多可能性,让我们深入探讨一下如何理解和分析“android 定制 launcher 4.0源码”。 首先,我们需要理解Android Launcher的基本架构。...
下面,我们将深入探讨Android Launcher桌面分页滑动的相关知识点。 1. **Android UI框架**:在Android中,用户界面主要由View和 ViewGroup 组成。View是基本的UI元素,如按钮、文本框等,而ViewGroup则是布局容器,...
在Android系统中,Launcher是用户与设备交互的主要入口,它负责显示桌面、应用程序快捷方式以及小部件。在Android 6.0(Marshmallow)版本中,开发者对Launcher3进行了重大改进,其中包括引入了新的屏幕切换动画,...