Android开发Android开发Android开发经验谈

HedyPlayer 的诞生

2018-07-26  本文已影响8人  北国雪WRG

闲来无事,想写一个Android平台的音乐播放器。取名叫HedyPlayer,意为Happy every day !并在简书上跟进该app的成长日记。主要还是记录遇到的问题和解决的方法。很希望在我毕业的时候,这个APP能成为我梦想中的样子。emmm,梦想还是要有的,万一实现了呢?

话不多说,以下是今天遇到的问题。

Q1. 闪图(SplashActivity 白屏问题)
Q2. 虚拟键的隐藏
Q3. 闪屏的睡眠
Q4. back键又返回到了闪屏activity

Q1 闪图短暂的白屏

其实白屏的时间十分短暂,但是确实是可以感觉的到。可以发现大公司的APP是没有这个短暂的白屏的。
问题出现在哪儿呢?我们可以运行一下下面这段代码

 @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
         long startTime = System.currentTimeMillis();

        setContentView(R.layout.activity_splash);
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        Log.d("SplashActivity", "time:" + time);

        // SplashActivity time = 0.1 s

在我的手机上测试,控制台显示的时间是0.1s。看来加载布局文件还是需要一些时间的。要想去掉白屏,我们就应该尽可能早的加载布局文件,至少是闪图。
其实,仔细观察你会发现,白屏并不是整个activity都是白的。其实activity的主题瞬间就加载出来了,只是background是白的。那么我们将闪图放入主题的background是不是就解决了白屏!

  1. 我们先在styles.xml 中定义一个叫Splash的主题,继承于Theme.AppCompat.Light.NoActionBar,这样这个主题没有ActionBar了。
    <style name="Splash" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@drawable/splash_word</item>
    </style>
  1. 在AndroidManifest.xml 文件中使用上面定义的样式表。其实就是将theme设置为@styles/Splssh
       <activity
            android:name=".SplashActivity"
            android:theme="@style/Splash">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
  1. 现在闪图就会随着主题一起加载了,我们就可以把setContentView注释掉了。

参考:Android欢迎页短暂白屏问题以及解决方案

Q2隐藏导航栏

如果手机的导航栏是白色的话还OK,但是有些手机的导航栏是黑色的。强迫症还是想隐藏导航栏。在onCreate中添加一下代码就行View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE;表示在这个activity中永久隐藏导航栏,以达到沉浸式效果。

        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE;
        getWindow().setAttributes(params);

Q3 闪屏的睡眠

如何让闪图停留两秒呢? 我的最初想法是在onCrete生命周期中调用Thread.sleep(2000);。其实没有setContentView方法下效果还行。但是隐藏的导航栏就失效了。究其原因还是你主线程让activity在onCreate下休眠2s,参考活动的生命周期的可见性。onCrete并不是可见生命周期。也就是说,你在UI还没有加载之前休眠了2s,如果有setContentView方法你就会发现UI会白屏两秒钟。这是不能忍受的。

activity生命周期.jpg

解决方法是使用消息队列

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(intent);
                finish(); // 结束闪屏activity,防止栈倒退
            }
        },2000);

我们在onCrete生命周期中添加上述代码。意思为创建一个开启新activity线程但是等待2秒才提交。这样的话就OK了。

Q4 back键又返回到了闪屏activity

闪屏结束了,我们按back键,闪屏的界面又出来了。这是因为back键执行的是弹栈操作。系统将activity栈中的最顶上的栈弹出,也就是闪屏。我们只需要将其finish() 掉就行了,代码见Q3。

上一篇下一篇

猜你喜欢

热点阅读