2011-04-08 115 views
30

我遇到这个问题的Android所描述的问题: http://code.google.com/p/android/issues/detail?id=4536开始从服务活动后,HOME键同时按下无延时5秒

简单地说,按HOME键后,机器人防止服务和广播 - 从startActivity调用5秒钟。

我也注意到了(当然,理论上),具有以下权限:

"android.permission.STOP_APP_SWITCHES" 

允许你调用resumeAppSwitches(在ActivityManagerService定义)。 查看最新版本的ActivityManagerService,将删除此代码。

问题:如何使用startActivity启动一个没有5秒延迟的活动?

+0

您应该与在WidgetLocker的家伙(他们使用至少阅读此线程:HTTP://forum.xda-developers。 com/showthread.php?t = 825553)。他们有办法绕过这5秒钟,但我认为它需要root。也许他们会告诉你一些有用的东西? – Aleadam 2011-04-17 20:43:40

回答

15

我不认为有一种方法可以用当前的API来实现。我认为这就是他们打算如何工作,以便当用户使用家庭按键退出时,应用程序无法强制自己打开。您可以将主页/启动器意图添加到过滤器中,以查看您尝试启动的任何活动。然后,用户可以选择基本上将该应用视为主屏幕。然后,只要用户按下主页按钮,它就会立即启动(他们必须从列表中选择它,弹出询问他们要使用哪个应用程序来完成此操作,但他们可以检查始终使用这个应用程序在未来采取这一步。)

+0

谢谢。我的应用程序是'Wave Launcher',它是(正如其名称所暗示的)一个启动器本身。它由后台服务控制而不是活动,因此是问题所在。 (它不会取代默认的家庭应用程序,它是一个附加组件)。由于我已经彻底调查过这个问题,所以我正在寻找更简单的答案。 – Lior 2011-04-08 20:17:24

+0

我正在研究一个不同类型的项目,但有兴趣试图获得这种效果(触发一个startActivity()调用在按下home按钮时发生)。我从来没有想出一种方法来摆脱几秒钟的延迟。如果你知道它在这里发布给我们=)。 – FoamyGuy 2011-04-08 20:22:40

+0

我决定接受你的答案。虽然没有实际的解决方案,虽然我还没有从中学到新的东西。这可能是正确的答案。这是我的第一个假设,在这里发布这个问题是一个长远的想法。谢谢。 – Lior 2011-04-14 21:44:56

1

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

我引用下面的相关部分:

解决方法是:

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

2)有某种 中间主页(WidgetLocker HomeHelper,QuickDesk,的PowerStrip, 等)。这些做startActivity 立即启动“真正的”家庭和 这绕过了5秒的规则。这个 是一个坏主意,因为Android的优先级为 保留系统首页在内存中,但 不是什么二手家居 中间设置。所以它可能会导致 启动器重新加载,这是没有意思的。加上 这对用户来说非常混乱。

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

在这些,我相信这样做是为了样活性创建一个“家庭助手”的最佳途径。所以,而不是开始一个新的活动,你会调用这个而不是。这是特别真实的,因为你正在创建一个启动程序的应用程序。

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

+0

顺便说一句,这里有另一个例子:http://www.appsbeyond.com/apps/screen-suite – Aleadam 2011-04-18 16:34:21

+0

感谢您的回答。我的应用程序是一个启动插件,而不是启动器替代品。我非常熟悉如何编写一个家庭住宅(在市场上已经有一个可以像一个应​​用程序一样的应用程序)。一般来说,我认为这是一个糟糕的做法,主要是由于您提到的启动器重新加载。我从你的答案中获得的最好的结果是以root身份启动应用程序。我将不得不检查如何完成。 – Lior 2011-04-20 06:08:29

+0

恐怕没有太多可用的选项。问题的根源在于它会大大限制有多少人能够运行它。 – Aleadam 2011-04-20 07:00:49

1

I我正在使用AlarmManager从Service立即启动Activity。 活动立即开始,即使您之前已按下home按钮。

在Android 5.0.1(Galaxy Alpha)上测试。

在6.0.1(的Nexus 7 2013):-(

不要工作在4.1.2(银河S II):-(

不要工作在4.3不要工作(ASUS便笺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); 
} 
22

这里是一个解决方案,我发现。

将要在的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(); 
       } 
+1

你是我的英雄。谢谢! – 2017-03-25 04:06:24

+0

如果我能给你更多的选票! – 2017-07-25 04:55:34

+0

这是一个非常好的解决方案。从onPause调用startActivity,这会立即启动新的活动,尽管存在快速闪烁。 – 2017-07-25 12:30:50