最近有關摺疊屏產品的新聞層出不窮,各家手機廠商也分別慢慢地亮出了自家的產品。然而市場上的一些APP仍然沒有很好地適配這樣的設備,顯示不正常和應用重啓的情況時有發生。所以,我會用接下來的幾篇文章來點出有關摺疊屏開發中的一些須要注意的地方。
今天咱們先來講一下生命週期,這是廣大開發者特別須要注意的一點。
首先咱們來看一下測試代碼:android
public class MainActivity extends AppCompatActivity { private final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.d(TAG, "onSaveInstanceState"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.d(TAG, "onRestoreInstanceState"); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged"); } }
我在每個生命週期和恢復現場的回調方法中都加了Logcat輸出,咱們來看一下切換屏幕時APP的具體表現。ide
2019-01-30 11:19:00.216 30205-30205/com.example.helloworld D/MainActivity: onPause
2019-01-30 11:19:00.221 30205-30205/com.example.helloworld D/MainActivity: onSaveInstanceState
2019-01-30 11:19:00.227 30205-30205/com.example.helloworld D/MainActivity: onStop
2019-01-30 11:19:00.228 30205-30205/com.example.helloworld D/MainActivity: onDestroy
2019-01-30 11:19:00.325 30205-30205/com.example.helloworld D/MainActivity: onCreate
2019-01-30 11:19:00.326 30205-30205/com.example.helloworld D/MainActivity: hashcode is 89642980
2019-01-30 11:19:00.327 30205-30205/com.example.helloworld D/MainActivity: onStart
2019-01-30 11:19:00.328 30205-30205/com.example.helloworld D/MainActivity: onRestoreInstanceState
2019-01-30 11:19:00.331 30205-30205/com.example.helloworld D/MainActivity: onResume佈局
咱們能夠看到,默認情形下,Activity在屏幕尺寸發生改變的時候也隨之重啓了。 和改變屏幕Orientation的行爲有幾分相像。
此時咱們面臨兩個選擇:測試
對於第一種狀況,咱們通常在回調onSaveInstanceState()方法中保存數據,並在onCreate()或onRestoreInstanceState()回調方法中取回保存的數據用於恢復現場。
然而,並不是在全部狀況下都須要完整地重啓APP來適應屏幕改變,和改變屏幕方向同樣,咱們只須要在Androidmanifest.xml中相應的Activity聲明中加入相應的屬性值便可。此處,須要添加:優化
android:configChanges="screenSize|smallestScreenSize|screenLayout"
添加好以後再次運行APP並反覆改變屏幕大小,此時的生命週期回調順序變爲:ui
2019-01-30 11:13:02.217 29276-29276/com.example.helloworld D/MainActivity: onCreate
2019-01-30 11:13:02.219 29276-29276/com.example.helloworld D/MainActivity: onStart
2019-01-30 11:13:02.223 29276-29276/com.example.helloworld D/MainActivity: onResume
2019-01-30 11:13:05.289 29276-29276/com.example.helloworld D/MainActivity: onConfigurationChangedcode
可見,此時Activity並無銷燬重建,而是隻回調了onConfigurationChanged()方法。在某些狀況下,可用此辦法避免APP重啓。
那麼,上述三個屬性值各表明什麼意思呢,詳見下表:xml
屬性值 | 含義 |
---|---|
screenSize | 當前可用屏幕尺寸發生了變化。它表示當前可用尺寸相對於當前縱橫比的變化,所以會在用戶在橫向與縱向之間切換時發生變化。 不過,若是您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變動(即使是在 Android 3.2 或更高版本的設備上運行,此配置變動也不會從新啓動 Activity)。 |
smallestScreenSize | 物理屏幕尺寸發生了變化。它表示與方向無關的尺寸變化,所以只有在實際物理屏幕尺寸發生變化(如切換到外部顯示器)時纔會變化。 對此配置的變動對應於smallestWidth 配置的變化。 不過,若是您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變動(即使是在 Android 3.2 或更高版本的設備上運行,此配置變動也不會從新啓動 Activity)。 |
screenLayout | 屏幕布局發生了變化 — 這多是由激活了其餘顯示方式所致。 |
注:上表摘自 https://developer.android.com/guide/topics/manifest/activity-element
如此,咱們便處理完了對於摺疊屏切換屏幕的優化。生命週期