Открыто несколько экземпляров приложения Android — ТОЛЬКО на Touchwiz

Недавно я работал над приложением для устройств Android и заметил неприятную проблему, которая возникает только на устройствах с Samsung Touchwiz!

Ошибка возникает, когда приложение работает на устройстве Touchwiz. Баг можно воспроизвести, нажав кнопку «назад», когда приложение находится на переднем плане, а затем снова запустив его с домашнего экрана (или в любом другом месте, где может быть значок). Глядя в меню многозадачности видно, что система запускает второй экземпляр приложения! Этот второй экземпляр полностью независим от первого экземпляра, и кажется, что они никак не связаны.

Я думал, что смогу предотвратить такое поведение, добавив singleInstance в манифест приложений, но, похоже, это не помогло. Манифест:

  <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">

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

    </activity>
    <activity
        android:name=".Settings_area"
        android:screenOrientation="portrait" />
    <!--
         The API key for Google Maps-based APIs is defined as a string resource.
         (See the file "res/values/google_maps_api.xml").
         Note that the API key is linked to the encryption key used to sign the APK.
         You need a different API key for each encryption key, including the release key that is used to
         sign the APK for publishing.
         You can define the keys for the debug and release targets in src/debug/ and src/release/. 
    -->
    <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>

Интересно отметить, что второй экземпляр «зависает» на заставке приложений — до тех пор, пока этот второй экземпляр не будет выбран из многозадачного меню.

Вот как я обрабатываю экран-заставку:

 new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {
            /* Create an Intent that will start the Menu-Activity. */
            Intent mainIntent = new Intent(Splash.this,MainActivity.class);
            Splash.this.startActivity(mainIntent);
            Splash.this.finish();
        }
    }, splashDisplayLength);

Я также отменил действие кнопок «Назад» в своем основном действии:

public void onBackPressed()
{
    moveTaskToBack(true);
}

Эта ошибка возникает только на устройствах с TouchWiz. Я протестировал свое приложение на нескольких устройствах, и эта ошибка не может быть воспроизведена ни на одном устройстве, кроме устройств Samsung, на которых работает TouchWiz.

Любые предложения будут очень признательны.

Большое спасибо!


person traintrax8    schedule 25.07.2016    source источник
comment
Вы пытались убить процесс при обратном нажатии? если нет, попробуйте этот android.os.Process.killProcess(android.os.Process.myPid());   -  person Muthu    schedule 25.07.2016
comment
Привет @Muthu, я не хочу прерывать процесс, если пользователь нажимает кнопку «Назад», а просто отправить его в фоновый режим!   -  person traintrax8    schedule 25.07.2016
comment
Вы можете удалить фильтр намерений из MainActivity и проверить?   -  person Muthu    schedule 25.07.2016
comment
@muthu это все еще происходит, даже когда я удаляю фильтр намерений из основного действия. Удаление фильтра намерений с экрана-заставки (и изменение mainActivity на ...category.LAUNCHER решает проблему, НО вызывает сбой приложения, если пользователь нажимает кнопку «Назад», а затем нажимает значок на главном экране. Спасибо за помощь!   -  person traintrax8    schedule 25.07.2016
comment
это решило проблему?   -  person Muthu    schedule 25.07.2016
comment
@muthu это создало новую проблему - приложение теперь аварийно завершает работу, если пользователь пытается запустить приложение, когда оно уже запущено - однако ТОЛЬКО на устройствах Touchwiz.   -  person traintrax8    schedule 25.07.2016
comment
Давайте продолжим обсуждение в чате.   -  person traintrax8    schedule 25.07.2016
comment
Вы можете добавить трассировку стека сбоя?   -  person Muthu    schedule 25.07.2016


Ответы (1)


Проблема, похоже, связана с фильтрами намерений в основной активности. удалите фильтры намерений из основной активности, которые решат проблему.

person Muthu    schedule 25.07.2016
comment
Спасибо за всю вашу помощь! Это решило проблему! - person traintrax8; 25.07.2016