在没有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); }