- 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/
案例 I:- 当 Intent Flag 覆盖 Manifest 时 在 list 文件中,我将 Activity_B 定义为 singleTop。这些是 list 文件中的相关行:- .... .
如果我们有 2 个 Activity,A 和 B,它们都在 AndroidManifest.xml 中定义为 singleTask,当A启动B时,A将被关闭(onDestroy()被立即调用)。为什么
我对 Android 中不同的 Activity 启动模式感到非常困惑。我知道它与 Activity 堆栈有关,这对我来说也不太清楚。如果能通过简单的用例对每个启动模式进行简短说明,我将不胜感激。 最
我已声明我的 Activity 的启动模式为 singleTask。如果我启动我的应用程序,按主页按钮,转到电子邮件客户端(在本例中为 gmail)并使用我的应用程序预览附件,我我在 Android
我正在实现自定义启动器。我有两个 Activity :启动模式为 singleInstance 或 singleTask 的 Activity A,以及 Activity B。 Activity A
我的应用程序中有 2 个 Activity 。 A Activity 是启动器 Activity 。当我第一次运行应用程序时,启动器 Activity 会运行,但是当我按下主页按钮并通过单击应用程序图
我有一个 WidgetResultActivity 和一个 NotificationResultActivity,我设置了它们的 launchmode=singleInstance。但是它们有不同的行
我正在 Unity 上构建一个 Android 游戏,它有一个打开新 Activity 的按钮。 问题是在构建 APK 时,无论我在自定义 AndroidManifest.xml 中放入什么,Unit
我知道有一些帖子可以解答我要问的问题,但我找不到任何正确答案。 根据我的理解,如果您的主要 Activity (我们称它为 A)的启动模式设置为 singleTask,并且 A 已启动 Activit
关于 http://developer.android.com/guide/topics/manifest/activity-element.html他们将 launchMode 的可能值列为 a
我有 2 个 Activity:Activity A 和 Activity B。Activity A 的启动模式是标准的,Activity B 的启动模式是 singleTask。
我一直在学习 Android,并且遇到了 launchMode="singleTask"的问题。文档指出,当使用此属性时,Activity 始终作为根 Activity 启动到新任务中。其次,文档指出
我有一个 SearchActivity,它在 list 中用 android:launchMode="singleTop" 定义。 我的 SearchActivity 包括一个供用户输入查询的 Sea
一个Activity有四种启动模式,standard、singletop、singletask和singleInstance。前三者比较容易理解,应用广泛。但是到现在为止,我没有发现任何使用singl
什么是一些应用程序示例或用例,其中(singleInstance、singleTask、singleTop)服务于必要的目的。即为什么人们会偏爱一种启动模式而不是另一种?到目前为止,我对它们的体验是严
我一直在想为什么我的 Intent 不会将字符串数据从一个 Activity 传输到另一个 Activity ?我似乎在 list 文件夹中设置了 launchMode = singleTask,当我
这个问题在这里已经有了答案: App completely restarting when launched by icon press in launcher (15 个答案) 关闭 3 年前。
我在我的应用程序中使用了 android:launchMode="singleInstance" 如何在 android api 2.3.3 中完美编译和运行但是当我在基于api 4.0 的andro
我有一个围绕主要 Activity (主菜单)的应用程序。在每个其他应用程序中,都有一个指向此 Activity 的选项菜单项。 起初,我总是在选择这个项目时开始一个新的主要 Activity 。使用
我正在寻找何时使用 launchMode="singleInstance" 的具体示例。我到处阅读,据说很少有场合应该使用它。所以我很惊讶我从来没有看到例子! 我找到的最接近的解释是 here它说:
我是一名优秀的程序员,十分优秀!