我遇到了此Android问题中描述的问题: http://code.google.com/p/android/issues/detail?id=4536
简单地说,按下HOME按钮后,android会阻止服务和广播接收器调用startActivity 5秒钟。
我也注意到了(理论上),具有以下许可:
"android.permission.STOP_APP_SWITCHES"
允许您调用resumeAppSwitches(在ActivityManagerService中定义)。 查看最新版本的ActivityManagerService,将删除此代码。
问题:如何在没有5秒延迟的情况下使用startActivity启动活动?
答案 0 :(得分:43)
这是我找到的解决方案。
将想要立即启动的意图放在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 :(得分:15)
我认为没有办法用当前的API做到这一点。我认为这就是他们打算如何工作,以便当用户通过主页按键退出时,应用程序无法强制自己重新打开。您可以将home / launcher intent添加到过滤器中,以用于您尝试启动的任何活动。然后,用户可以选择基本上将该应用视为主屏幕。然后,只要用户按下主页按钮,它就会毫不拖延地启动(他们必须从弹出的列表中选择它,询问他们想要使用哪个应用程序来完成此操作,但他们可以检查始终使用这个应用程序将在未来采取这一步。)
答案 2 :(得分:1)
我对这个“功能”也很感兴趣,以及如何避免它。阅读帖子:http://code.google.com/p/android/issues/detail?id=4536(阅读评论#10)。
我引用下面的相关部分:
解决方法是:
1)不要使用 活动,做一切从 服务。
2)有某种 中级主页(WidgetLocker HomeHelper,QuickDesk,PowerStrip, 等等)。这些做一个startActivity 立即开始“真正的”家庭和 这绕过了5秒规则。这个 Android优先考虑是一个坏主意 保持系统归主于内存但是 不管是谁的二手房 中间集。所以它可以导致 启动器重新加载,这没什么好玩的。加 这对用户来说非常混乱。
3)Root 可以在此期间开始活动 周期。
其中,我相信最好的方法就是创建一个“家庭佣工”式的活动。因此,而不是开始新活动,您可以将其称为。这是特别正确的,因为您正在创建一个启动器应用程序。
正如我在之前对该问题的评论中所述,我会联系WidgetLocker开发人员。或者,您可以使用APK Manager查看他是如何实现的(他甚至鼓励使用APK Manager为他的应用创建不同的mod,xda-developers线程的链接在上面的评论中)
答案 3 :(得分:1)
我正在使用AlarmManager立即从Service启动Activity。 即使您之前按下了主页按钮,活动也会立即开始。
在Android 5.0.1(Galaxy Alpha)上测试。
不要在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);
}