【问题标题】:Starting an activity from a service after HOME button pressed without the 5 seconds delay按下 HOME 按钮后从服务启动活动,没有 5 秒延迟
【发布时间】:2011-08-01 18:53:56
【问题描述】:

我遇到了这个 Android 问题中描述的问题: http://code.google.com/p/android/issues/detail?id=4536

简单地说,在按下 HOME 键后,android 会在 5 秒内阻止服务和广播接收器调用 startActivity。

我还注意到(嗯,理论上),拥有以下权限:

"android.permission.STOP_APP_SWITCHES"

允许您调用 resumeAppSwitches(在 ActivityManagerService 中定义)。 查看最新版本的ActivityManagerService,这段代码被去掉了。

问题:如何在没有 5 秒延迟的情况下使用 startActivity 启动 Activity?

【问题讨论】:

  • 你应该联系 WidgetLocker 的人(他们至少曾经阅读过这个帖子:forum.xda-developers.com/showthread.php?t=825553)。他们有办法绕过这 5 秒,但我认为这需要 root。也许他们会告诉你一些有用的东西?

标签: android


【解决方案1】:

这是我找到的解决方案。

将你想要立即启动的意图放在一个 PendingIntent 中,然后在其上调用 send() 方法。

所以不是这个

Intent intent = new Intent(context, A.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);

就这样做

Intent intent = new Intent(context, A.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                PendingIntent pendingIntent =
                        PendingIntent.getActivity(context, 0, intent, 0);
                try {
                    pendingIntent.send();
                } catch (PendingIntent.CanceledException e) {
                    e.printStackTrace();
                }

【讨论】:

  • 你是我的英雄。谢谢!
  • 这是一个非常好的解决方案。从 onPause 调用 startActivity,这会立即启动新的活动,尽管有一个快速闪烁。
  • 对我来说,这适用于 Android P,但不再适用于 Android Q
  • 我已经在生产中使用了一段时间,并且似乎已经在 Android Q 中死了:'(
  • 根据我的测试,它可以工作=8.1.0
【解决方案2】:

我认为目前的 API 没有办法做到这一点。我认为这就是他们打算让它工作的方式,这样当用户按下主页键退出时,应用程序就不能强制自己重新打开。您可以将 home/launcher 意图添加到过滤器中,用于您尝试启动的任何活动。然后用户可以选择基本上将该应用程序视为主屏幕。然后,只要用户按下主页按钮,它就会毫无延迟地启动(他们必须从弹出的列表中选择它,询问他们想要使用哪个应用程序来完成此操作,但他们可以检查始终使用这个应用程序将在未来迈出这一步。)

【讨论】:

  • 谢谢。我的应用程序是“Wave Launcher”,它(顾名思义)本身就是一个启动器。它由后台服务而不是活动控制,因此存在问题。 (它不会取代默认的家庭应用程序,它是一个附加组件)。由于我已经彻底调查了这个问题,我正在寻找不那么琐碎的答案。
  • 我正在从事不同类型的项目,但不久前我有兴趣尝试获得这种效果(在按下主页按钮时触发 startActivity() 调用。)。我从来没有想出一个方法来摆脱几秒钟的延迟。如果你弄清楚了,请在这里为我们发布 =)。
  • 我决定接受你的回答。虽然没有实际的解决方案,虽然我还没有从中学到新的东西。这应该是正确的答案。这是我一开始的假设,在这里发布这个问题是一个长期的目标。谢谢。
  • 我猜你看过简单的 Activity.onUserLeaveHint() 并且有 5 秒的延迟
  • 在我的情况下,这是一个实际的解决方案。我们的目标是创建“Kiosk”模式,因为我们在发货给客户之前可以访问设备,所以我们能够通过按 Home 并从选择弹出窗口中选择“始终使用我们的应用程序”来运行。
【解决方案3】:

我也对这个“功能”以及如何避免它很感兴趣。阅读帖子:http://code.google.com/p/android/issues/detail?id=4536(阅读评论 #10)。

我引用下面的相关部分:

解决方法是:

1) 不要使用 活动,一切从 服务。

2) 有某种 中间首页(WidgetLocker HomeHelper、QuickDesk、PowerStrip、 等等)。这些做一个startActivity 立即启动“真正的”主页和 这绕过了 5 秒规则。这 是个坏主意,因为 Android 优先考虑 将系统主页保持在内存中,但 不是任何二级首页 中间集。所以它可以导致 启动器重新加载,这并不好玩。加 这让用户非常困惑。

3) 根 可以在此期间开始活动 期间。

其中,我认为最好的方法是创建一个类似于“家庭助手”的活动。因此,您可以调用此活动,而不是开始一项新活动。尤其如此,因为您正在创建一个启动器应用程序。

正如我在之前对该问题的评论中所说,我会就此联系 WidgetLocker 开发人员。或者,您可以使用 APK Manager 来看看他是如何实现的(他甚至鼓励使用 APK Manager 为他的应用创建不同的 mod,xda-developers 线程的链接在上面的评论中)

【讨论】:

  • 顺便说一句,这里还有另一个例子:appsbeyond.com/apps/screen-suite
  • 感谢您的回答。我的应用是启动器插件,而不是启动器替代品。我非常熟悉如何编写一个预置之家(市场上已经有一个可以像一个一样的应用程序)。一般来说,我认为这是一种不好的方法,主要是由于您提到的启动器重新加载。我从你的回答中得到的最好的东西是以 root 身份启动应用程序。我将不得不检查这是如何完成的。
  • 恐怕没有太多选择。 root 的问题在于它会极大地限制能够运行它的人数。
  • 我已经证明 root 可以绕过这 5 秒的延迟。该应用需要移动到 /system/app 目录,并且您需要在清单中添加权限:“android.permission.STOP_APP_SWITCHES”。
  • 有人可以为 Aleadam 的第 2 点提供一个小例子吗?提前谢谢!
【解决方案4】:

我正在使用 AlarmManager 立即从 Service 启动 Activity。 即使您之前按下过主页按钮,活动也会立即开始。

在 Android 5.0.1 (Galaxy Alpha) 上测试。

不要在 6.0.1 (Nexus 7 2013) 上工作 :-(

不要在 4.1.2 (Galaxy S II) 上工作 :-(

不要在 4.3 (ASUS MeMO Pad FHD 10 ME302C) 下工作 :-(

@TargetApi(Build.VERSION_CODES.KITKAT)
private void startActivity() {

    Intent intent = new Intent(this, Main.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    long now = Calendar.getInstance().getTimeInMillis();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, now, pendingIntent);
    else
        alarmManager.set(AlarmManager.RTC_WAKEUP, now, pendingIntent);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多