1. 程式人生 > >關於Android n分屏處理的總結

關於Android n分屏處理的總結

Android N Preview,第一個不能錯過的新特性就是App分屏的支援。Android7.0原生系統就可以支援兩個App橫屏並排或者豎屏上下襬放了。第二個新特性就是在Android TV上,原生系統也可以支援App實現畫中畫,使用者可以一邊看視訊一邊操作其他的應用。

其實早先在國內部分廠商以及鵝廠的微信App就已經支援在大尺寸手機上進行分屏瀏覽。也有一些視訊播放器,如MoboPlayer就已經實現了按下Home鍵回到首頁時以迷你播放器的形式進行播放。這種體驗非常棒,我猜測一般是通過WindowManager來新增懸浮播放器介面的。但是這次是原生系統增加了對這種特性的支援,相信我們會有更多理由為使用者的體驗做出更多新的嘗試。

首先引用一下官方的說法:

如果你使用Android N Preview SDK來構建你的App,你可以給新增App一些分屏瀏覽的配置。例如設定Activity的最小尺寸,也可以禁止自己的App進入分屏模式,保證你的App只能在全屏模式下展示。

概述

Android N允許使用者一次在螢幕中使用兩個App,例如將螢幕一分為二,左邊瀏覽網頁,右邊檢視郵件。具體的體驗取決於你的裝置。

  • 手持裝置中,使用者可以左右並排/上下襬放兩個App來使用。使用者還可以左右/上下拖拽中間的那個小白線來改變兩個App的尺寸。

split-screen

  • 在執行Android N的Nexus Player上,App可以實現畫中畫模式,允許使用者使用一個App瀏覽內容的同時,在另一個App上操作。

  • 大尺寸裝置的廠商甚至可以實現自由模式,這樣就可以使得使用者可以完全自由地改變介面的尺寸。這又是與分屏更為不同一種體驗。

使用者是如何操作來進入分屏模式的呢:

  1. 點選右下角的方塊,進入工作管理員,長按一個App的標題欄,將其拖入螢幕的高亮區域,這個App金進入了分屏模式。然後在工作管理員中選擇另一個App,單擊它使得這個App也進入分屏模式。
  2. 開啟一個App,然後長按右下角的方塊,此時已經開啟的這個App將進入分屏模式。然後在螢幕上的工作管理員中選擇另外一個App,單擊它使得這個App也進入分屏模式。
  3. 最新發現:下拉通知欄,長按右上角的設定圖示,將開啟隱藏設定功能“系統介面調諧器”,進入設定介面,最下方有系統介面調諧器選項,進入後選擇“Other”->“啟用分屏上滑手勢”
    ,就可以從工作管理員上上滑進入分屏模式了。具體操作是當一個App已經處於全屏模式時,用手指從右下角的小方塊向上滑動。這個設定將來在正式版可能有變化,所以還是不要太依賴。

使用者還可以在這兩個App之間拖動資料,例如將一個App的Activity上的檔案拖動到另外一個App的Activity中去。具體的實現下面會介紹,谷歌官方也有拖拽相關的教程

分屏模式的生命週期

首先要說明的一點是,分屏模式沒有改變Activity的生命週期。

官方說法是: > 在分屏模式下,使用者最近操作、啟用過的Activity將被系統視為topmost。而其他的Activity都屬於paused狀態,即使它是一個對使用者可見的Activity。但是這些可見的處於paused狀態的Activity將比那些不可見的處於paused狀態的Activity得到更高優先順序的響應。當用戶在一個可見的paused狀態的Activity上操作時,它將得到恢復resumed狀態,並被系統視為topmost。而之前那個那個處於topmpst的Activity將變成paused狀態。

怎麼理解這段話,看下圖:

two-app

其實就是說處於分屏模式下的兩個Ap各自處於生命週期的什麼狀態。上圖中我打開了兩個App,上面的是一個Gmail App,下面這個是一個Demo App(ApkParser先感謝作者的分享~)是個開源應用,能夠解析Apk,後面會用到它)。現在這兩個App都是進入了分屏模式,我們還可以拖動中間這條白線來調整兩個App佔用的大小。

我點選了Gmail,瀏覽了一封郵件,那麼此時Gmail就被系統視為topmost狀態,它是處於resumed狀態的,而下面的ApkPaserDemo雖然對使用者可見,但是它仍然是處於paused狀態的。接著我點選了系統的back按鈕返回,響應的是上面的Gmail(因為它被視為topmost)。然後我又點選了下面的ApkParserDemo,這時它從paused狀態變成了resumed狀態。而上面的Gmail進入了paused狀態。

注意,這兩個App對於使用者都是始終可見的,當它們處於paused狀態時,也將比那些後臺的處於不可見的App得到更高系統優先順序。這個優先順序怎麼體現呢?兩個App進入分屏模式後,一定有一個處於resume/topmost狀態,假如我一直按back返回,當這個topmost狀態App的task返回棧已經為空時,那麼系統將把另外一個可見的App恢復為全屏模式,這就是我的理解。

那麼這種可見的pause的狀態將帶來什麼影響呢?引用下官方說法是:

在分屏模式中,一個App可以在對使用者可見的狀態下進入paused狀態,所以你的App在處理業務時,應該知道自己什麼時候應該真正的暫停。例如一個視訊播放器,如果進入了分屏模式,就不應該在onPaused()回撥中暫停視訊播放,而應該在onStop()回撥中才暫停視訊,然後在onStart回撥中恢復視訊播放。關於如果知道自己進入了分屏模式,在Android N的Activity類中,增加了一個void onMultiWindowChanged(boolean inMultiWindow)回撥,所以我們可以在這個回撥知道App是不是進入了分屏模式。

當App進入分屏模式後,將會觸發Activity的onConfigurationChanged(),這與以前我們在處理App從橫豎屏切換時的方法一樣,不同於的是這裡是寬/高有所改變,而橫豎屏切換是寬高互換。至於如何處理,可以參考官方文件處理執行時變更。我們最好處理好這種執行時狀態的改變,否則我們的Activity將被重新建立,即以新的寬高尺寸重新onCreate()一遍。

注意,如果使用者重新調整視窗的大小,系統在必要的時候也可能觸發onConfigurationChanged()。當App的視窗被使用者拖動,其尺寸改變後介面的還沒有繪製完成時,系統將用App主題中的windowBackground屬性指定的背景來暫時填充這些區域。

如何設定App的分屏模式

說了一堆分屏的操作方法、生命週期,那麼作為開發者,怎樣才能讓App進入分屏模式呢?有下面這幾個屬性。

android:resizeableActivity

如果你適配到了Android N,即build.gradle是這樣的:

android {
    compileSdkVersion 'android-N'
    buildToolsVersion '24.0.0 rc1'

    defaultConfig {
        applicationId "com.example.noughtchen.andndemo"
        minSdkVersion 'N'
        targetSdkVersion 'N'
        versionCode 1
        versionName "1.0"
    }
    ...
}

那麼直接在AndroidManifest.xml中的<application>或者<activity>標籤下設定新的屬性android:resizeableActivity="true"

設定了這個屬性後,你的App/Activity就可以進入分屏模式或者自由模式了。

如果這個屬性被設為false,那麼你的App將無法進入分屏模式,如果你在開啟這個App時,長按右下角的小方塊,App將仍然處於全屏模式,系統會彈出Toast提示你無法進入分屏模式。這個屬性在你targetAndroid N後,android:resizeableActivity的預設值就是true

注意:假如你沒有適配到Android NtargetSDKVersion < Android N),打包App時的compileSDKVersion < Android N,你的App也是可以支援分屏的!!!!原因在於:如果你的App沒有設定僅允許Activity豎屏/橫屏,即沒有設定型別android:screenOrientation="XXX"屬性時,執行Android N系統的裝置還是可以將你的App分屏!!但是這時候系統是不保證執行時的穩定性的,在進入分屏模式時,系統首先也會彈出Toast來提示你說明這個風險。

所以其實我們在視訊裡看到那麼多系統自帶的App都是可以分屏瀏覽,原因就在於此。這些App其實也並沒有全部適配到Android N。我不是騙你,不信你用ApkParser開啟前面分屏過Gmail App的xml檔案看看!

Gmail-xml

android:supportsPictureInPicture

這裡不多說,Activity標籤下,新增android:supportsPictureInPicture="true"即可。

<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:resizeableActivity="true"
            android:supportsPictureInPicture="true"
            android:theme="@style/AppTheme.NoActionBar">
            ...
        </activity>

Layout attributes

在Android N中,我們可以向manifest檔案中新增layout節點,並設定一些新增加的屬性,通過這些屬性來設定分屏模式的一些行為,如最小尺寸等。

  • android:defaultWidth
  • android:defaultHeight
  • android:gravity
  • android:minimalSize

我們可以給一個Activity增加一個layout子節點:

<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:resizeableActivity="true"
            android:supportsPictureInPicture="true"
            android:theme="@style/AppTheme.NoActionBar">
            ...
            <layout android:defaultHeight="500dp"
                    android:defaultWidth="600dp"
                    android:gravity="top|end"
                    android:minimalSize="450dp" />
            ...
        </activity>

我們應該如何讓自己的App進入分屏模式,當App進入分屏模式時,我們注意哪些問題。

簡單地說,我認為除了保證分屏時App功能、效能正常以外,我們需要重點學習如何在分屏模式下開啟新的Activity以及如何實現跨APP/Activity的拖拽功能

用分屏模式執行你的App

Android N中新增了一些方法來支援App的分屏模式。同時在分屏模式下,也禁用了App一些特性。

分屏模式下被禁用的特性

  • 自定義系統UI,例如分屏模式下無法隱藏系統的狀態列。
  • 無法根據螢幕方向來旋轉App的介面,也就是說android:screenOrientation屬性會被系統忽略

分屏模式的通知回撥、查詢App是否處於分屏狀態

   最新的Android N SDK中Activity類中增加了下面的方法。

  • inMultiWindow():返回值為boolean,呼叫此方法可以知道App是否處於分屏模式。
  • inPictureInPicture():返回值為boolean,呼叫此方法可以知道App是否處於畫中畫模式。

注意:畫中模式其實是一個特殊的分屏模式,如果mActivity.inPictureInPicture()返回true,那麼mActivity.inMultiWindow()一定也是返回true

  • onMultiWindowChanged(boolean inMultiWindow):當Activity進入或者退出分屏模式時,系統會回撥這個方法來通知開發者。回撥的引數inMultiWindow為boolean型別,如果inMultiWindow為true,表示Activity進入分屏模式;如果inMultiWindow為false,表示退出分屏模式。
  • onPictureInPictureChanged(boolean inPictureInPicture):當Activity進入畫中畫模式時,系統會回撥這個方法。回撥引數inPictureInPicturetrue時,表示進入了畫中畫模式;inPictureInPicturefalse時,表示退出了畫中畫模式。

 Fragment類中,同樣增加了以上支援分屏模式的方法,例如Fragment.inMultiWindow()

如何進入畫中畫模式

呼叫Activity類的enterPictureInPicture()方法,可以使得我們的App進入畫中畫模式。如果執行的裝置不支援畫中畫模式,呼叫這個方法將不會有任何效果。更多畫中畫模式的資料,請參考picture-in-picture

在分屏模式下開啟新的Activity

當你開啟一個新的Activity時,只需要給Intent新增Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT,系統將嘗試將它設定為與當前的Activity共同以分屏的模式顯示在螢幕上。

注意:這裡只是嘗試,但這不一定是100%生效的,前一篇部落格裡也說過,假如新開啟的Activity的android:resizeableActivity屬性設定為false,就會禁止分屏瀏覽這個Activity。所以系統只是嘗試去以分屏模式開啟一個新的Activity,如果條件不滿足,將不會生效!此外,我實際用Android N Preview SDK實踐的時候發現這個FLAG實際得值是FLAG_ACTIVITY_LAUNCH_ADJACENT,並非是FLAG_ACTIVITY_LAUNCH_TO_ADJACENT

當滿足下面的條件,系統會讓這兩個Activity進入分屏模式:

  • 當前Activity已經進入到分屏模式。
  • 新開啟的Activity支援分屏瀏覽(即android:resizeableActivity=true)。

此時,給新開啟的Activity,設定intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);才會有效果。

two-acts

那麼為何還需要新增FLAG_ACTIVITY_NEW_TASK?看一下官方解釋:

注意:在同一個Activity返回棧中,開啟一個新的Activity時,這個Activity將會繼承上一個Activity所有和分屏模式有關的屬性。如果你想要在一個獨立的視窗以分屏模式開啟一個新的Activity,那麼必須新建一個Activity返回棧。

此外,如果你的裝置支援自由模式(官方名字叫freeform,暫且就這麼翻譯它,其實我認為這算也是一種尺寸更自由的分屏模式,上一篇部落格裡提到過如果裝置廠商支援使用者可以自由改變Activity的尺寸,那麼就相當於支援自由模式,這將比普通的分屏模式更加自由),開啟一個Activity時,還可通過ActivityOptions.setLaunchBounds()來指定新的Activity的尺寸和在螢幕中的位置。同樣,這個方法也需要你的Activity已經處於分屏模式時,呼叫它才會生效。

支援拖拽

上一篇部落格裡也提到過,現在我們可以實現在兩個分屏模式的Activity之間拖動內容了。Android N Preview SDK中,View已經增加支援Activity之間拖動的API。具體的類和方法,可以參考N Preview SDK Reference,主要用到下面幾個新的介面:

  • View.startDragAndDrop():View.startDrag()的替代方法,需要傳遞View.DRAG_FLAG_GLOBAL來實現跨Activity拖拽。如果需要將URI許可權傳遞給接收方Activity,還可以根據需要設定View.DRAG_FLAG_GLOBAL_URI_READ或者View.DRAG_FLAG_GLOBAL_URI_WRITE
  • View.cancelDragAndDrop():由拖拽的發起方呼叫,取消當前進行中的拖拽。
  • View.updateDragShadow():由拖拽的發起方呼叫,可以給當前進行的拖拽設定陰影。
  • android.view.DropPermissions:接收方App所得到的許可權列表。
  • Activity.requestDropPermissions():傳遞URI許可權時,需要呼叫這個方法。傳遞的內容儲存在DragEvent中的ClipData裡。返回值為前面的android.view.DropPermissions

下面是我自己寫的一個demo,實現了在分屏模式下,把一個Activity中ImageView中儲存的內容到另外一個Activity中進行顯示。實際應用中,可以還可以傳遞圖片的url或者Bitmap物件。

drag-drop

上圖是一個最基本的例子,實現了把MainActivity中的圖片儲存的內容,拖拽到SecondActivity中。實現步驟如下:

在MainActivity中,發起拖拽。

// 1.首先我們在分屏模式下,開啟自己App中的SecondActivity
findViewById(R.id.launch_second_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });
        
// 2.然後我們在MainActivity中發出拖拽事件
imageView = (ImageView) findViewById(R.id.img);
        /** 拖拽的傳送方Activity和ImageView */
        imageView.setTag("I'm a ImageView from MainActivity");
        imageView.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    /** 構造一個ClipData,將需要傳遞的資料放在裡面 */
                    ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
                    String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
                    ClipData dragData = new ClipData(view.getTag().toString(), mimeTypes, item);
                    View.DragShadowBuilder shadow = new View.DragShadowBuilder(imageView);
                    /** startDragAndDrop是Android N SDK中的新方法,替代了以前的startDrag,flag需要設定為DRAG_FLAG_GLOBAL */
                    view.startDragAndDrop(dragData, shadow, null, View.DRAG_FLAG_GLOBAL);
                    return true;
                } else {
                    return false;
                }
            }
        });

SecondActivity中,接收這個拖拽的結果,在ACTION_DROP事件中,把結果顯示出來。

dropedText = (TextView) findViewById(R.id.text_drop);
        dropedText.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View view, DragEvent dragEvent) {
                switch (dragEvent.getAction()) {
                    case DragEvent.ACTION_DRAG_STARTED:
                        Log.d(TAG, "Action is DragEvent.ACTION_DRAG_STARTED");
                        break;

                    case DragEvent.ACTION_DRAG_ENTERED:
                        Log.d(TAG, "Action is DragEvent.ACTION_DRAG_ENTERED");
                        break;

                    case DragEvent.ACTION_DRAG_EXITED:
                        Log.d(TAG, "Action is DragEvent.ACTION_DRAG_EXITED");
                        break;

                    case DragEvent.ACTION_DRAG_LOCATION:
                        break;

                    case DragEvent.ACTION_DRAG_ENDED:
                        Log.d(TAG, "Action is DragEvent.ACTION_DRAG_ENDED");
                        break;

                    case DragEvent.ACTION_DROP:
                        Log.d(TAG, "ACTION_DROP event");
                        /** 3.在這裡顯示接收到的結果 */
                        dropedText.setText(dragEvent.getClipData().getItemAt(0).getText());
                        break;

                    default:
                        break;
                }

                return true;
            }
        });

這裡實現的關鍵在新增加的startDragAndDrop方法,看下官方的API文件:

start-drag

清楚地提到了,發出的DragEvent能夠被所有可見的View物件接收到,所以在分屏模式下,SecondActivity可以監聽View的onDrag事件,於是我們監聽它!

接著,我們看下DragEvent.ACTION_DROP事件發生的條件:

drop-event

當被拖拽的View的陰影進入到接收方View的座標區域,如果此時使用者鬆手,那麼接收方View就可以接收到這個Drop事件。一目瞭然,我們通過拖拽ImageView到圖上的灰色區域,鬆手,便可以觸發DragEvent.ACTION_DROP,把資料傳到SecondActivity中了。

其實還有更復雜的一些情況,需要呼叫requestDropPermissions,後續我再進一步實踐一下。

這個demo的地址在這裡,先分享出來,後面我再接著完善它。

在分屏模式下測試你的App

無論你是否將自己的App適配到了Android N,或者是支援分屏模式,都應該找個Android N的裝置,來測試一下自己的App在分屏模式下會變成什麼樣。

設定你的測試裝置

如果你有一臺執行Android N的裝置,它是預設支援分屏模式的。

如果你的App不是用Android N Preview SDK打包的

如果你的App是用低於Android N Preview SDK打包的,且你的Activity支援橫豎屏切換。那麼當用戶在嘗試使用分屏模式時,系統會強制將你的App進入分屏模式。(我在第一篇部落格裡提到過這個,Android N Preview的介紹視訊中,很多Google家的App都可以進入分屏模式,但是開啟它們的xml一看,其實targetSDKVersion = 23

因此,如果你的App/Activity支援橫豎屏切換,那麼你應該嘗試一下讓自己的App分屏,看看當系統強制改變你的App尺寸時,使用者是否還可以接受這種體驗。如果你的App/Activity不支援橫豎屏切換,那麼你可以確認一下,看看當嘗試進入分屏時,你的App是不是仍然能夠保持全屏模式。

如果你給App設定了支援分屏模式

如果你使用了Android N Preview SDK來開發自己的App,那麼應該按照下面的要點檢查一下自己的App。

  • 啟動App,長按系統導航欄右下角的小方塊(Google官方把這個叫做Overview Button),確保你的App可以進入分屏模式,且尺寸改變後仍然能正常工作。
  • 啟動工作管理員(即單擊右下角的小方塊),然後長按你App的標題欄,將它拖動到螢幕上的高亮區域。確保你的App可以進入分屏模式,且尺寸改變後仍然能正常工作。

這兩點在上一篇部落格中介紹過,讓自己的App進入分屏模式有三種方法。第三種方法,就是在開啟自己的App時,用手指從右下角的小方塊向上滑動,這樣也可以使得正在瀏覽的App進入分屏模式。這種方法目前屬於實驗性功能,正式版不一定保留。

  • 當你的App進入分屏後,通過拖動兩個App中間的分欄上面的小白線,從而改變App的尺寸,觀察App中各個UI元素是否正常顯示。
  • 如果你給自己的App/Activity設定了最小尺寸,可以嘗試在改變App尺寸時,低於這個最小尺寸,觀察App是不是會回到設定好的最小尺寸。
  • 在進行上面幾項測試時,請同時驗證自己的App功能和效能是否正常,並注意一下自己的App在更新UI時是否花費了太長的時間。

這幾項測試,其實主要強調的是,我們的App可以順利的進入/退出分屏模式,且改變App的尺寸時,UI依然可以也非常順滑。

這裡我想多說一句,如果進入了分屏模式,要注意下App彈出的對話方塊,因為螢幕被兩個App分成兩塊之後,對話方塊也是可以彈出兩個的。這時對話方塊上的UI元素可能就會變得比較小了,如果我們的程式碼是寫死的大小,例如對話方塊是一個WebView,就需要特別注意了,搞不好顯示出來就缺了一塊了,這裡需要我們做好適配。

測試清單

關於功能、效能方面測試,還可以按照下面的操作來進行。

  • 讓App進入,再退出分屏模式,確保此時App功能正常。
  • 讓App進入分屏模式,啟用螢幕上的另外一個App,讓自己的App進入可見、paused狀態。舉了例子來講,如果你的App是一個視訊播放器,那麼當用戶點選了螢幕上另外一個App時,你的App不應該停止播放視訊,即使此時你的Activity/Fragment已經接到了onPaused()回撥。
  • 讓App進入分屏模式,拖動分欄上的小白線,改變App的尺寸。請在豎屏(兩個App一上一下佈局)和橫屏(兩個App一左一右佈局)模式下分別進行改變尺寸的操作。確保App不會崩潰,各項功能正常,且UI的重新整理沒有花費太多時間。
  • 在短時間內、多次、迅速地改變App尺寸,確保App沒有崩潰,且沒有發生記憶體洩露。關於記憶體使用方面的更詳細注意事項,請參考Investigating Your RAM Usage
  • 在不同的視窗設定的情況下,正常使用App,確保App功能正常,文字仍然可讀,其他的UI元素也沒有變得太小,使用者仍然可以舒適地操作App。

這幾項測試,其實主要是說當App在分屏模式下執行時,仍然可以保持效能的穩定,不會Crash也不會OOM。

如果你給App設定了禁止分屏模式

如果你給App/Activity設定了android:resizableActivity="false",你應該試試當用戶在Android N的裝置上,嘗試分屏瀏覽你的App時,它是否仍然能保持全屏模式。

以上就是參考Google最新的multi-window進行的實踐,總結下,我認為有3點比較重要:

  1. 如何讓自己的App/Activity順利的進入和退出分屏模式,可以參考處理執行時改變這一章。
  2. 如何實現跨App/Activity的拖拽功能,可以參考Drag and Drop這一章。

1.給Activity加上如下配置可以保證切換成多屏模式時Activity不會銷燬重建。

android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation">

2.若想要禁止某個app或者應用的某個介面進行分屏,可在對應的application或者activity標籤下設定屬性。

android:resizeableActivity=true或false,true表示可以進行分屏,false為禁止分屏;設定完成後重新啟動手機檢視效果。

3.若要對分屏下的介面進行修改,可通過isInMultiWindowMode()方法進行判斷。

因為該方法屬於Activity包下,因此在fragment中使用該方法時需要傳入activity,而非Fragment。例如:

getActivity.isInMultiWindowMode();或(Activity)context.isInMultiWindowMode();

該方法在分屏模式下為true,非分屏模式下為false;

4.分屏模式下的橫豎屏並非為非分屏模式下的橫豎屏,其橫豎屏為非絕對的,具體的橫豎值根據分屏後的高度與寬度值大小而定。

  • 長按(口), Activity首先呼叫onMultiWindowChanged->onPause->onStop->onDestroy->onCreate->onStart- >onResume->onPause(焦點切入到另一屏)
  • 來回切焦點(onPause->onResume來回交替, 這就證明了, 如果是播放類的app, 暫停不能放在onPause裡面)
  • 來回拖動視窗大小當拖到1/3, 或者2/3之處, 生命週期都是銷燬再重啟然後再進入到onPause或者onResume(取決於是否有焦點)
  • 分屏模式進入到桌面如果有焦點則呼叫onPause, 沒有焦點則不發生生命週期的變化!