#java #android #xml #splash-screen
#java #Android #xml #заставка
Вопрос:
Я хочу показывать заставку только один раз в течение жизненного цикла приложения. Вот мой код:
SplashScreenActivity.java:
final int welcomeScreenDisplay = 3000;
Thread welcomeThread = new Thread() {
int wait = 0;
@Override
public void run() {
try {
super.run();
while (wait < welcomeScreenDisplay) {
sleep(1000);
wait = 1000;
}
} catch (Exception e) {
System.out.println("EXc=" e);
} finally {
// Start other Activity
startActivity(new Intent(SplashScreenActivity.this,
MainActiviey.class));
finish();
}
}
};
welcomeThread.start();
Манифест:
<activity android:name=".SplashScreenActivity" android:label="test"
android:noHistory="true"
android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden|keyboard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActiviey" android:label="test"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden|keyboard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Проблема в том, что если я нажму кнопку аппаратного обеспечения, чтобы скрыть приложение, и снова открою приложение в списке приложений. Он снова покажет заставку (вместо отображения MainActivity
).
Можно ли показывать заставку только тогда, когда приложение запускается «заново» (не показывать при onresume () )? Спасибо!
Ответ №1:
У вас не может быть такого намерения для двух действий:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Также вы можете скрыть заставку из стека истории на случай, если вы решили запустить в нем другое действие в соответствии с предложением Ash.
Вы можете использовать этот флаг в своем теге активности:
android:noHistory="true"
Комментарии:
1. Спасибо hr2003. Они не совпадают. Фильтром намерений .SplashScreenActivity является ‘android.intent.category. LAUNCHER’ и фильтр намерений .MainActiviey — это ‘android.intent.category. DEFAUL’. android:noHistory=»true» не работает.
Ответ №2:
Да, это возможно. Используйте SharedPreferences для сохранения флага, который будет указывать на то, что ваша заставка уже была показана. Проверьте это в onCreate()
методе вашей заставки и, если она присутствует, запустите следующее действие.
Комментарии:
1. Но тогда он должен обязательно сбросить флаг при завершении работы приложения, что не всегда возможно контролировать…
2. Я думал, что автор «Жизненного цикла приложения» имел в виду, что заставка должна отображаться только один раз, сразу после установки. Трудно определить, когда приложение завершается, правда. Но повторное отображение заставки после этого приведет к ухудшению работы пользователя. Пользователь не знает, когда Android решит завершить работу приложения, с его точки зрения, эта заставка будет отображаться довольно случайным образом. Разве это не раздражало бы?
3. Я согласен с вами, что заставки часто раздражают и не нужны (если только они не маскируют необходимую фоновую загрузку). К сожалению, в этом случае я думаю, что спрашивающий имел в виду обычную практику показа заставки каждый раз, когда приложение запускается «заново» (т. Е. Не Возобновляется).
4. LouieGeetoo прав. Я хочу, чтобы заставка отображалась ОДИН РАЗ, когда каждый раз, когда приложение запускается «заново»
5. Я не понимаю, почему вы хотели бы это сделать, но в любом случае… Вы можете попробовать использовать Activity.onSaveInstanceState() : сохраните
isShown
флаг в экземпляре вашей активности и сохранитеonSaveInstanceState()
. Теоретически, это должно сработать.
Ответ №3:
public class SplashActivity extends AppCompatActivity {
Handler handler;
private final int SPLASH_DISPLAY_LENGTH = 2000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
SplashStart();
}
private void SplashStart() {
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}, SPLASH_DISPLAY_LENGTH);
}
@Override
protected void onResume() {
super.onResume();
}
}