`

Android设计中和“singleTask“有关的一个设计问题

阅读更多

      在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:

  1. This first post gives an introduction to Android’s UI component model and briefly explains the concepts behind activities and tasks.
  2. The second post details the various intent flags used to customize the start of activies and influence corresponding behavior ( caller).
  3. The third post deals with the different activity properties specifyable for the called activity ( callee).
  4. 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

分享到:
评论

相关推荐

    android singleTask

    总之,`singleTask`启动模式在Android应用设计中扮演着重要的角色,它可以帮助开发者实现特定的导航行为和任务管理,而项目中的这些文件则反映了Android应用开发的基本结构和配置。理解并熟练运用这些知识,对于开发...

    Android的Activity的Launch模式之SingleTask案例

    `SingleTask`模式的特点是,系统中只会存在一个该Activity的实例,且它始终位于一个单独的任务栈(Task)中。如果用户尝试启动一个已经存在的`SingleTask` Activity,系统不会创建新的实例,而是将现有的Activity...

    android singleTask几个注意点

    `singleTask`模式的Activity在整个应用程序中只有一个实例,这意味着无论用户如何启动该Activity,它都只会有一个实例活跃在内存中。 2. **任务栈管理**: - **回退栈(Backstack)**:当`singleTask` Activity...

    singleTask和singleInstance的测试

    在Android应用开发中,Activity的启动模式(launchMode)是一个重要的概念,它决定了Activity如何被启动以及在任务栈(Task)中的行为。本测试主要关注两种特定的启动模式:singleTask和singleInstance,它们都是...

    SingleTask与SingleInstance实例

    SingleTask与SingleInstance的区别,看过文档后还是不太明白,于是写了一个测试程序,运行TaskA,页面显示taskid,通过Next调出TaskB的Activity,每个页面都会显示当前的taskid,且通过页面透明叠加,可以清楚看到...

    singleTask以及newIntent方法的使用

    `singleTask`是Android四大启动模式之一,它的特性是系统中只会存在一个该`Activity`的任务栈。当`Activity`被创建时,系统会为它创建一个新的任务栈,并将该`Activity`作为栈底。如果已有相同`Activity`存在于其他...

    Android源码设计模式解析与实战 pdf 高清完整版

    3. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在Android UI设计中,不同的设备可能需要不同类型的视图,抽象工厂可以用来创建这些视图。 4. **建造者模式**:将复杂...

    Activity启动模式之singleTask示例代码

    singleTask启动模式是Android中的一种高级启动模式,它创建一个新的任务栈,并将被启动的Activity作为栈底的Activity。此后,如果同一Activity再次被启动,系统会检查是否存在相同任务栈中的实例,如果存在,就会将...

    Android Activity启动模式之singleTask实例详解

    本文继续介绍Activity的下一个启动模式:singleTask。 singleTask:当设置活动的启动模式为singleTask时,首先检查返回栈中是否存在当前活动,如果存在当前活动的实例,则直接使用当前实例,并把当前活动之上的所有...

    singleTask无效 (Nubia)apk

    来自我的文章http://www.jianshu.com/p/71d99b8bfd5d 中的apk,关于singleTask在Nubia手机无效的问题

    Android入门之Activity四种启动模式(standard、singleTop、singleTask、singleInstance)

    例如,如果一个Activity是应用的主要入口点,可能适合设置为singleTask模式,以便于实现一键退出整个应用的功能。而其他次要的Activity可能更适合使用standard或singleTop模式,以保持正常的导航流程。 在实际开发...

    Android源码设计模式解析与实战

    10. **责任链模式**:Android的事件分发机制(如触摸事件的onTouchEvent())就是一个责任链,事件会沿着View的层级结构传递,直到被消费。 书中还会详细讲解这些模式在Android源码中的具体实现和实战案例,帮助读者...

    Android 模拟Activity进出栈-IT计算机-毕业设计.zip

    这个"Android模拟Activity进出栈-IT计算机-毕业设计.zip"文件包含了一个演示如何模拟Activity在应用程序中按照栈(Stack)行为进行管理的示例项目。这个项目对于理解和实践Android的Activity生命周期以及任务和返回...

    Activity生命周期与启动模式

    3. **单任务模式(singleTask)**:这种模式下,系统会确保Activity只有一个实例存在。如果启动该Activity,且栈中没有它的实例,就会创建新的实例并置于新任务栈的根部;如果栈中已有实例,系统会将该实例上方的...

    SingleTask和SingleInstance

    SingleTask模式下,系统会确保每一个特定的Activity实例在整个任务栈中只有一个实例存在。当用户尝试启动一个已经存在的SingleTask Activity时,系统会将Activity置于前台,并将当前任务栈中的所有位于该Activity之...

    android网络视频播放器(完整可运行).zip

    视频&lt;activity android:name="com.android.ui.TypeActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar" android:launchMode="singleTask"/&gt; &lt;activity android:name=...

    Android应用源码之模拟Activity进出栈-IT计算机-毕业设计.zip

    "Android应用源码之模拟Activity进出栈"是一个实用的学习资源,涵盖了Activity生命周期管理、Intent使用、启动模式理解、Manifest配置等多个Android开发关键知识点,对于初学者和毕业设计的学生来说,是一个提升技能...

    Cc_Player android播放器

    总的来说,通过研究这个Cc_Player android播放器源码,开发者可以学习到如何在Android环境下构建一个完整的多媒体播放应用,包括服务的使用、活动管理、参数传递、多媒体API的运用以及用户界面设计等多个关键知识点...

Global site tag (gtag.js) - Google Analytics