【问题标题】:How to show splash screen only when the app starts "fresh"?如何仅在应用程序“新鲜”启动时显示启动画面?
【发布时间】:2011-10-07 02:15:33
【问题描述】:

我只想在应用程序生命周期中显示一次启动画面。这是我的代码:

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>

问题是如果我按下硬件HOME按钮隐藏应用程序并在应用程序列表中再次打开应用程序。它将再次显示启动画面(而不是显示MainActivity)。 是否可以仅在应用程序“新鲜”启动时显示启动画面(不在 onresume() 显示)?谢谢!

【问题讨论】:

    标签: java android xml splash-screen


    【解决方案1】:

    你不能对两个活动有这个意图:

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

    此外,如果您决定按照 Ash 的建议在其中启动另一个活动,您可能希望从历史堆栈中隐藏启动画面。

    您可以在活动标签上使用此标志:

    android:noHistory="true"  
    

    【讨论】:

    • 感谢 khr2003。他们不一样。 .SplashScreenActivity 的意图过滤器是“android.intent.category.LAUNCHER”,.MainActiviey 的意图过滤器是“android.intent.category.DEFAUL”。 android:noHistory="true" 不工作。
    【解决方案2】:

    是的,这是可能的。使用SharedPreferences 存储一个标志,这表明您的启动画面已经显示。在初始屏幕的onCreate() 方法中检查它,如果存在,启动下一个活动。

    【讨论】:

    • 但是他必须确保在应用程序终止时取消设置标志,这并不总是可以控制......
    • 我认为“应用程序生命周期”作者的意思是启动画面必须只显示一次,就在安装之后。很难确定应用程序何时终止,真的。但是在此之后再次显示启动画面会提供糟糕的用户体验。用户不知道 Android 何时决定终止应用程序,在他看来,这个启动画面会非常随机地出现。会不会很烦人?
    • 我同意你的观点,即启动画面通常很烦人且不必要(除非它们掩盖了一些必要的背景加载)。不幸的是,在这种情况下,我认为提问者的意思是每次应用程序“新鲜”启动(即不被恢复)时显示启动屏幕的惯常做法。
    • LouieGeetoo 是对的。我希望每次应用程序“新鲜”启动时都显示一次启动画面
    • 我不明白您为什么要这样做,但无论如何...您可以尝试使用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();
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2021-01-14
      • 2011-11-28
      • 2020-08-26
      • 1970-01-01
      相关资源
      最近更新 更多