按下HOME按钮后,在没有5秒延迟的情况下从服务启动活动

时间:2011-04-08 19:47:27

标签: android

我遇到了此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启动活动?

4 个答案:

答案 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);
}