当前位置: 首页 > 知识库问答 >
问题:

如何使活动重新排序到前台“真实”?

蒋俊
2023-03-14

我使用FLAG\u ACTIVITY\u REORDER\u TO\u FRONT尝试在活动之间切换。因为这是一辆马车(回来时有时会藏起来),所以我试着潜入其中。

FLAG_ACTIVITY_REORDER_TO_FRONT并没有真正使活动移动到顶部,正如我从adb中看到的,活动顺序从未改变:

xb@dnxb:~/Downloads$ adb shell dumpsys window windows | grep -n 'Window #'
2:  Window #13 Window{f7d02ea u0 NavigationBar}:
31:  Window #12 Window{fdfb1ed u0 com.android.systemui}:
56:  Window #11 Window{b626be1 u0 StatusBar}:
84:  Window #10 Window{bd80846 u0 KeyguardScrim}:
109:  Window #9 Window{f127fe9 u0 AssistPreviewPanel}:
134:  Window #8 Window{f5a5c17 u0 DockedStackDivider}:
162:  Window #7 Window{5170bb1 u0 com.android.systemui}:
188:  Window #6 Window{201fb75 u0 InputMethod}:
217:  Window #5 Window{7555f63 u0 com.stackoverflow/mythirdActivity}:
246:  Window #4 Window{7e3a230 u0 com.stackoverflow/mySecondActivity}:
273:  Window #3 Window{7a4b856 u0 com.stackoverflow/myFirstActivity}:
300:  Window #2 Window{cc1c79f u0 com.huawei.android.launcher/com.huawei.android.launcher.unihome.UniHomeLauncher}:
329:  Window #1 Window{f2df7b0 u0 com.android.systemui/com.android.systemui.recents.RecentsActivity}:
357:  Window #0 Window{5a3ffdc u0 com.anifree.engine.Wallpaper}:

FLAG\u ACTIVITY\u REORDER\u TO\u FRONT仅从以下位置更改“焦点状态”:

 mDrawState=NO_SURFACE       mLastHidden=true

为此:

  mSurface=Surface(name=com.stackoverflow/mySecondActivity)
  Surface: shown=true layer=21020 alpha=1.0 rect=(0.0,0.0) 1080.0 x 1920.0 blurRadius = 0 blurRound = (0,0) blurAlpha = 0.0 blurRegion = null blurBlank = null
  mDrawState=HAS_DRAWN       mLastHidden=false

但如果我按home按钮四处玩,我可以看到launcher窗口能够“真正移动”到顶部:

xb@dnxb:~/Downloads$ adb shell dumpsys window windows | grep -n 'Window #'
2:  Window #13 Window{f7d02ea u0 NavigationBar}:
31:  Window #12 Window{fdfb1ed u0 com.android.systemui}:
56:  Window #11 Window{b626be1 u0 StatusBar}:
84:  Window #10 Window{bd80846 u0 KeyguardScrim}:
109:  Window #9 Window{f127fe9 u0 AssistPreviewPanel}:
134:  Window #8 Window{f5a5c17 u0 DockedStackDivider}:
162:  Window #7 Window{5170bb1 u0 com.android.systemui}:
188:  Window #6 Window{201fb75 u0 InputMethod}:
217:  Window #5 Window{cc1c79f u0 com.huawei.android.launcher/com.huawei.android.launcher.unihome.UniHomeLauncher}:
248:  Window #4 Window{f2df7b0 u0 com.android.systemui/com.android.systemui.recents.RecentsActivity}:
217:  Window #5 Window{7555f63 u0 com.stackoverflow/mythirdActivity}:
246:  Window #4 Window{7e3a230 u0 com.stackoverflow/mySecondActivity}:
273:  Window #3 Window{7a4b856 u0 com.stackoverflow/myFirstActivity}:
357:  Window #0 Window{5a3ffdc u0 com.anifree.engine.Wallpaper}:
xb@dnxb:~/Downloads$ 

由于隐藏/取消隐藏到后台以移动窗口是可能的,这让我想知道是否有可能通过编程方式将mySecondActivity置于mythirdActivity之上,如下图所示:

Window #4 Window{7e3a230 u0 com.stackoverflow/mySecondActivity}:
Window #5 Window{7555f63 u0 com.stackoverflow/mythirdActivity}:
Window #3 Window{7a4b856 u0 com.stackoverflow/myFirstActivity}:

请注意,我不是在谈论新实例,我的意思是相同的窗口idwindow{7e3a230在不更改窗口id的情况下移动到顶部。

有可能吗?还是我误解了?

共有2个答案

水麒
2023-03-14

我发现我必须使用Intent.FLAG_ACTIVITY_MULTIPLE_TASK(使用正确的清单launcheMode)使其成为多个任务,以便同一任务堆栈中的窗口可以作为一个组重新排序到其他任务的顶部/底部,同时保留相同的窗口id。moveTaskToBack(true) 也可以这样做,但我注意到它无法移回前台。

霍襦宗
2023-03-14

确保不设置FLAG_ACTIVITY_CLEAR_TOP,因为如果还指定了FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_REORDER_TO_FRONT标志将被忽略。

下面的代码片段不会为您的案例创建一个新实例,即一个新的WindowId,如果您的活动历史记录中已经有该活动,则会将其显示在顶部。

Intent i = new Intent(context, YourActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
 类似资料:
  • 我目前设法允许用户在两个不同的活动组(比如说4个活动类A/B组和X/Y组)之间切换,并通过FLAG,但我注意到有一些奇怪的行为: 如何防止应用程序从返回时隐藏到后台? 我注意到它只发生在同一个类中(和是同一个类),如果我使用和,就不会出现这样的问题,我想知道背后的原因是什么。 和

  • 问题内容: 我有一张像下面的桌子, 我想使用“名称”列按字母顺序重新排序,并使用此新顺序重置ID(自动递增),以得到以下结果 问题 :如何使用MYSQL执行此操作? 问题答案: 请问您为什么要这么做? 如果有人修改了任何名称值或插入了新行,则会使您的订购方案混乱。试图以表的其他位置(名称列)已经可用的PK顺序存储一些含义似乎是多余的,因此是个坏主意。 更好的解决方案是不用担心ID列的值,而在应用程

  • 问题内容: 如果我有列表,如何以任意方式重新排序商品? 编辑:我不想洗牌。我想以预定义的方式对它们进行重新排序。(例如,我知道旧列表中的第3个元素应成为新列表中的第一个元素) 问题答案: 你可以这样

  • 从包A中,我从特权包B触发了正在运行的服务。包B执行包A的更新。目标设备正在使用Android 9(API Level 28)。更新成功(应用程序版本代码已更改)。但我的问题是更新后,包A在后台;在我的设备上,它在后台应用程序列表中,我必须手动按下它才能将其带到前台。 我希望它在安装后回到前台。 我尝试了什么: > 在安装后从包B向包a发送广播意图;看起来在包的广播接收器上没有接收到意图(可能是因

  • 我在我们的应用程序中有多个活动。其中一个活动是启动活动,这是主要的启动器活动。它启动并初始化几个类,这些类被整个应用程序使用并完成。 然后是用户大部分时间驻留的主要活动。如果应用程序关闭,则在创建通知时,这些类将被销毁,因此应用程序将给出错误(nullpointerexception)。 我们需要做的是如果应用程序关闭,则启动启动器活动,否则将主要活动放在前面。 我在这里尝试了多种解决方案。 解决

  • 问题内容: 您如何使python程序自动重新启动?因此,假设有一个非常简单的程序,例如: 现在,在Python Shell中,您将必须按“运行”按钮,然后按“运行模块(F5)”,或者仅按键盘上的“ f5”按钮。那是您第一次运行它。程序结束后,您将返回到“ Cheese.py”文件,然后按“ f5”再次运行该程序。大家和我在一起吗?好的,所以我的问题是,如何使程序自动重新启动,而无需手动执行? 问题