淺析有趣的分屏

Android N,Android N新增了不少功能,最受關注的自然就是分屏了。

這一功能對國內的很多手機用戶並不陌生,其實很多第三方系統早已經實現了這一功能,如EMUI,Flyme等等。

1200uploading.4e448015.gif轉存失敗重新上傳取消

分屏操作

在我的手機中,就可以一邊看視頻,一邊瀏覽簡書。Android N分屏功能的更新,似乎並不會對我國第三方Android系統帶來多大的影響。畢竟廠商有自己實現這一功能的套路。

然而,谷歌反應的“緩慢”真的沒有價值嗎?其實不是的,Android N新增的功能是爲其他第三方系統作出一個“標杆”。

這裏舉個例子,首先是分屏多任務,如今不同Android ROM實現該功能的方式不一,而且對軟件的兼容也大有不同,所以體驗也就可能差天共地(不能達到該有的標準),而Android N新增分屏多任務的支持,除了讓第三方ROM開發商可以參照這個“模板”進行二次開發之外,軟件開發人員也能根據Android N分屏多任務功能的實現方式去進行軟件的開發。從而大大減少了自己摸索的時間,加快開發速度,由此支持該功能的軟件會更多,兼容性也會更好。

分屏模式在Android電視中就變成了更爲強大的畫中畫模式,終於可以一邊看比賽直播,一邊追電視劇了。

700uploading.4e448015.gif轉存失敗重新上傳取消

畫中畫

如何分屏呢

如果您的應用是使用 N Preview SDK 構建的,且未禁用多窗口支持,則應用默認支持分屏操作。

 

    compileSdkVersion 'android-N'
    buildToolsVersion "24.0.0 rc4"

    defaultConfig {
        applicationId "com.yll520wcf.myapplication"
        minSdkVersion 14
        targetSdkVersion 'N'
        versionCode 1
        versionName "1.0"
    }

用戶可以通過以下方式切換到多窗口模式:

  1. 若用戶打開最近任務列表(Overview 屏幕),並長按 Activity 標題,則可以拖動該 Activity 至屏幕突出顯示的區域,使 Activity 進入多窗口模式。
  2. 若用戶長按菜單按鍵(Overview 按鈕),設備上的當前 Activity 將進入多窗口模式,同時將打開 最近任務列表(Overview 屏幕),用戶可在該屏幕中選擇要共享屏幕的另一個 Activity。

用戶居然還可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間拖放數據 (在此之前,用戶只能在一個 Activity 內部拖放數據)。想想以後微博的圖片直接拖到微信朋友圈中是不是很屌啊。

多窗口生命週期

還需要注意的是多窗口不會影響Activity的生命週期。

在多窗口模式中,在指定時間只有最近與用戶交互過的 Activity 爲活動狀態。 該 Activity 將被視爲頂級 Activity。 所有其他 Activity 雖然可見,但均處於暫停狀態。 但是,這些已暫停但可見的 Activity 在系統中享有比不可見 Activity 更高的優先級。 如果用戶與其中一個暫停的 Activity 交互,該 Activity 將恢復,而之前的頂級 Activity 將暫停。

在多窗口模式中,用戶仍可以看到處於暫停狀態的應用。 應用在暫停狀態下可能仍需要繼續其操作。
例如,處於暫停模式但可見的視頻播放應用應繼續顯示視頻。因此,我們建議播放視頻的 Activity 不要在 onPause()方法中暫停視頻,應在onStop()暫停視頻播放,並在 onStart()中恢復視頻播放。

用戶使用多窗口模式顯示應用時,系統將通知 Activity 發生配置變更。 該變更與系統通知應用設備從縱向模式切換到橫向模式時的 Activity 生命週期影響基本相同,但設備不僅僅是交換尺寸,而是會變更尺寸。您的 Activity 可以自行處理配置變更,或允許系統銷燬 Activity,並以新的尺寸重新創建該 Activity。

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

 

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

針對多窗口進行配置

在清單文件的 <activity>或 <application>節點中設置該屬性,啓用或禁用多窗口顯示:

 

android:resizeableActivity=["true" | "false"]

如果該屬性設置爲 true,Activity 將能以分屏和自由形狀模式啓動。 如果此屬性設置爲 false,Activity 將不支持多窗口模式。 如果該值爲 false,且用戶嘗試在多窗口模式下啓動 Activity,該 Activity 將全屏顯示。

如果您的應用面向 Android N,但未對該屬性指定值,則該屬性的值默認設爲 true。
如果做電視開發或其它特殊需求,還有一個屬性需要注意:

 

android:supportsPictureInPicture=["true" | "false"]

在清單文件的 <activity>節點中設置該屬性,指明 Activity 是否支持畫中畫顯示。如果 android:resizeableActivity爲 false,將忽略該屬性。

當然你還可以指定在自由形狀模式時 Activity 的默認大小、位置和最小尺寸:

 

<activity android:name=".MainActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end"
          android:minimalSize="450dp" />
</activity>

對於 Android N,<layout>清單文件元素支持以下幾種屬性,這些屬性影響 Activity 在多窗口模式中的行爲:

  1. android:defaultWidth 以自由形狀模式啓動時 Activity 的默認寬度。
  2. android:defaultHeight 以自由形狀模式啓動時 Activity 的默認高度。
  3. android:gravity 以自由形狀模式啓動時 Activity 的初始位置。
  4. android:minimalSize 分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動分界線,使 Activity 尺寸低於指定的最小值,系統會將 Activity 裁剪爲用戶請求的尺寸。

多窗口模式中運行應用注意事項

在設備處於多窗口模式中時,某些功能會被禁用或忽略,因爲這些功能對與其他 Activity 或應用共享設備屏幕的 Activity 而言沒有意義。 此類功能包括:

  1. 某些自定義選項將被禁用;例如,在非全屏模式中,應用無法隱藏狀態欄。
  2. 系統將忽略對 android:screenOrientation屬性所作的更改

Activity類中添加了以下新方法,以支持多窗口顯示。

  1. Activity.inMultiWindow() 調用該方法以確認 Activity 是否處於多窗口模式。
  2. Activity.inPictureInPicture() 調用該方法以確認 Activity 是否處於畫中畫模式。:畫中畫模式是多窗口模式的特例。 如果 myActivity.inPictureInPicture()返回 true,則 myActivity.inMultiWindow()也返回 true。
  3. Activity.onMultiWindowChanged() Activity 進入或退出多窗口模式時系統將調用此方法。 在 Activity 進入多窗口模式時,系統向該方法傳遞 true 值,在退出多窗口模式時,則傳遞 false 值。
  4. Activity.onPictureInPictureChanged() Activity 進入或退出畫中畫模式時系統將調用此方法。 在 Activity 進入畫中畫模式時,系統向該方法傳遞 true 值,在退出畫中畫模式時,則傳遞 false 值。

每個方法還有 Fragment版本,例如 Fragment.inMultiWindow()。

在多窗口模式中啓動新 Activity

在啓動新 Activity 時,用戶可以提示系統如果可能,應將新 Activity 顯示在當前 Activity 旁邊。 要執行此操作,可使用標誌Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。傳遞此標誌將請求以下行爲:

  1. 如果設備處於分屏模式,系統會嘗試在啓動系統的 Activity 旁創建新 Activity,這樣兩個 Activity 將共享屏幕。 系統並不一定能實現此操作,但如果可以,系統將使兩個 Activity 處於相鄰的位置。
  2. 如果設備不處於分屏模式,則該標誌無效。

 

    public void click(View v){
        Intent intent=new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }

429uploading.4e448015.gif轉存失敗重新上傳取消

Paste_Image.png

支持拖放

用戶可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間拖放。因此,如果您的應用目前不支持拖放功能,您可以在其中添加此功能。

  1. android.view.DropPermissions令牌對象,負責指定對接收拖放數據的應用授予的權限。
  2. View.startDragAndDrop() View.startDrag()的新別名。要啓用跨 Activity 拖放,請傳遞新標誌 View.DRAG_FLAG_GLOBAL。如需對接收拖放數據的 Activity 授予 URI 權限,可根據情況傳遞新標誌 View.DRAG_FLAG_GLOBAL_URI_READView.DRAG_FLAG_GLOBAL_URI_WRITE。
  3. View.cancelDragAndDrop() 取消當前正在進行的拖動操作。只能由發起拖動操作的應用調用。
  4. View.updateDragShadow() 替換當前正在進行的拖動操作的拖動陰影。只能由發起拖動操作的應用調用。
  5. Activity.requestDropPermissions() 請求使用 DragEvent中包含的 ClipData傳遞的內容 URI 的權限。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章