【问题标题】:App completely restarting when launched by icon press in launcher应用程序在启动器中按图标启动时完全重启
【发布时间】:2013-04-14 03:20:14
【问题描述】:

我正在尝试制作我的第一个 Android 应用的发布版本,以发送给一些测试人员。但是,我遇到了一个问题。当您退出应用程序,然后通过其图标启动它重新进入它时,它会重新启动整个应用程序,而不是返回到之前的位置。即使您在退出后立即重新进入,也会发生这种情况。但是,如果我按住 Home 按钮并通过最近的应用程序列表启动它,则不会发生这种情况。

我已经在网上搜索过其他有此问题的人,并且有一些,但没有人对为什么会发生在他们身上有一个可靠的答案。在旧问题中建议在清单文件中将启动模式设置为 singletask 或 singleinstance,但这对我没有帮助,此外 - 据我了解,android 的默认行为是返回到任务的先前状态在这种情况下,所以我不知道为什么我需要特殊的清单选项才能做到这一点。

这个问题最离奇的是,如果我用eclipse和调试器把app放到手机上,就不会出现这个问题。我什至不需要连接到调试器,似乎只要我有应用程序的调试版本,问题就不会发生。但是,如果我使用发布版本(我使用 Eclipse 中的 Android Tools - Export Signed Application Package 菜单选项创建它),就会出现问题。 如果有人对造成这种情况的原因有任何见解,我很想听听您的想法。

【问题讨论】:

  • 显然,如果我重新启动安装应用程序的设备,这个问题就不复存在了。现在,这一切都很酷,但在我的应用程序中,如果用户在下载应用程序时在重启手机之前出现这种行为,它仍然会非常烦人。
  • 你能提供一个堆栈跟踪或日志吗?
  • 不,只有当我使用应用程序的发布版本时才会发生这种情况,所以我没有堆栈跟踪或日志。
  • 我也遇到了同样的问题,你找到解决方法了吗?或原因?甚至能够在重新启动设备后重新创建行为? - 顺便说一句,我还发现强制停止应用程序会清除行为
  • 可以在此处找到此问题的有效答案:stackoverflow.com/questions/19545889/…

标签: android android-launcher


【解决方案1】:

我在应用程序中遇到了同样的问题,我解决了这个问题,在 AndroidManifest.xml 文件的 <activity> 声明中添加标志 "android:launchMode="singleTop"" 而不是 "android:launchMode="singleTask""。希望这会对某人有所帮助。

【讨论】:

  • 如果我们想用不同的数据打开同一个活动两次,这种方法很危险。
  • 如果你想用不同的数据打开同一个activity,你可以在onNewIntent()中处理。
  • 我还发现,如果我完全删除 android:launchMode 属性,它会起作用。不确定它是否默认为“标准”,但任何想法都会有所帮助。我找到了这个很好的解释,但已经很晚了,所以它现在对我来说就像一门外语:inthecheesefactory.com/blog/…
  • 嗨,我应该将 android:launchMode="singleTop" 添加到我的所有活动中吗?
  • 这在我的情况下不起作用。在我的应用程序中,我具有创建和共享某些内容的链接的功能。如果应用程序在后台,并且如果用户单击共享链接,如果我的 launchMode 设置为“singleTop”或“singleInstance”,它会打开应用程序的全新实例。
【解决方案2】:

到目前为止,我发现这是一个问题,具体取决于您在真实设备中的安装方式,具体而言:

  1. 如果您只是将 APK 复制并粘贴到设备的本地存储中并从设备安装,无论它是已签名或未签名还是从 bin 文件夹中获取,它都会显示此行为,应用会从菜单图标重新启动。

如果您使用以下选项之一安装它,则不会出现此问题:

  1. 使用终端或命令提示符转到 sdk/tools/ 然后键入

    adb install <FILE PATH OF .APK FILE>
    

    在 Linux 中,键入:

    ./adb install <FILE PATH OF .APK FILE>
    
  2. 只需从 Eclipse 运行您的项目。

我很高兴知道是否有任何方法可以分发正确的 APK 以进行 Beta 测试。我已经尝试导出签名的 APK,因为当您复制和粘贴 APK 并手动安装时,它会显示流氓行为。

更新:

我找到了解决方案。遵循以下两个步骤:

  1. activity 标签内的 AndroidMainifest.xml 中为您应用的所有活动设置 android:launchMode="singleTask" = true
  2. 将此代码放入您的 Launcher Activity 的 onCreate()

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    

此行为是 Android 中的错误。不是特例。

【讨论】:

  • 我不会推荐这个。不应该只设置启动模式。它必须有一个目的,因为它可能会导致奇怪的行为(谈论经验;))
  • 如果你的App支持Pin lock等功能,设置android:launchMode="singleTask"时要慎重。
【解决方案3】:
 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

在调用 setContentView 之前,在您的启动器活动中编写上述代码。这样就可以解决问题了

【讨论】:

  • 这行得通。当从 Play 商店“打开”按钮启动应用程序然后将应用程序移至后台然后单击应用程序图标时,我面临崩溃,新的应用程序实例正在启动。此修复解决了我的问题。谢谢
【解决方案4】:

您可以在AndroidManifest.xml

中将launchMode用作singleTop到Launcher Activity
       <activity
        android:name="<YOUR_ACTIVITY>"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

【讨论】:

    【解决方案5】:

    这是 Android 中的默认行为。对于调试版本,由于某种原因,它的工作方式有所不同。可以通过在活动中添加android:launchMode="singleInstance" 来解决,您希望在从图标启动后重新启动。

    【讨论】:

      【解决方案6】:

      将此添加到您的第一个活动中:

      if (!isTaskRoot()) {
              finish();
              return;
      }     
      super.onCreate(savedInstanceState);
      

      【讨论】:

      • 这适用于我的情况,女巫有一个启动屏幕来处理应用程序的所有入口点,所以如果启动屏幕已经完成它的工作并在第一次重定向到正确的位置不需要做又来了
      【解决方案7】:

      尝试使用android:alwaysRetainTaskState,如下例所示:

      <activity
          android:name="com.jsnider.timelineplanner.MainActivity"
          android:alwaysRetainTaskState="true"
          android:label="@string/app_name" >
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
      
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
      

      【讨论】:

        【解决方案8】:

        对我来说,我发现我在我的活动属性中错误地发布了NoHistory = true

        [Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]
        

        这阻止了应用恢复到此活动并重新启动

        【讨论】:

          【解决方案9】:

          您可以尝试在 AndroidManifest.xml 中为您的启动器活动设置android:alwaysRetainTaskState="true"

              <activity
                  android:name=".YourMainActivity"
                  android:alwaysRetainTaskState="true">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
          

          详情可以看https://developer.android.com/guide/topics/manifest/activity-element.html#always

          【讨论】:

            【解决方案10】:

            我在 2019 年的 Android TV 上看到了这个问题。有没有更好的解决方法?除了

            if (!isTaskRoot()) {
                finish();
            }
            

            它有效,但看起来比实际解决方案更像一个 hack。

            【讨论】:

              【解决方案11】:

              上述所有解决方案在我的所有设备上都无法始终如一地工作。它适用于一些三星,但不是全部。

              对我来说问题的原因是手动安装 APK。

              【讨论】:

                【解决方案12】:

                对我来说,解决方法是将 LaunchMode = LaunchMode.SingleTop 添加到我的 Activity 属性中,而不是 Main Activity:

                /// <summary>
                    /// The main activity of the application.
                    /// </summary>
                    [Activity(Label = "SilhuettePhone",
                        Icon = "@drawable/icon",
                        Theme = "@style/MainTheme",
                        MainLauncher = true,
                        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
                        ScreenOrientation = ScreenOrientation.Portrait,
                        LaunchMode = LaunchMode.SingleTop,
                        WindowSoftInputMode = SoftInput.AdjustResize)]
                

                【讨论】:

                  【解决方案13】:

                  我在重启应用时遇到了问题,我的问题在于主题: 我有不同的片段,我将为所有人提供一个背景。但这会导致某些设备中的应用程序重新启动(。

                  我在主题中删除了这一行,这有帮助:

                  项目名称="android:windowBackground">​​@drawable/background /item

                  【讨论】:

                    【解决方案14】:

                    删除任务亲和性而不是启动模式在一定程度上起到了一定的作用,因为它有自己的缺点

                    【讨论】:

                      【解决方案15】:

                      当您在 Android 中按下后退按钮时,会调用 onDestroy 方法(与按下主页按钮相反,后者仅调用 onPause() 方法)。

                      如果您需要应用从中断处继续,请将应用的状态保存在您的 onDestroy() 方法中,然后在 onCreate() 方法中加载该状态。

                      【讨论】:

                      • 我正在按下主页按钮退出应用程序。
                      猜你喜欢
                      • 1970-01-01
                      • 2015-08-18
                      • 1970-01-01
                      • 2017-09-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-08-12
                      • 2023-03-10
                      相关资源
                      最近更新 更多