gpt4 book ai didi

安卓 N : How to launch activity in current active window instead of second window when click on notification in split-screen?

转载 作者:IT老高 更新时间:2023-10-28 23:14:46 25 4
gpt4 key购买 nike

Android N 中使用分屏时我想在用户点击通知时在当前 Activity 窗口中启动 activity,但 Android N 总是如果通过单击通知启动,则在第二个窗口中启动 activity

NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification)
.setAutoCancel(false)
.setContentTitle("Demo Title")
.setContentText("Demo");

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("myIntent", "test");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pendingIntent);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Notification notification = mBuilder.build();

notification.flags = Notification.FLAG_NO_CLEAR;

mNotificationManager.notify(156, notification);

当得到intent而不是启动activity

 Intent in = new Intent(MainActivity.this, SecondActivity.class);
startActivity(in);

ex - 我在前台有两个应用程序,例如 第一个窗口中的 Chrome 浏览器第二个窗口中的 Facebook 现在我正在 Chrome 浏览器中搜索某些内容,此时我收到Gmail 的通知。现在,当我点击 Gmail 通知 时,通过替换 Facebook第二个窗口 中打开 Gmail 应用程序,但我希望我的应用程序通知替换 Chrome (与用户交互的人)在第一个窗口

最佳答案

你不能

Intent 中指定以在您的应用不属于的任务中启动 Activity,其中包括其他应用的多窗口窗口。

有几种可能的情况:

  1. 您从另一个 Activity 启动一个 Activity,它将在前一个 Activity 的任务(和窗口)中启动。
  2. 您可以在 Intent 中包含 Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT 标志,并使用 Intent.FLAG_ACTIVITY_NEW_TASK 标志在另一个窗口中启动 Activity。这仅在系统已经处于多窗口模式且无法保证时才有效。如果系统处于自由格式模式(与分屏相反),这请求在另一个自由 float 窗口中启动 Activity,那么您也可以使用 .setLaunchBounds() 指定它的大小.
  3. 你从一个Service启动一个Activity,因为一个Service不能在一个task中,你必须指定Intent.FLAG_ACTIVITY_NEW_TASK标志,系统会为这个Activity启动一个新的task。
  4. 您从通知 (PendingIntent) 启动 Activity,就像您这样做:
    • 您可以使 Intent 转到一个已经启动的 Activity 并在其中做任何您想做的事情。例如,使用 Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT 在另一个窗口中启动 Activity。
    • 如果您的 Activity 没有任务/窗口,系统将选择从哪里开始,您无法控制它。您可以使用 .setLaunchBounds() 控制在自由格式模式下从何处启动 Activity,但不能像您想要的那样劫持另一个应用程序的窗口。

简而言之:您可以创建新窗口,也可以更改现有窗口,您不能从其他应用程序中获取窗口。

但如果你坚持

关于控制你的新Activity在分屏多窗口中占据屏幕的哪一侧,然后创建一个新的虚拟Activity。而不是启动你的 SecondActivity 启动虚拟 Activity 。在其中,检查它从屏幕的哪一侧开始。我现在能想到的一种方法是调用.getGlobalVisibleRect()View 上查看这些值与整个屏幕大小的比较。您可以通过这种方式获取屏幕尺寸:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

你也可以改编this solution检测键盘大小以检测窗口的位置。不过,它甚至更 hacky。

现在,如果您在所需的屏幕一侧,请正常启动您的 SecondActivity,然后 finish() 虚拟一个。如果你用错了,也使用 Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT 标志,你的 Activity 将从你想要的一侧开始,而虚拟 Activity 消失。

这是一个肮脏的hack。我建议让系统选择从哪里开始你的 Activity 。

如果你总是想替换一个打开的浏览器

然后让浏览器打开您的应用程序,它将占用它的任务(和窗口)。您可以通过打开一个带有 Intent 的链接来做到这一点,浏览器将处理该链接,然后从那里重定向到打开您的应用程序的链接,请参阅 Handling App LinksEnabling Deep Links有关如何执行此操作的更多信息。它应该可以工作。

关于安卓 N : How to launch activity in current active window instead of second window when click on notification in split-screen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39389351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com