Недавно я работал над приложением для устройств 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.
Любые предложения будут очень признательны.
Большое спасибо!