HedyPlayer 的诞生
闲来无事,想写一个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是不是就解决了白屏!
- 我们先在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>
- 在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>
- 现在闪图就会随着主题一起加载了,我们就可以把setContentView注释掉了。
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会白屏两秒钟。这是不能忍受的。
解决方法是使用消息队列
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。