应用程序总是从根活动重新开始,而不是恢复后台状态(已知错误)

Posted

技术标签:

【中文标题】应用程序总是从根活动重新开始,而不是恢复后台状态(已知错误)【英文标题】:App always starts fresh from root activity instead of resuming background state (Known Bug) 【发布时间】:2011-01-17 19:57:29 【问题描述】:

我正面临这些链接中提到的问题:

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

我有一个带有 LAUNCHER 和 MAIN 意图的简单根活动,没有别的。我开始另一个活动,但清单中没有标志或任何额外的东西

我启动应用程序(根活动)并从那里开始第二个活动。按下 Home 按钮后,任务进入后台。再次启动应用时(从 Launcher 或按住最近应用的 Home 按钮),它会在现有堆栈之上启动根 Activity 的新实例。

如果我按下后退按钮,新的“根”活动关闭,旧的第二个活动可见,这意味着它在同一任务中启动根活动,而不是将任务带到前台。

为了解决这个问题,我创建了根活动的启动模式singleTask。现在,当我按下 home 键并再次启动应用程序时,它会清除旧根任务上方的活动,并将旧根任务带到前台,而不是仅仅将带有第二个活动的整个旧任务放在前面。请注意,旧的根任务仍保留其应用程序状态,这意味着它不是新实例,但更高的活动已被杀死。

它甚至发生在从市场上下载的其他应用程序上。手动安装方法对我没有效果,它仍然以相同的方式启动。

【问题讨论】:

Kurian,我也遇到过同样的问题。有什么解决方法吗?提前致谢。 从 Eclipse 部署应用程序后,只需按住返回并完全退出应用程序。从手机再次启动它。 Activity stack ordering problem when launching application from Android app installer and from Home screen的可能重复 【参考方案1】:
    @Override 
protected void onCreate(Bundle savedInstanceState)  
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0)  
        // Activity was brought to front and not created, 
        // Thus finishing this will get us to the last viewed activity 
        finish(); 
        return; 
     

    // Regular activity creation code... 
 

【讨论】:

这太迟钝了——不是你的解决方案,而是开始的问题。 这是一个错误还是故意的? - android 的设置方式 对我不起作用,所以我将 android:launchMode="singleInstance" 更改为 android:launchMode="singleTask" 并且它起作用了 :) @sfk92fksdf 只想说谢谢你在接下来的日子里节省了时间! 谢谢你拯救了我的一天 :)【参考方案2】:

这是由于用于启动应用程序的意图不同。 Eclipse 使用没有操作和类别的意图启动应用程序。 Launcher 使用具有 android.intent.action.MAIN 动作和 android.intent.category.LAUNCHER 类别的意图启动应用程序。安装程序使用 android.intent.action.MAIN 操作启动一个应用程序,并且没有类别。

提交该错误的人可能应该将其表述为对 Eclipse 插件的增强请求,因为他们显然希望 Eclipse 能够伪装成启动器并使用与启动器相同的意图来启动应用程序。

【讨论】:

但问题是,即使直接从手机启动应用程序,这种情况仍然存在...... 是的,Kurian 是对的——这不仅仅是一个 Eclipse 插件问题。在 OTA 升级的设备上也会发生同样的情况。这是我遇到的最奇怪的 Android 问题。不敢相信它仍然是 1 年前创建的新问题!!! 目前看来还没有解决。嗯……想知道那边的人到底在做什么? 嗯,我的测试表明 Lance 是正确的。我知道每次我恢复 如果我从 Eclipse 运行它 时都会执行我的 startupActivity.onCreate。但是如果我从设备开始,我不会在恢复时执行 onCreate... 在三星 S2 上运行 2.3.3。 但是,第二个 Activity(即启动的)不会显示在 resume 上,然后该死的 StartupActivity 再次显示......嗯【参考方案3】:

解决办法如下:

@Override 
protected void onCreate(Bundle savedInstanceState)  
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) 
        finish();
        return;
    

 Your code....

编辑:我遇到了新意图和通知方面的问题。以前的解决方案不适用于通知和意图...

【讨论】:

【参考方案4】:

只需将其添加到启动器活动的 onCreate 方法中,如下所示:

      @Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) 
        finish();
        return;
    
    // other function
    

【讨论】:

【参考方案5】:

Xamarin.Android 的类似解决方案:

if (!IsTaskRoot)
            
                string action = this.Intent.Action;
                if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain)
                
                    Finish();
                    return;
                
            

【讨论】:

@HimanshuDwivedi 这是一个非常古老的错误,你不再需要它了

以上是关于应用程序总是从根活动重新开始,而不是恢复后台状态(已知错误)的主要内容,如果未能解决你的问题,请参考以下文章

如何以当前状态恢复现有任务

从后台被杀死的应用程序中恢复 - 重新启动时调用哪些方法?

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动

状态恢复时根视图控制器显示很短

Aws 步进函数 - 从失败的步进函数活动中恢复,而不是开始新的执行