在按下HOME键后立即从服务启动活动而无需等待5秒钟的延迟。

47

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

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

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

"android.permission.STOP_APP_SWITCHES"

允许您调用在ActivityManagerService中定义的resumeAppSwitches函数。根据最新版本的ActivityManagerService,此代码已被删除。

问题是:如何使用startActivity启动活动而不需要这5秒的延迟?


你应该联系WidgetLocker的开发人员(他们至少曾经阅读过这个帖子:http://forum.xda-developers.com/showthread.php?t=825553)。他们有一种方法可以绕过这5秒钟的等待时间,但我认为这需要root权限。也许他们会告诉你一些有用的信息? - Aleadam
4个回答

56

我找到了一个解决方案。

将你想要立即启动的意图放入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();
                }

3
你是我的英雄。谢谢! - Hai nguyen thanh
这是一个非常好的解决方案。从onPause中调用startActivity会立即启动新的活动,尽管会出现快速闪烁。 - Harish Vishwakarma
@Chinbin请看一下这个 https://dev59.com/Tabja4cB1Zd3GeqPhYTb - StuartDTO
3
对我而言,在 Android P 及之前的版本中这个方法可行,但在 Android Q 中不再可行。 - Sam
2
我已经在生产中使用了一段时间,但似乎在Android Q上出现了问题 :'( - D2TheC
4
根据我的测试,它可以在8.0.0及以下版本工作,但无法在8.1.0及以上版本工作。 - Victor Choy

18

我认为目前的API没有办法做到这一点。我认为这就是他们想让它工作的方式,这样当用户按下主页键退出时,应用程序就不能强制自己重新打开。你可以将主页/启动器意图添加到你正在尝试启动的任何活动的过滤器中。然后用户就可以选择将该应用程序视为主屏幕。每当用户按下主页按钮时,它就会立即启动(他们必须从弹出的列表中选择要使用哪个应用程序来完成此操作,但他们可以勾选“始终使用此应用程序”以在未来执行此步骤时省略此步骤。)


谢谢。我的应用程序是“Wave Launcher”,正如其名称所示,它本身就是一个启动器。它由后台服务控制而不是活动,因此出现了问题(它不会替换默认的主屏幕应用程序,而是作为附加组件)。由于我已经彻底调查了这个问题,所以我正在寻找更少的琐碎答案。 - Lior
我曾经在做一个不同类型的项目,但对尝试实现这种效果(当按下主页按钮时触发 startActivity() 调用)很感兴趣。不久前,我从未想出消除几秒延迟的方法。如果您想出了,请在这里发布给我们 =)。 - FoamyGuy
我决定接受你的答案。虽然没有实际解决方案,也没有从中学到新东西。但这可能是正确的答案。这本来就是我的假设,并且在这里发布问题是一个很大的尝试。谢谢。 - Lior
我猜你已经看过简单的*Activity.onUserLeaveHint()*,它有5秒的延迟。 - Blundell
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Michael DePhillips
有没有解决这个问题的方案?有什么变通方法吗? - android developer

1

我正在使用AlarmManager从Service立即启动Activity。

即使您之前按了home键,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);
}

0

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

我在下面引用了相关部分:

解决方法是:

1)不使用activity,一切都从service中完成。

2)有某种中间Home(WidgetLocker HomeHelper、QuickDesk、PowerStrip等)。这些会立即启动“真正”的Home,从而绕过5秒规则。这是一个坏主意,因为Android优先保持系统Home在内存中,而不是任何次要的Home。所以它可能导致Launcher重新加载,这并不好玩。此外,这对用户来说非常令人困惑。

3)Root可以在此期间启动活动。

在这些方法中,我认为创建一个类似于“Home Helper”活动的方式是最好的。因此,您不需要启动新的活动,而是调用这个活动。这尤其适用于您正在创建启动器应用程序。

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


顺便提一下,这里还有另一个例子:http://www.appsbeyond.com/apps/screen-suite - Aleadam
感谢您的回答。我的应用程序是一个启动器插件,而不是启动器替代品。我非常熟悉如何编写预先主页(已经有一个可以像这样运行的应用程序在市场上)。一般来说,我认为这是一种不好的方法,主要是由于您提到的启动器重新加载。我从您的回答中得到的最好的建议是以root身份启动应用程序。我将需要检查如何完成此操作。 - Lior
恐怕可选项不多。根问题在于它会大大限制能够运行它的人数。 - Aleadam
我已经证明了root可以绕过这个5秒的延迟。该应用程序需要移动到/system/app目录,并且您需要在清单中添加权限:"android.permission.STOP_APP_SWITCHES"。 - Jonathan
有人能为Aleadam的第二点提供一个小例子吗?先谢谢了! - MOST2K2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接