是什么让一个 singleTask 活动有 2 个实例?

2024-06-14

根据docs https://developer.android.com/guide/topics/manifest/activity-element#lmode,singleTask 活动不能有多个实例。我的应用程序的唯一活动是 singleTask,它同时有 2 个实例。

重现问题的步骤

Step 1

在Android Studio 3.3.1中新建一个项目,添加No Activity,命名为singleTaskBug,(包com.example.singletaskbug),使用最低 API 级别 21 的 Java 语言,不支持即时应用程序。

Step 2

通过编辑手动添加新活动AndroidManifest.xml然后创建一个新的Java类appjavacom.example.singletaskbug named LauncherActivity.

内容AndroidManifest.xml:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".LauncherActivity"
        android:excludeFromRecents="true"
        android:launchMode="singleTask">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />

        </intent-filter>

    </activity>
</application>

内容LauncherActivity.java:

package com.example.singletaskbug;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;

public class LauncherActivity extends Activity {

    static int instanceCounter = 0;
    final int instanceId;
    final String TAG = "STB";

    public LauncherActivity() {
        instanceId = ++instanceCounter;
        Log.d(TAG, "Constructed instance " + instanceId + ".");
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "Created instance " + instanceId + ".");
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d(TAG, "New intent to instance " + instanceId + ".");
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "Destroyed instance " + instanceId + ".");
        super.onDestroy();
    }
}

Step 3

Go to RunEdit Configurations... and in the Launch Options section set Launch: to Specified Activity, and Activity: com.example.singletaskbug.LauncherActivity, then click OK, and Run 'app' ShiftF10.

Step 4

等到活动变得可见。现在在测试设备(在我的例子中为 API 21)上,转到设置将此应用程序设置为默认启动器。然后按主页按钮。此时您将在 Logcat 中看到这一点:

02-15 17:22:01.906 26429-26429/com.example.singletaskbug D/STB: Constructed instance 1.
02-15 17:22:01.916 26429-26429/com.example.singletaskbug D/STB: Created instance 1.
02-15 17:22:24.228 26429-26429/com.example.singletaskbug D/STB: Constructed instance 2.
02-15 17:22:24.248 26429-26429/com.example.singletaskbug D/STB: Created instance 2.

一个 Android 应用程序可以有多个任务。每个任务可以有多个活动。singleTask and singleInstance控制任务内活动的行为(其唯一性),但应用程序可能有两个或多个任务具有相同的任务Activity inside.

这就是这里实际看到的,一个有两个任务的应用程序LauncherActivity在里面,每个任务一个。作为解决方法,请确保应用程序中始终有一项任务。上LauncherActivity onCreate add:

val appTasks = getSystemService(ActivityManager::class.java).appTasks
if (appTasks.size >= 2) {
    appTasks.dropLast(1).forEach { it.finishAndRemoveTask() }
    appTasks.last().moveToFront()
    return
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么让一个 singleTask 活动有 2 个实例? 的相关文章

  • 您的应用中的 Google Analytics SDK

    我按照这里的说明进行操作 https developers google com analytics devguides collection android v3 https developers google com analytics
  • 使用 ColorMatrix 调整亮度

    我正在尝试使用 ColorMatrix 调整图像的亮度 当尝试调整色相时 您可以在 Photoshop 中看到此选项 亮度和亮度也是两个不同的功能 但我不知道要更改哪些值才能实现此目的 目前我可以使用此代码更改色调 public stati
  • 需要对某些片段禁用 CollapsingToolbarLayout 的展开

    我有一个AppCompatActivity控制替换许多片段 这是我的布局 活动 main xml
  • AIRPLANE_MODE 的广播接收器无法与 SDK 26 一起使用

    通常 我使用简单的代码来放置Toast当用户改变AIRPLANE MODE 并且它可以使用targetSdkVersion 25 我的 AirPlaneModeReceiver public class AirPlaneModeReceiv
  • 升级到 Proguard 4.8 后无法导出应用程序

    我刚刚将我的 Android SDK ADT 和 Proguard 升级到最新最好的版本 我的项目在调试模式下编译并运行良好 但是当我尝试导出它的签名版本 APK 时 我收到来自导出向导的错误Eclipse 控制台上没有任何错误日志消息 如
  • android:ScrollView(或视差)内的RecyclerView

    我有一个片段2 次卡片浏览内有多个控件 below我有第二个卡片视图回收者视图 这有效perfect 问题是 recyclerview 启动了屏幕的最底部 并且滚动recyclerview非常small 以前使用过列表视图 这使我可以适应您
  • 如何使用retrofit2动态设置超时?

    public class Router private static Retrofit retrofit null public Retrofit getRetrofit if retrofit null OkHttpClient clie
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • 使用 RoboSpice 有没有办法从异常中获取 HTTP 错误代码?

    我正在编写一个使用 RoboSpice 的应用程序 在请求侦听器 onRequestFailure SpiceException arg0 中 有没有办法确定该错误是由于发生 401 HTTP 错误而导致的 我有一个后端服务 当令牌过期时
  • Android 音乐播放器应用程序:如何为服务中运行的媒体播放器设置完整的侦听器?

    我正在编写一个音乐播放器应用程序 我在服务中有 MediaPlayer 对象 问题是 我不知道如何从服务更新用户界面 例如 我想更新当前歌曲的剩余时间 但是 因为 MediaPlayer 正在服务 我无法设置 MediaPlayer 对象的
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 在 Android 中使用 AES 加密的最佳实践是什么?

    我为什么问这个问题 我知道人们对 AES 加密存在很多疑问 即使对于 Android 也是如此 如果您在网络上搜索 会发现很多代码片段 但在每个页面上 在每个 Stack Overflow 问题中 我都发现了另一个具有重大差异的实现 所以我
  • 本地管理的广播接收器泄漏?

    当应用程序被系统杀死时 本地 即使用 LocalBroadcastManager 管理 BroadcastReceiver 是否有可能泄漏 我需要它的具体用例是我想在活动的 onCreate onDestroy 中注册 注销 Broadca
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • Android SDK WebView调用Activity

    我试图在单击 WebView 组件内的链接时启动活动 我的Webview已加载到里面Main java我想启动SubActivity java当点击网站内的链接时Main java 另外 如何将参数传递给此活动 Example inspec
  • FCM 主题是否适合更多用户?

    我对使用主题消息有点困惑 我的场景是根据通知触发一些作业 请帮助我更多地了解这一点 如果我们正在处理大量用户 则可以使用 FCM 主题向用户发送通知 我们可以只使用数据消息和主题消息吗 使用主题发送的消息是否保证送达 我在 FCM 文档中看
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy

随机推荐

  • C中的子父关系和继承

    我对 C 完全陌生 使用以下命令创建的子项继承了哪些流程项fork 与父进程不同的进程项有哪些 这和C没有太大关系 而是和fork 这是一个 POSIX 系统调用 我猜它在不同系统上的行为可能有所不同 我建议你阅读fork manual h
  • MYSQL中收盘价的简单移动平均线计算和更新表

    我可以使用一些帮助 最好是虚拟指南 来更新下表 CREATE TABLE SYMBOL day date NOT NULL open decimal 8 3 DEFAULT NULL high decimal 8 3 DEFAULT NUL
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • 当命令在 Ubuntu 终端中运行时,为什么 Dart 的“Process.start”无法执行 Ubuntu 命令?

    我有命令想用 Dart 调用 命令是sonar runner如果我在普通的 Ubuntu 终端中运行它 它会完美运行 这是因为我已经编辑了PATH in the profile文件 使其成为全局命令 但是 如果我写一个简单的Process
  • 如何判断一个类是否被某个特定属性修饰

    我试图确定接口是否用特定属性装饰 例如我有以下界面
  • 如何使用 javascript 选择元素的所有子元素并更改 CSS 属性?

    我正在开发一个包含 32 个孩子的 div 项目 我需要创建一个下拉菜单来更改每个 div 和父级的背景 对于项目中没有子项的其他部分 我一直在使用以下代码 function changediv color document getElem
  • 提取两个分隔符之间的数据

    我只想知道是否可以获取两个分隔符之间存在的数据 分隔符是一个字符串 例如原始字符串如下
  • Android:应用内结算问题

    我正在将应用内计费集成到我的应用程序中 但是 我在测试我的应用程序时遇到了问题 每次 我都会尝试购买应用内商品 一条有线消息出现找不到您尝试购买的商品 在Logcat上 出现以下内容 09 10 14 45 02 437 E IabHelp
  • Android Studio“无法解析符号 R”但项目编译并运行

    Android Studio 在所有 java 文件中显示为红色 无法解析符号 R 但项目可以编译并运行 我已经尝试过这里的所有解决方案 Android Studio 无法解析符号 但项目可以编译并运行 https stackoverflo
  • 如何从 url Codenameone 创建图像

    我需要从具有图像 url 的字符串创建一个新的 Image 实例 E g http maps gstatic com mapfiles place api icons restaurant 71 png http maps gstatic
  • Maven 忽略的 uniqueVersion 标记

    我正在尝试做一些我认为很简单的事情 出于空间考虑 停止创建快照构建的独特版本 所以我用这个设置我的 pom
  • 将 svn 存储库添加到现有的 git 存储库中?

    我知道你可以使用 git svn init 来跟踪 svn 存储库 但这是为了你想创建一个全新的存储库 我的情况是 我目前已经有一个现有的 git 存储库 并且希望通过将 svn 存储库设为我当前 git 存储库中的远程分支来跟踪 svn
  • RESTful API:仅用于验证的方法/标头组合

    我希望我的 API 有一个仅验证请求 例如 如果我有一个 URL 例如 http api somesite com users 12345 用户正在客户端上填写一份信息表单 我最终会将其修补 放置 发布到该资源 当用户填写表单时 我可能希望
  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • FPDF 多单元对齐不起作用

    我的 pdf 中有这个多单元格 pdf gt multicell 115 6 name 1 0 L 1 但事实证明文本是右对齐而不是左对齐 我发现同样的问题here https stackoverflow com questions 153
  • intellij idea运行配置备份

    我想创建一个脚本来修改 intellij 中的调试配置 tomcat的路径发生了变化 我必须手动进入运行配置并编辑内容 我试图找到intellij存储这些设置的地方 但没有成功 question 有谁知道 IJ 在哪里存储其运行配置 该位置
  • 如何将值传递到 selectOneMenu 中的监听器

    我有 2 个下拉菜单 类型和代码 如果值 A 或 B 或 C 我希望代码下拉列表根据类型下拉列表更改值 如何将 A 或 B 或 C 的值传递给侦听器 以便它可以理解和处理我的 List
  • 使用 swift 准备 ForSegue 集合查看索引路径

    我没有找到任何好的例子来使用 swift 做我想做的事情 所以我允许自己问这个问题 我使用 collectionView 来显示 PFObjects 我想使用prepareForSegue 将显示的单元格数据发送到第二个控制器 此时 我正在
  • 确定当前变更集在哪些分支中

    我需要以编程方式跟踪变更集 确定变更集当前位于哪个分支 Update 假设我们的项目有三个分支 开发 测试和发布 每当我们准备好使用一些变更集时 我们首先将它们合并到测试中 然后在测试完成后立即将它们合并到发布中 我需要知道给定的变更集位于
  • 是什么让一个 singleTask 活动有 2 个实例?

    根据docs https developer android com guide topics manifest activity element lmode singleTask 活动不能有多个实例 我的应用程序的唯一活动是 single