App啟動優化更優實踐
做Android開發,一定寫給過啟動頁,在這里做一些初始化的操作,還有就是顯示推廣信息。
很普通的一個頁面,以前測試也給我提出過bug,應用在啟動的時候,有時候有白屏/黑屏。當時能做的就是盡量較少耗時操作,上面醫生的文章里也有提到,但是通過主題的方式優化這個問題之前還真是不知道的。
下面主要總結一下通過主題的方式優化啟動頁(醫生還提到了在子線程初始化和使用IntentService初始化,都是屬于異步初始化,還有延遲初始化,就不說了)
通過修改主題優化啟動時白屏/黑屏
原理請移步到醫生的文章,我就不復述了,之所以會看到白屏或者黑屏,是和我們的主題有關系的,因為系統默認使用的主題,背景色就是白色/黑色。那么我們自定義一個主題,讓默認的樣式就是我們想要的,就優化了白屏/黑屏的問題。
首先,我們自定義一個主題,設置一個我們想要的背景
- <!-- 啟動頁主題 -->
- <style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
- <item name="android:windowBackground">@drawable/start_window</item>
- </style>
自定義背景start_window.xml
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:opacity="opaque">
- <!-- The background color, preferably the same as your normal theme -->
- <item android:drawable="@android:color/holo_blue_dark" />
- <!-- Your product logo - 144dp color version of your app icon -->
- <item>
- <bitmap
- android:gravity="center"
- android:src="@mipmap/ic_launcher" />
- </item>
- </layer-list>
***,在清單文件設置啟動頁使用我們自定義的主題
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.bitmain.launchtimedemo">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <!-- 啟動頁 -->
- <activity
- android:name=".SplashActivity"
- android:theme="@style/SplashTheme">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- 主頁 -->
- <activity android:name=".MainActivity" />
- </application>
- </manifest>
到此大功告成,為了體現出效果,在啟動頁加載之前,我們模擬一個白屏/黑屏的延時操作
- public class SplashActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 模擬系統初始化 白屏、黑屏
- SystemClock.sleep(1000);
- setContentView(R.layout.activity_splash);
- // 啟動后 停留2秒進入到主頁面
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- Intent intent = new Intent(SplashActivity.this, MainActivity.class);
- startActivity(intent);
- finish();
- }
- }, 2000);
- }
- }