在没有5秒延迟的情况下按下HOMEbutton之后从服务开始活动

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

简单地说,按下HOMEbutton后,android会阻止服务和广播接收者调用startActivity 5秒钟。

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

"android.permission.STOP_APP_SWITCHES" 

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

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

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

这是我find的解决scheme。

把你的意图,你想立即启动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(); } 

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

我引用下面的相关部分:

解决方法是:

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

2)有一些中间家庭(WidgetLocker HomeHelper,QuickDesk,PowerStrip等)。 这些做startActivity立即启动“真正的”家,这绕过了5秒的规则。 这是一个坏主意,因为Android的优先级保持在内存中的系统首页,而不是任何次要首页中间设置。 所以它可能导致启动器重新加载,这是没有乐趣的。 另外,用户非常困惑。

3)根在这个时期可以开始活动。

其中,我相信最好的办法是创造一个“家庭佣工”式的活动 。 所以, 而不是开始一个新的活动,你可以调用这个 。 这是特别真实的,因为你正在创build一个启动应用程序。

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

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

在Android 5.0.1(Galaxy Alpha)上testing。

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

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

不要在4.3(华硕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); }