在Android设计中遇到这样一个问题:
Activity A,在AndroidManifest.xml中设置它的一个<inter-filter>为
<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均被销毁了。
我希望改变这种用户体验,让用户在重新进入时可以看到B,如何做呢?
为了实现这个目标,先了解了Android中和Activity,Task,Back stack有关的内容。下面先列出对解决问题有帮助的资料:
1.区分Activity的四种加载模式
这个web,简明地用示例对Activity的四种launchMode做了说明。在没有阅读官方文档前,对launchMode的入门理解很有帮助。而对Activity,Task,Back stack有了一定认识后,再次阅读,也看出了之前没有理解的东西。
2.官方文档
位于docs/guide/topics/manifest/activity-element.html#lmode下的内容,解释对AndroidManifest.xml中设置activity的launchMode设置。
位于docs/guide/topics/fundamentals/tasks-and-back-stack.html下的内容,解释“Tasks and Back Stack“。
3.Android Activities and Tasks
series – An introduction to Android’s UI component model(http://blog.akquinet.de/2010/02/17/android-activites-and-tasks-series-an-introduction-to-androids-ui-component-model/)
这个blog比较完整地和Activity,task有关的内容。下面贴出它的前言部分:
With Android, Google implemented its very own UI component model,
introducing various new terms and concepts probably unfamiliar to most
developers. Although well designed and powerful, it is unconventional,
has a high learning curve and, in some respects, lacks sufficient
documentation. Basic use cases may be quick to implement, but in order
to develop more complex applications, a thorough understanding of
Android’s UI component model is essential.
This series aims at providing this understanding while focusing on the UI related concepts of
activities and
tasks.
Overview
This series is composed out of four posts:
-
This first post gives an introduction to Android’s UI component
model and briefly explains the concepts behind activities and tasks.
-
The second post details the various
intent flags used to customize the start of activies and influence corresponding behavior (
caller).
-
The third post deals with the different activity properties specifyable for the called activity (
callee).
-
The fourth post concludes the series with an exploration of the different combinations of intent flags and activity properties.
另外,这个blog中还提供了一个应用,用以帮助理解Intent flag。
4.解开Android应用程序组件Activity的"singleTask"之谜
此blog的作者描述了他通过源码研究过程,主要讨论的是当Activity的launchMode为singleTask时,分配Task的问题。作者的结论如下:
至此,我们总结一下,设置了"singleTask"启动模式的Activity的特点:
1.
设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值
taskAffinity的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置
了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
2.
如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实
例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。
这个blog中,让我了解了‘adb shell dumpsys activity’的使用。这可以将系统中和activity有关的一些内容转储出来。
最后,下面这个web中,提问者的问题和我想解决的是一致的。
Android: bug in launchMode=“singleTask”? -> activity stack not preserved
回答者renchenyu的答复给出了解决的思路:
This is not a bug. When an existed
"singleTask" activity is launching, all other activities above it in the
stack will be destroyed.
When you press HOME and launch the activity again, ActivityManger
calls an intent{act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER]
flat=FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_RESET_IF_NEEDED cmp=A}, so the
result is A > B > HOME > A.
It's different when A's launchMode is "Standard". The task which
contains A will come to the foreground and keep the state the same as
before.
You can create a "Standard" activity eg. C as the launcher and startActivity(A) in the onCreate method of C
OR
Just remove the launchMode="singleTask" and set
FLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP flag whenever call an
intent to A
分享到:
相关推荐
总之,`singleTask`启动模式在Android应用设计中扮演着重要的角色,它可以帮助开发者实现特定的导航行为和任务管理,而项目中的这些文件则反映了Android应用开发的基本结构和配置。理解并熟练运用这些知识,对于开发...
`SingleTask`模式的特点是,系统中只会存在一个该Activity的实例,且它始终位于一个单独的任务栈(Task)中。如果用户尝试启动一个已经存在的`SingleTask` Activity,系统不会创建新的实例,而是将现有的Activity...
`singleTask`模式的Activity在整个应用程序中只有一个实例,这意味着无论用户如何启动该Activity,它都只会有一个实例活跃在内存中。 2. **任务栈管理**: - **回退栈(Backstack)**:当`singleTask` Activity...
在Android应用开发中,Activity的启动模式(launchMode)是一个重要的概念,它决定了Activity如何被启动以及在任务栈(Task)中的行为。本测试主要关注两种特定的启动模式:singleTask和singleInstance,它们都是...
SingleTask与SingleInstance的区别,看过文档后还是不太明白,于是写了一个测试程序,运行TaskA,页面显示taskid,通过Next调出TaskB的Activity,每个页面都会显示当前的taskid,且通过页面透明叠加,可以清楚看到...
`singleTask`是Android四大启动模式之一,它的特性是系统中只会存在一个该`Activity`的任务栈。当`Activity`被创建时,系统会为它创建一个新的任务栈,并将该`Activity`作为栈底。如果已有相同`Activity`存在于其他...
3. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在Android UI设计中,不同的设备可能需要不同类型的视图,抽象工厂可以用来创建这些视图。 4. **建造者模式**:将复杂...
singleTask启动模式是Android中的一种高级启动模式,它创建一个新的任务栈,并将被启动的Activity作为栈底的Activity。此后,如果同一Activity再次被启动,系统会检查是否存在相同任务栈中的实例,如果存在,就会将...
本文继续介绍Activity的下一个启动模式:singleTask。 singleTask:当设置活动的启动模式为singleTask时,首先检查返回栈中是否存在当前活动,如果存在当前活动的实例,则直接使用当前实例,并把当前活动之上的所有...
来自我的文章http://www.jianshu.com/p/71d99b8bfd5d 中的apk,关于singleTask在Nubia手机无效的问题
例如,如果一个Activity是应用的主要入口点,可能适合设置为singleTask模式,以便于实现一键退出整个应用的功能。而其他次要的Activity可能更适合使用standard或singleTop模式,以保持正常的导航流程。 在实际开发...
10. **责任链模式**:Android的事件分发机制(如触摸事件的onTouchEvent())就是一个责任链,事件会沿着View的层级结构传递,直到被消费。 书中还会详细讲解这些模式在Android源码中的具体实现和实战案例,帮助读者...
这个"Android模拟Activity进出栈-IT计算机-毕业设计.zip"文件包含了一个演示如何模拟Activity在应用程序中按照栈(Stack)行为进行管理的示例项目。这个项目对于理解和实践Android的Activity生命周期以及任务和返回...
3. **单任务模式(singleTask)**:这种模式下,系统会确保Activity只有一个实例存在。如果启动该Activity,且栈中没有它的实例,就会创建新的实例并置于新任务栈的根部;如果栈中已有实例,系统会将该实例上方的...
SingleTask模式下,系统会确保每一个特定的Activity实例在整个任务栈中只有一个实例存在。当用户尝试启动一个已经存在的SingleTask Activity时,系统会将Activity置于前台,并将当前任务栈中的所有位于该Activity之...
视频<activity android:name="com.android.ui.TypeActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar" android:launchMode="singleTask"/> <activity android:name=...
"Android应用源码之模拟Activity进出栈"是一个实用的学习资源,涵盖了Activity生命周期管理、Intent使用、启动模式理解、Manifest配置等多个Android开发关键知识点,对于初学者和毕业设计的学生来说,是一个提升技能...
总的来说,通过研究这个Cc_Player android播放器源码,开发者可以学习到如何在Android环境下构建一个完整的多媒体播放应用,包括服务的使用、活动管理、参数传递、多媒体API的运用以及用户界面设计等多个关键知识点...