android:launchMode与android:taskAffinity之间的相互影响

2023-05-16

最近有处理一个问题是:WPS office分屏状态下新建一个TXT时会在另一个窗口显示编辑界面。

分析流程:出现这种问题一般都是新建的界面设置了一些特别的属性导致。

通过命令dumpsys window |grep mFocusedWindow 查看新建一个TXT界面对应的Activity是:cn.wps.moffice_eng/cn.wps.moffice.writer.multiactivity.Writer1

通过反编译WPS office apk,查看AndroidManifest.xml文件,Writer1对应的声明为:

<activity
android:configChanges="fontScale|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" 
    android:hardwareAccelerated="true" 
    android:icon="@drawable/public_icon_activity_writer" 
    android:label="@string/activity_label_writer"
    android:launchMode="singleTask" 
    android:name="cn.wps.moffice.writer.multiactivity.Writer1" 
    android:process=":writer1"
    android:taskAffinity="cn.wps.moffice_eng.writer1" 
    android:theme="@style/WriterTheme" 
    android:windowSoftInputMode="stateAlwaysHidden|adjustResize"/>

通过自己写简单app验证,是由于加了launchMode及taskAffinity属性导致两个Activity属于不同的Task导致。

正好借此机会梳理下android:launchMode与android:taskAffinity之间的关系。

1.android:launchMode

Activity的启动模式,属性值有4个,对应4种不同的启动模式。具体可以参考Activity的四种启动模式

standard:标准模式,默认模式。每次启动Activity时,总是创建一个新的Activity实例,并把这个Activity实例添加到当前的Task中(不会创建新的Task),不管这个Task中是否已经有了一个相同的Activity的实例。

singleTop:Task顶部单例模式,当将要启动的Activity已经位于Task顶部,则不创建新的Activity实例,而是直接使用已有的Activity实例,否则在当前Task中创建新的Activity实例。

singleTask:Task内单例模式,在同一个Task中已经存在了将要创建的Activity的实例,则直接复用,不再新创建Activity实例。即在同一个Task中,只存在同一个Activity的一个实例。分3种情况:

(1)在Task中将要创建的Activity不存在,则创建Activity的实例。

(2)在Task中将要创建的Activity存在,且位于栈顶,则不创建Activity的实例,直接复用。此时与singleTop模式一致

(3)在Task中将要创建的Activity存在,不位于栈顶,则系统把位于该Activity实例之上的所有Activity移出Task,使得目标Activity位于栈顶。

singleInstance:全局单实例模式,无论从哪个Task中启动目标Activity,只会创建一个Activity实例,并且会使用一个新的Task来存放该Activity。

2.android:taskAffinity

Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的依附关系。默认情况下在同一个应用中,启动的Activity都在同一个Task中。

在standard模式下,设置两个Activity的android:taskAffinity不一致,打开这两个Activity,得到TaskId是一样的,即这两个Activity被放置在同一个task中。

在singleTop模式下,设置两个Activity的android:taskAffinity不一致,打开这两个Activity,得到TaskId是一样的,即这两个Activity被放置在同一个task中。

在singleTask模式下,设置两个Activity的android:taskAffinity不一致,打开这两个Activity,得到TaskId是不一样的,即这两个Activity被放置在两个task中。当两个Activity被放置在两个Task中的时候,点击recent键,可以看到此时recent应用中分别显示Activity1和Activity2。设置两个Activity的android:taskAffinity一致(非默认),打开这两个Activity,得到TaskId是不一样的,即这两个Activity被放置在两个task中。设置两个Activity的android:taskAffinity一致(默认的),打开这两个Activity,得到TaskId是一样的。

在singleInstance模式下,设置两个Activity的android:taskAffinity不一致,打开这两个Activity,得到TaskId是不一样的,即这两个Activity被放置在两个task中。当两个Activity被放置在两个Task中的时候,点击recent键,可以看到此时recent应用中分别显示Activity1和Activity2。设置两个Activity的android:taskAffinity一致(非默认),打开这两个Activity,得到TaskId是不一样的,即这两个Activity被放置在两个task中。设置两个Activity的android:taskAffinity一致(默认的),打开这两个Activity,得到TaskId是不一样的。

以上都有进行简单的代码验证,代码太简单,就不贴了~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android:launchMode与android:taskAffinity之间的相互影响 的相关文章

  • 查看寻呼机 - 使用静态变量以编程方式滑动到下一页

    我想在我的 ViewPager 中以编程方式制作幻灯片 我的问题是 滑动事件是由放置在 ViewPager 保存的片段内部的按钮调用的 我知道代码 viewpager setCurrentItem int index 现在我的想法是使 Vi
  • 为什么 cordova.file.documentsDirectory 为空?

    我正在尝试使用 cordova plugin file transfer 在http ngcordova com docs plugins fileTransfer http ngcordova com docs plugins fileT
  • 意图?如何注册以获得传入电子邮件提醒?

    这里是极限 Android 开发新手 好吧 Android 开发新手 而不是一般开发 我想编写一个应用程序 当电子邮件进入设备时会收到通知 并根据电子邮件中的数据 主题 发件人 收件人等 采取各种操作 我认为我要做的是创建一个带有 Inte
  • 使用 GoogleServices 插件时忽略 Gradle ArchivesBaseName

    我经常使用 archivesbasename 来重命名我的输出 apk 但自从使用 google services 插件后 它就被忽略了 我能做些什么来让它再次工作吗 下面附上了我完整的 build gradle 感谢您的指点 apply
  • Android自定义控件命名空间问题

    我一直在为 Android 开发自定义控件 尽管我尝试按照建议进行操作here https stackoverflow com questions 4495511 how to pass custom component parameter
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • Android ListView 自定义适配器 ImageButton

    这可能不是正确的方法 如果有更好的方法请告诉我 我创建了一个自定义适配器类 在我的 getView 方法中我膨胀了我想要使用的视图 public View getView int position View convertView View
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 游标索引越界异常

    打开后出现光标索引越界错误 数据库 请任何人告诉我如何打开现有数据库 sqllite Android 我想在数据库上触发一个选择查询 检索一些信息 public void getPatient SQLiteDatabase db Strin
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 在浏览器中打开 URL,即使我的应用程序为其注册了意图过滤器

    我的应用程序为某些 URL 注册了一个意图过滤器 因为它可以处理来自这些 URL 的数据 但是 在应用程序内部 我想提供一个按钮来在浏览器中打开这样的 URL 也就是说 如果设置了默认浏览器 则在默认浏览器中打开它 否则提供一个选择器 就像
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • Application.onLowMemory() 未调用

    我创建了自己的应用程序类 我尝试调试它 代码在 Application onCreate 处停止 但不会在 onLowMemory 处停止 为了测试该场景 我打开了许多其他高内存应用程序 我看到的是调试会话终止 在 Eclipse 中 并且
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • 在android中使用BaseActivity的不同活动中的通用标头

    我想编写一次代码并在不同的活动中使用 我创建了一个Base Activity class为了那个原因 此外 不同活动中所有布局的标题都是相同的 我在以下人员的帮助下做到了这一点

随机推荐

  • 关于SQL SERVER注释快捷键

    SQL Server Management Stuido提供了键盘和按钮快捷方式来注释掉突出显示的代码 只需突出显示要禁用或注释掉的代码部分 xff0c 再单击SQL Editor工具栏上的Comment Selection按钮即可 xff
  • Linux 网络编程—— libnet库详细使用指南

    概述 通过 原始套接字实例 xff1a 发送 UDP 数据包 的学习 xff0c 我们组 UDP 数据包时常考虑字节流顺序 校验和计算等问题 xff0c 有时候会比较繁琐 xff0c 那么 xff0c 有没有一种更简单的方法呢 xff1f
  • 论文一:基于实体多元编码的时序知识图谱推理_彭成

    xff08 本文很好的介绍了时序知识图谱的推理 xff0c 重要 xff01 xff01 xff01 xff09 时序知识图谱定义 xff1a 时序知识图谱是一种多关系有向图 xff0c 结点时时序知识图谱中的实体 xff0c 有向边是实体
  • SQLException: null, message from server: “Host ‘10.112.71.80‘ is blocked because of many connection

    启动项目后也看到报 SQLException null message from server 34 Host 39 10 112 71 80 39 is blocked because of many conne 这一类异常翻译来看是由于
  • Python案例003——句子生成器

    目标 xff1a 通过用户提供的内容 xff0c 随机生成唯一的句子 提示 xff1a 以用户输入的名词 代词 形容词等作为输入 xff0c 然后将所有数据添加到句子中 xff0c 并将其组合返回 输出固定的 内容 43 用户输入的内容 c
  • 通过Python复制远程服务器下的文件到本地

    使用Python拷贝windown共享目录下的文件 1 先通过net use命令获取共享目录访问权限 2 使用xcopy命令进行文件拷贝到本地目录 代码如下 import os share user 61 39 user 39 share
  • Centos6.5下进行PHP版本升级

    统计插件 WP Statistics 要求PHP5 4以上 xff0c 可本机PHP为5 3 3 xff0c 无奈只有对服务器PHP进行升级 xff0c 遂写下本文 Step1 xff1a 查看安装服务器当前安装版本 php V Step2
  • Ubuntu18.04 设置 sudo 不需要输入密码

    1 在系统启动后 xff0c 对于有些系统设备操作 xff0c 需要使用root权限执行 xff1b 这时候往往需要用到sudo命令 2 使用sudo命令 xff0c 必须输入用户密码 xff0c 但是在应用程序里面 xff0c 输入密码操
  • ipa文件的安装方法

    ipa文件无法像android的apk那样直接安装 xff0c 是因为需要能直接安装ipa xff0c 打包ipa的时候 xff0c 是需要创建不同的证书和证书profile文件的 下面我对三种情况进行概述 1 company类型 xff0
  • Windows7睡眠后自动唤醒

    笔者的电脑 xff08 Windows7 64 位旗舰版 xff09 睡眠后 xff0c 隔段时间后会自动唤醒 经两项配置后 xff0c 解决了该问题 1 禁用唤醒定时器 控制面板里进入 34 电源选项 34 34 更改计划设置 34 界面
  • 开机动画制作及多分辨率适配

    1 开机动画制作 开机动画资源文件 xff1a bootanimation zip 解压后的文件目录 xff1a desc txt文件内容 xff1a 512 416 60 代表的分别是宽 xff0c 高 xff0c 帧数 xff1b 具体
  • 查看Settings中的值

    1 列出所有的值 settings list secure global 如 xff1a settings list global 2 查看指定的值 settings get secure global xxx 如 xff1a settin
  • product 分区和权限

    在 Android 9 及更高版本中 xff0c 权限和列入白名单过程的更改会影响 product 分区上授予特权应用权限的方式 permissions xml 文件必须与特权应用位于同一个分区中 之前有遇到过 xff0c 应用在produ
  • 判断字符串中只包含字母和数字

    最近做一个小小的项目 xff0c 有输入用户名一项 xff0c 要求只能输入字母和数字 即在用户输入用户名后 xff0c 要做一个关于用户名的合法判断 xff1a 只包含字母和数字 一开始以为这个超级简单啊 xff0c 想都没想就直接使用了
  • Android中修改默认字体的大小----fontScale

    有客户需求要修改系统中默认字体的大小 一般的步骤是 xff0c 在frameworks base core java android content res Configuration java文件中 xff0c 修改函数setToDefa
  • Apk解压后查看AndroidManifest.xml文件内容

    一般对于我来说如果需要知道一个apk的包名的话 xff0c 有两种比较快速的方式 xff1a xff08 1 xff09 使用命令 xff1a aapt dump badging xxx apk xff0c 一般是apk就在电脑上 xff0
  • Failed to load WebView provider: No WebView installed

    系统中已经集成了Chrome及WebviewGoogle xff0c 但是在打开个别使用到WebView的应用的时候 xff0c 还是会出现应用FC xff0c 如 xff1a Setting gt System gt About phon
  • Apache中更改PHP版本型号

    如何对服务器PHP版本进行升级 xff0c 详看我另外一篇博文 xff0c 这篇文章我们将讲述如何在Apache中更改PHP版本型号 Step1 xff1a 查看Apache用的PHP什么版本 新建一个文档 xff0c 命名为info ph
  • 执行adb disable-verity提示:Device is locked. Please unlock the device first

    有时候需要push应用或是so文件到system目录下 xff0c 这时候就需要执行adb remount xff0c 但是有时候会提示 xff1a remount of the superblock failed Permission d
  • android:launchMode与android:taskAffinity之间的相互影响

    最近有处理一个问题是 xff1a WPS office分屏状态下新建一个TXT时会在另一个窗口显示编辑界面 分析流程 xff1a 出现这种问题一般都是新建的界面设置了一些特别的属性导致 通过命令dumpsys window grep mFo