Android 重新启动“主页”按钮上的活动,但…只是第一次

Android 重新启动“主页”按钮上的活动,但…只是第一次,android,Android,我正在开发的应用程序在第一次安装时有一个奇怪的行为。如果用户第一次正常退出应用程序,它将永远按其应有的方式运行。如果用户在安装应用程序后第一次使用“主页”按钮,则会将应用程序视为应该再次重新启动主屏幕,并在旧屏幕之前启动活动的新版本 因此,目前确实有两个问题。我似乎无法同时解决这两个问题 当用户按下home(主页)按钮时,防止应用程序在首次安装时关闭 当应用程序执行此操作时,防止启动多个版本的应用程序(launchMode在这里有点帮助,但第一个组件仍然会触发) 在清单文件中,我没有将launc

我正在开发的应用程序在第一次安装时有一个奇怪的行为。如果用户第一次正常退出应用程序,它将永远按其应有的方式运行。如果用户在安装应用程序后第一次使用“主页”按钮,则会将应用程序视为应该再次重新启动主屏幕,并在旧屏幕之前启动活动的新版本

因此,目前确实有两个问题。我似乎无法同时解决这两个问题

  • 当用户按下home(主页)按钮时,防止应用程序在首次安装时关闭
  • 当应用程序执行此操作时,防止启动多个版本的应用程序(launchMode在这里有点帮助,但第一个组件仍然会触发)
  • 在清单文件中,我没有将
    launchMode
    属性定义为任何内容。因此,不应该有任何奇怪的行为作为这一结果。我现在已经尝试了应用程序的
    launchmode
    属性,看看是否可以让它按照预期的方式运行,但这里似乎有更多的内容,而不仅仅是正确地启动活动。就我所知,当按下home(主页)按钮时,应用程序没有理由在第一次关闭自己

    我也不在应用程序中使用
    onUserLeaveHint
    。我必须再次通过搜索项目来确定。因此,似乎根本没有试图覆盖home按钮

    即使在重新启动手机后,home(主页)按钮仍能正常工作。不确定是什么导致初始安装将home按钮视为从头开始应用程序的标志

    一旦用户第一次退出应用程序,问题就会永久解决。你有没有想过我应该去哪里

    最近,在应用程序中进行了一次搜索,以查看它是否只是因为SQLite数据库方法的
    onUpgrade()
    组件导致了一些奇怪的行为而触发的

    @Override
    public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
                    if (newVersion > oldVersion) {
    
               }
           }
    
    或者在另一个位置,如果我将APK的较新版本传递给一个设备,而该设备上的版本已经低于当前版本,则可能会触发清单文件的更新。然而,这部分代码中的任何内容都不会让我相信它会影响与启动序列相关的任何内容

    下面提供了应用程序中当前正在使用的清单文件(名称已更改)

    
    

    这是为什么,没有线索。但是我知道定制的
    Launcher
    有特定的
    launchModes
    设置

    例如,ADW.Launcher:

    android:clearTaskOnLaunch="true"
    android:launchMode="singleTask" 
    
    Android SDK示例中的主应用程序:
    Android SDK\samples\Android-16\Home\AndroidManifest.xml

    android:launchMode="singleInstance"
    
    引用Commonware:

    我将使用SDK中的Home示例应用程序,它使用 单一实例。奇怪的是,AOSP启动器使用singleTask


    欢迎来到不断增长的用户名单,他们已经被这一个咬了

    这是一个众所周知且长期存在的安卓bug。第一次从安装程序、web浏览器和IDE(IntelliJ、Eclipse等)启动应用程序的方式。请参阅很久以前提交的与问题相关的问题:

    它仍然是破碎的,你无法阻止这一切的发生。您唯一能做的就是检测Android何时将您的根活动的第二个实例启动到现有任务中。您可以通过将此代码放入根活动的
    onCreate()
    中来完成此操作:

    if (!isTaskRoot()) {
        // Android launched another instance of the root activity into an existing task
        //  so just quietly finish and go away, dropping the user back into the activity
        //  at the top of the stack (ie: the last state of this task)
        finish();
        return;
    }
    

    看起来问题是由应用程序的不同实例引起的。当用户单击应用程序图标时,第一个实例可能在安装程序的任务下启动,第二个实例在其自己的任务下启动。在用户看来,他/她似乎恢复了应用程序,但实际上他此时又启动了应用程序

    如果你想让你的应用程序只在它自己的任务中运行,一个可能的方法是添加

    android:allowTaskReparenting="true"
    

    到AndroidManifest的应用程序级别。安装后第一次单击应用程序图标后,应用程序将移动到单独的任务。

    实际上,只有在与APK一起分发时,才会发生这种情况。如果从IDE(Eclipse)卸载并重新启动,这种情况不会第一次发生。因此,它一定与远程安装有关,与直接安装不同。此外,只有在从安装窗口立即启动时才会发生。如果安装后您说关闭,然后从主屏幕或应用程序窗口启动它,则在第一次启动时,它永远不会进入此状态。第一个窗口的生命周期中一定有什么原因导致了这种情况。关于使用单个实例,有很多警告,您可能只是捕捉到了其中一个。据我所知,单实例将使活动成为后堆栈中我认为您不希望执行的唯一任务。你没有你的代码张贴,所以我真的不能给任何其他答案。请发布你的清单文件和你所引用的主要活动,我将能够给出更好的答案。@JaySnayder我面临着同样的问题。我正在其中一个活动中覆盖onUserLeaveHint,一旦我使用home将应用程序放在后台,并使用launcher或快捷方式图标再次启动它,然后应用程序重新启动..覆盖onUserLeaveHint会导致这种情况吗?这仅在从PlayStor安装时发生
    android:allowTaskReparenting="true"