【问题标题】:Android App opens second instance when "launched" after back button pressedAndroid App 在按下后退按钮后“启动”时打开第二个实例
【发布时间】:2016-07-26 17:22:09
【问题描述】:

短版:

我一直在开发的应用程序在按下后退按钮后“启动”时会打开第二个实例。

加长版:

当应用程序从“主屏幕”启动时,它可以正常工作 - 如果应用程序通过按后退箭头按钮、按圆形按钮或方形按钮以更改为不同的应用程序被发送到后台 -然后通过多任务菜单恢复应用程序它完美地工作 - 准确地恢复它停止的位置 - 不再显示启动屏幕,最重要的是不打开第二个实例。 然而如果应用程序被发送到后台然后再次启动从主屏幕创建应用程序的第二个实例!启动屏幕再次显示,主要活动显示在屏幕上,而不是用户屏幕上的最后一个活动!这显然不是理想的行为,我尝试的许多解决方案都不起作用。

清单:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:launchMode="singleInstance">
    <activity
        android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:launchMode="singleInstance">
    </activity>
    <activity
        android:name=".Settings_area"
        android:screenOrientation="portrait" />
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIzaSyDieXTCaFoIL0kJ_IM4UMBSQL3sNn92AWM" />

    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps" />
    <activity android:name=".Splash"
        android:launchMode="singleInstance">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
    <activity android:name=".aboutPageActivity" />
    <activity android:name=".turnOffFromNotification"
        android:noHistory="true"></activity>
</application>

编辑: 我还尝试将应用程序标签中的launchMode 替换为singleTasksingleInstance

【问题讨论】:

  • 我看到你的发布活动是singleInstance。也许这导致了这种行为。
  • 您好@Shaishav 我已将其更改为 singleTop 和 singleTask - 似乎没有任何效果!你有什么其他的建议?谢谢!!
  • 尝试删除启动模式。您有什么理由需要在独立任务中运行活动?
  • @shaishav 删除启动模式也不起作用.. 没有理由独立任务!
  • 看在上帝的份上,摆脱闪屏。

标签: android android-activity android-lifecycle onbackpressed


【解决方案1】:

但是,如果应用程序被发送到后台,然后从主屏幕再次启动,则会创建应用程序的第二个实例!启动屏幕再次显示,主要活动显示在屏幕上,而不是用户屏幕上的最后一个活动!

这是Android 的预期行为。后退按钮(其默认实现)旨在让用户通知系统他/她已完成当前ActivityAndroid 销毁Activity 的实例。

注意,这种行为与android:launchMode 属性没有任何共同之处。

这显然不是理想的行为,我尝试的许多解决方案都不起作用。

你无法改变它。这是决定离开Activity 和操作系统的用户不再需要销毁Activity 的实例的问题。

【讨论】:

  • 非常感谢您提供的信息!你知道当他们按下启动器图标而不是创建另一个实例时我如何将应用程序带到前面吗?
  • 如果实例处于活动状态,按“启动器图标” 会将其带到前台,否则将创建一个新实例。我建议不要在所描述的场景中挣扎,而是坚持Activitylifecycle 回调并将UI 状态保存在onSaveInstanceState() 中,然后,当用户返回它时,恢复onRestoreInstanceState() 中的状态。通过这样做,用户会想从他/她离开Activity的地方继续前进。
  • 太棒了!谢谢你的信息!这很有帮助!我现在将尝试实施此解决方案!谢谢!
  • 能否请您提及突出显示的信息的来源?
  • @Wijay Sharma,您可以通过记录 Activity 的 onDestroy() 方法轻松地自行检查。
【解决方案2】:

通过从除&lt;application&gt; 标记之外的所有位置删除android:launchMode="singleInstance"&gt; 解决了这种情况。显然,当目标是创建另一个任务时最好使用启动模式 - 这不是所需的行为。 Stock Android 掩盖了这种行为,而带有 Touchwiz 的 Android 修改版则没有。

【讨论】:

    【解决方案3】:

    它保存当前实例...(它不会破坏它)。 当您再次打开应用程序时,它将重新打开同一个实例。

    import android.view.KeyEvent;
    
    
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
    
        if (keyCode == KeyEvent.KEYCODE_BACK)
        {
            moveTaskToBack(true);
            return true; // return
        }
    
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      相关资源
      最近更新 更多