- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 2 个 Activity:Activity A 和 Activity B。Activity A 的启动模式是标准的,Activity B 的启动模式是 singleTask。
<activity
android:name=".AActivity"
android:label="@string/app_name"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="dd"></data>
<data android:host="a"></data>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
android:name=".BActivity"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="dd"></data>
<data android:host="b"></data>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
我启动应用程序,启动器 Activity A 启动。然后我按主页按钮并返回手机的主屏幕。然后我启动浏览器应用程序并键入以下内容:
dd://b
打开 Activity B。系统导航到我的 App 并在 Activity A 之上启动 Activity B。此时,如果我按下后退按钮,Activity B 会弹出,我会看到 Activity A。
这不是我所期望的,因为 android 文档指出:
For singleTask activities, the system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.
我从这些句子中理解的是,在我的例子中,由于 Activity B 的实例不存在,一个新任务应该已经启动并且它的堆栈中应该只有 Activity B(我的应用程序的另一个实例应该仍然存在于一个单独的任务中,它的堆栈中应该有 Activity A)。然后,如果我在 Activity B 中按下返回键,因为它是后台堆栈中唯一的 Activity,它会弹出,系统返回到浏览器。
为什么不是这样? Android 系统如何知道我的应用程序已打开并导航到它并在现有应用程序堆栈之上启动 Activity B,而不是启动我的应用程序的另一个实例并让我的应用程序的两个实例拥有自己的堆栈? 在新任务中实例化 Activity 是什么意思?谁能解释一下?
谢谢。
最佳答案
除了已接受的答案外,我还找到了对此问题的解释。正如 android 文档所述:
The affinity indicates which task an activity prefers to belong to. By default, all the activities from the same application have an affinity for each other. So, by default, all activities in the same application prefer to be in the same task which belongs to that app(The app that has the Activity B). However, you can modify the default affinity for an activity.
因此,如果您的应用程序正在运行,并且您启动了一个具有 launchMode:singleTask
属性的 Activity ,除非您明确声明 taskAffinity 属性,否则它会在同样的任务。但是,如果您在 list 中明确声明亲和性:
<activity
android:name=".BActivity"
android:label="@string/app_name"
android:taskAffinity=""
android:launchMode="singleTask">
</activity>
然后它在新任务中启动 Activity 。
可以通过以下adb命令查看哪个activity属于哪个task:
adb shell dumpsys activity
此外,为了更好地理解 launchMode 概念,您可以在 Google Play 中查看以下应用:https://play.google.com/store/apps/details?id=com.novoda.demos.activitylaunchmode
关于android - launchMode ="singleTask"不创建新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32824079/
如果我们有 2 个 Activity,A 和 B,它们都在 AndroidManifest.xml 中定义为 singleTask,当A启动B时,A将被关闭(onDestroy()被立即调用)。为什么
谁能给我一个例子,说明我们如何通过在堆栈顶部创建一个具有 launchMode=singleTask 的 Activity 来创建任务返回堆栈,并且它不是返回堆栈中的唯一 Activity 。 例如,
我阅读了 android 开发者指南和互联网上的一些文章,我仍然对 singleTask launchmode 感到困惑。举个例子: 用户启动 App1,android 启动一个新任务。假设 App1
我有一个启动器应用,它有一个singleTask Activity 作为主要入口点。当用户导航到另一个 Activity 或第 3 方应用程序,然后点击 主页按钮 时,应该将此 Activity 置于
我已声明我的 Activity 的启动模式为 singleTask。如果我启动我的应用程序,按主页按钮,转到电子邮件客户端(在本例中为 gmail)并使用我的应用程序预览附件,我我在 Android
我有两个应用程序,我将它们分别称为应用程序 A 和应用程序 B。应用程序 B 是一个单任务应用程序,通常情况下,如果您从主屏幕启动此应用程序并使用后退按钮,您将不会被允许返回主屏幕。现在假设应用程序
我在 list 中定义了一个 Activity “A”,如下所示: 当我启动我的应用程序时,该 Activity 总是从一开始就加载。它不会
我对 Activity 启动模式感到非常困惑。这是场景。 Activity A - main, launcher with singleTask launch mode Activity B - si
可能重复 Deep linking and multiple app instances .我在我的应用程序中实现了深度链接。我有作为启动器的 Splash Activity 和处理 list 中定义
我知道有一些帖子可以解答我要问的问题,但我找不到任何正确答案。 根据我的理解,如果您的主要 Activity (我们称它为 A)的启动模式设置为 singleTask,并且 A 已启动 Activit
在我的应用程序中有一个我不理解的行为。我将 MainActivity A 作为 SingleTask。它调用 Activity B 也是 SingleTask。当我在第二个 Activity 中按下
我有 2 个 Activity:Activity A 和 Activity B。Activity A 的启动模式是标准的,Activity B 的启动模式是 singleTask。
我一直在学习 Android,并且遇到了 launchMode="singleTask"的问题。文档指出,当使用此属性时,Activity 始终作为根 Activity 启动到新任务中。其次,文档指出
我有一个在后台运行并通过通知系统显示错误消息的应用程序。此通知有一个 pendingIntent,它会返回到应用程序的主屏幕。在这个主屏幕上,我设置了 launchmode="singleTask"。
这张图对理解很有帮助launhmode singleTask 提供的功能,取自 here 但是,我在同一应用程序的情况下理解这一点,我在理解时遇到问题 如果两个任务属于两个不同的应用程序怎么办 令人困
我已经阅读了谷歌 Android 开发者页面,但任务的概念 ( http://developer.android.com/guide/components/tasks-and-back-stack.h
我有一个主要 Activity ,启动模式设置为“singleTask”。当我将其置于前台并调用 onNewIntent 方法时,它会运行一个包含 while 循环的 AsyncTask,该循环从文本
我在将单一任务 Activity 重新显示在 View 中时遇到了一些麻烦。 list : 我的 Activity 代码: Intent i
我一直在阅读关于启动模式的文档,有一件事我不明白。doc表示单任务活动始终是堆栈的根: 相反,“singletask”和“singleinstance”活动只能 开始一项任务。它们始终位于活动堆栈的根
我有一个围绕主要 Activity (主菜单)的应用程序。在每个其他应用程序中,都有一个指向此 Activity 的选项菜单项。 起初,我总是在选择这个项目时开始一个新的主要 Activity 。使用
我是一名优秀的程序员,十分优秀!