天天看點

Android8.0 适配解決頁面跳轉過程出現短暫黑屏的問題

      小菜在适配 Android8.0 過程中,遇到很多問題,有很多很常見的問題,今天來整理一下頁面跳轉時黑屏的問題。

問題猜測

猜測一:

      顯示 Activity 頁面之前會優先開啟一個 Starting Window(Preview Window),等待 Activity 加載完成之後顯示 UI 界面,猜測在這個等待過程中可能會出現頁面跳轉時的短暫黑屏。

猜測二:

      小菜的 BaseActivity 頁面中在 onCreate() 和 finish(),方法中添加了進入頁面和退出頁面時的動畫效果,猜測可能是動畫效果不相容引起頁面跳轉時的短暫黑屏。

@Override
public void onCreate(Bundle savedInstanceState) {
    if (toggleOverridePendingTransitionStart()) {
        overridePendingTransition(R.anim.slide_right_in, 0);
    }
    super.onCreate(savedInstanceState);
}

@Override
public void finish() {
    super.finish();
    BaseAppManager.getInstance().removeActivity(this);
    if (toggleOverridePendingTransitionFinish()) {
        overridePendingTransition(0, R.anim.slide_right_out);
    }
}
           

嘗試解決

  1. 優先嘗試修改主題樣式,小菜前段時間整理 解決 Android 更新 SDK API 27 過程中遇到的問題 中有一個 Only fullscreen opaque activities can request orientation 問題,對于透明或半透明頁面,Android8.0 需要将主題中的 android:windowActionBar 屬性設為 false;小菜了解這個屬性設為 true 是設定本頁面為透明頁面,小菜以為如果去掉相當于省略這個過渡效果,等待 1-2s 時間進入新頁面;測試在小菜的 Android8.0 應用裡面依舊會出現跳轉短暫黑屏現象,故嘗試方式一失敗!
  2. 再次嘗試修改主題樣式,以為萬能的添加主題背景圖,設定主題 windowBackground,小菜以為添加一張透明背景圖就可以解決;測試在小菜的應用背景圖是有的,但還是會出現跳轉短暫黑屏現象,故嘗試方式二失敗!
<style name="main_activity_style" parent="@android:style/Theme.Light.NoTitleBar.Fullscreen">
    <item name="android:windowIsTranslucent">false</item>
    <item name="android:windowDisablePreview">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@drawable/background_splash</item>
    <item name="android:background">@null</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
           
  1. 小菜擔心頁面中會有其他因素影響,建立一個 AppCompatActivity 進行測試,以上兩種方法均不會出現黑屏問題;是以小菜開始考慮 overridePendingTransition 動畫效果的影響,把 BaseActivity 中的動畫效果去掉;測試一切正常,沒有出現短暫黑屏現象,是以确定是 overridePendingTransition 問題;
  2. 小菜測試發現是在 Android8.0 中 overridePendingTransition 若設為進入和進出為 0 時會出現黑屏,解決方案是:将 0 換為固定的進入和退出的 anim 即可,如下:
// 原來
overridePendingTransition(R.anim.slide_right_in, 0);
// 替換為
overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out);

// 原來
overridePendingTransition(0, R.anim.slide_right_out);
// 替換為
overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out);
           

      Tip:若隻想有進入或退出時的動畫,另一個動畫去掉呢,可以自定義個 no_anim,替換上即可:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="0">
</set>

// 原來
overridePendingTransition(0, R.anim.slide_right_out);
// 替換為
overridePendingTransition(R.anim.no_anim, R.anim.slide_right_out);
           

插曲總結

  1. overridePendingTransition 第一個參數為頁面進入時動畫,第二個參數為頁面退出時動畫,不要記反了;
  2. 小菜的 BaseActivity 是在 onCreate() 和 finish() 中分别調用 overridePendingTransition 的,是以想調整個别頁面其他動畫效果時,需要在 onCreate() 和 finish() 方法中方分别定義。

      至此,小菜的應用在 Android8.0 中頁面跳轉短暫黑屏問題已解決,測試正常;小菜發現在優化和适配的道路上還有很多意想不到的問題,随時調整随時記錄,希望可以順利解決!

      以下是小菜公衆号,歡迎閑來吐槽~

公衆号

繼續閱讀