Android应用程序在"启动时打开第二个实例"按下后退按钮后

时间:2016-07-26 17:22:09

标签: android android-activity android-lifecycle onbackpressed

简短版本:

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

长版:

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

清单:

<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

3 个答案:

答案 0 :(得分:1)

  

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

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

请注意,此类行为与Activity属性没有任何共同之处。

  

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

你无法改变它。这是一个用户决定离开android:launchMode并且OS不再需要Activity实例的问题。

答案 1 :(得分:0)

通过从android:launchMode="singleInstance">标记以外的任何位置删除<application>来解决问题。当目标是创建另一个任务时,显然最好使用启动模式 - 这不是所需的行为。股票Android掩盖了这种行为,而Android的修改版本与Touchwiz没有。

答案 2 :(得分:0)

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

import android.view.KeyEvent;


public boolean onKeyDown(int keyCode, KeyEvent event)
{

    if (keyCode == KeyEvent.KEYCODE_BACK)
    {
        moveTaskToBack(true);
        return true; // return
    }

    return false;
}