• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=多視窗支援
2page.metaDescription=Android N 新推出支援一次顯示多個應用程式。
3page.keywords="multi-window", "android N", "split screen", "free-form"
4
5@jd:body
6
7<div id="qv-wrapper">
8  <div id="qv">
9    <h2>此文件內容</h2>
10      <ol>
11        <li><a href="#overview">總覽</a></li>
12        <li><a href="#lifecycle">多視窗生命週期</a></li>
13        <li><a href="#configuring">針對多視窗模式設定應用程式
14</a></li>
15        <li><a href="#running">在多視窗模式中執行應用程式</a></li>
16        <li><a href="#testing">測試應用程式的多視窗支援</a></li>
17      </ol>
18    <h2>另請參閱</h2>
19      <ol>
20        <li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">多視窗 Playground 範例應用程式
21</a></li>
22      </ol>
23  </div>
24</div>
25
26<p>
27  Android N 新增一次顯示多個應用程式的支援。
28在手持式裝置上,兩個應用程式可以在「分割畫面」模式中並排或上下排列。
29<em></em>在電視裝置上,應用程式能使用「子母畫面」模式,在使用者與另一個應用程式互動時持續播放影片。
30<em></em>
31
32</p>
33
34<p>
35  如使用 N Preview SDK 建置應用程式,您可以設定應用程式處理多視窗顯示的方式。
36例如,您可以指定活動的最小可允許尺寸。
37您也可以停用應用程式的多視窗顯示,確保系統只會以全螢幕模式顯示您的應用程式。
38
39
40</p>
41
42<h2 id="overview">總覽</h2>
43
44<p>
45  Android N 允許多個應用程式同時分享螢幕。例如,使用者可以分割畫面,在左邊檢視網頁,同時在右邊撰寫電子郵件。
46
47使用者體驗依裝置而異:
48
49</p>
50
51<ul>
52  <li>執行 Android N 的手持式裝置可提供分割畫面模式。
53處於此模式時,系統會以並排或上下排列的方式顯示兩個應用程式,將螢幕填滿。
54使用者可以拖曳將畫面一分為二的分隔線,加大一邊的應用程式,就會縮小另一邊。
55
56  </li>
57
58  <li>在執行 Android N 的 Nexus Player 上,當使用者瀏覽其他應用程式或與其互動時,應用程式會將本身放入<a href="picture-in-picture.html">子母畫面模式</a>以持續顯示內容。
59
60
61
62  </li>
63
64  <li>較大型裝置的製造商可選擇啟用自由形式模式,讓使用者自由調整每個活動的大小。
65若製造商啟用此功能,裝置除了分割畫面模式外,還會提供自由形式模式。
66
67
68  </li>
69</ul>
70
71<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
72    {@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
73<p class="img-caption">
74  <strong>圖 1.</strong> 在分割畫面模式中並排執行的兩個應用程式。
75</p>
76
77<p>
78  使用者可以透過下列方式來切換多視窗模式:
79</p>
80
81<ul>
82  <li>如果使用者開啟<a href="{@docRoot}guide/components/recents.html">總覽畫面</a>並長按活動標題,就可以將該標題拖曳到畫面醒目提示的部分,將活動放入多視窗模式。
83
84
85
86  </li>
87
88  <li>如果使用者長按「總覽」按鈕,裝置會將目前的活動放入多視窗模式,並開啟總覽畫面,讓使用者選擇要分享螢幕的另一個活動。
89
90
91  </li>
92</ul>
93
94<p>
95  使用者可以在活動分享螢幕時,將一個活動中的資料<a href="{@docRoot}guide/topics/ui/drag-drop.html">拖放</a>到另一個活動。
96
97(之前,使用者只能在單一活動內拖放資料)。
98
99</p>
100
101<h2 id="lifecycle">多視窗生命週期</h2>
102
103<p>
104  多視窗模式不會變更<a href="{@docRoot}training/basics/activity-lifecycle/index.html">活動生命週期</a>。
105
106</p>
107
108<p>
109  在多視窗模式中,特定時間只有最近與使用者互動的活動才會處於使用中。
110這會視為「最上層」活動。<em></em>
111  即使能看到所有其他活動,但也處於暫停狀態。
112  然而,相較於看不到的活動,系統會給予這類暫停但可看見的活動較高的優先順序。
113若使用者改與其中一個暫停的活動互動,該活動就會恢復,使先前的最上層活動變成暫停。
114
115
116</p>
117
118<p class="note">
119  <strong>注意:</strong>在多視窗模式中,使用者仍能見到處於暫停狀態的應用程式。
120即使處於暫停,應用程式仍需要進行其活動。
121例如,處於暫停模式但仍可以看見的影片播放應用程式,應會持續顯示其影片。
122因此,建議您在播放影片的活動 {@link android.app.Activity#onPause onPause()} 處理常式中,「不要」暫停影片。
123<em></em>
124
125  應該改為在 {@link android.app.Activity#onStop
126  onStop()}, and resume playback in {@link android.app.Activity#onStart
127  onStart()} 中暫停影片。
128</p>
129
130<p>
131  當使用者將應用程式放入多視窗模式時,系統會通知活動發生設定變更,如<a href="{@docRoot}guide/topics/resources/runtime-changes.html">處理執行階段變更</a>所指定。
132
133基本上,此變更的活動生命週期和系統通知應用程式,裝置從垂直模式切換為水平模式時的生命週期相當,差別在於裝置尺寸會改變,而不只是切換。
134
135
136如<a href="{@docRoot}guide/topics/resources/runtime-changes.html">處理執行階段變更</a>中所述,您的活動能自行處理設定變更,或會允許系統終結活動並以新的尺寸重新建立。
137
138
139
140</p>
141
142<p>
143  如果使用者調整視窗大小並加大長或寬的尺寸,系統會根據使用者動作來調整活動大小,並視需要發出<a href="{@docRoot}guide/topics/resources/runtime-changes.html">執行階段變更</a>。
144
145若應用程式在新公開的區域中繪製發生延遲,系統會暫時使用 {@link
146  android.R.attr#windowBackground windowBackground} 所指定的色彩或預設的
147  <code>windowBackgroundFallback</code> 樣式屬性,填滿那些區域。
148
149</p>
150
151<h2 id="configuring">針對多視窗模式設定應用程式</h2>
152
153<p>
154  您的應用程式若以 Android N 為目標,您可以設定應用程式的活動是否支援多視窗顯示以及支援的方式。
155您可以在宣示說明中設定屬性,同時控制大小與版面配置。
156
157  根活動的屬性設定會套用到它工作堆疊內的所有活動。
158
159</p>
160
161<p class="note">
162  <strong>注意:</strong>如果您使用 Android N 以下的 SDK 版本建置多螢幕方向應用程式,而且使用者會在多視窗模式中使用該應用程式,系統會強制調整應用程式大小。
163
164系統會顯示對話方塊向使用者警告應用程式行為異常。
165系統「不會」調整螢幕方向固定的應用程式大小,如使用者嘗試在多視窗模式下開啟螢幕方向固定的應用程式,應用程式會佔滿整個螢幕。
166<em></em>
167
168
169</p>
170
171<h4 id="resizeableActivity">android:resizeableActivity</h4>
172<p>
173  在宣示說明的 <code>&lt;activity&gt;</code> 或
174  <code>&lt;application&gt;</code> 節點中,設定此屬性以啟用或停用多視窗顯示:
175
176</p>
177
178<pre>
179android:resizeableActivity=["true" | "false"]
180</pre>
181
182<p>
183  如將此屬性設定為 true,就能以分割畫面和自由形式模式來啟動活動。
184如將屬性設定為 false,活動會不支援多視窗模式。
185如果此值為 false,而使用者嘗試以多視窗模式啟動活動,該活動會佔滿整個螢幕。
186
187
188</p>
189
190<p>
191  您的應用程式如以 Android N 為目標,但您並未指定此屬性的值,屬性的預設值為 true。
192
193</p>
194
195<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
196
197<p>
198  在宣示說明的 <code>&lt;activity&gt;</code> 節點中,設定此屬性以指出活動是否支援子母畫面顯示:
199如果 <code>android:resizeableActivity</code> 為 false,則會忽略此屬性。
200
201</p>
202
203<pre>
204android:supportsPictureInPicture=["true" | "false"]
205</pre>
206
207<h3 id="layout">版面配置屬性</h3>
208
209<p>
210  使用 Android N,<code>&lt;layout&gt;</code> 宣示說明元素支援的數個屬性會影響多視窗模式中的活動行為。
211
212
213</p>
214
215<dl>
216  <dt>
217    <code>android:defaultWidth</code>
218  </dt>
219
220  <dd>
221    以自由形式模式啟動活動時的預設寬度。
222  </dd>
223
224  <dt>
225    <code>android:defaultHeight</code>
226  </dt>
227
228  <dd>
229    以自由形式模式啟動活動時的預設高度。
230  </dd>
231
232  <dt>
233    <code>android:gravity</code>
234  </dt>
235
236  <dd>
237    以自由形式模式啟動活動時的初始放置位置。請參閱
238    {@link android.view.Gravity} 參考資料以查看適當的值。
239  </dd>
240
241  <dt>
242    <code>android:minimalSize</code>
243  </dt>
244
245  <dd>
246    在分割畫面與自由形式模式中,活動的最小高度與最小寬度。
247如果使用者在分割畫面模式中移動分隔,而使活動小於指定的最小值,系統會將活動裁剪為使用者要求的大小。
248
249
250  </dd>
251</dl>
252
253<p>
254  例如,在自由形式模式中顯示活動時,下列程式碼顯示如何指定活動的預設大小與位置以及它的最小大小:
255
256
257</p>
258
259<pre>
260&lt;activity android:name=".MyActivity"&gt;
261    &lt;layout android:defaultHeight="500dp"
262          android:defaultWidth="600dp"
263          android:gravity="top|end"
264          android:minimalSize="450dp" /&gt;
265&lt;/activity&gt;
266</pre>
267
268<h2 id="running">在多視窗模式中執行應用程式</h2>
269
270<p>
271  Android N 提供的新功能支援在多視窗模式中執行應用程式。
272
273</p>
274
275<h3 id="disabled-features">可在多視窗模式中停用的功能</h3>
276
277<p>
278  當裝置處於多視窗模式時,有些功能無法用於會與其他活動或應用程式分享裝置螢幕的活動,因此會加以停用或忽略。
279
280這類功能包括:
281
282<ul>
283  <li>有些<a href="{@docRoot}training/system-ui/index.html">系統 UI</a>
284  自訂選項會停用。例如,不以全螢幕模式執行就無法隱藏狀態列的應用程式。
285
286  </li>
287
288  <li>系統會忽略對 <code><a href=
289  "{@docRoot}guide/topics/manifest/activity-element.html#screen"
290  >android:screenOrientation</a></code> 屬性的變更。
291  </li>
292</ul>
293
294<h3 id="change-notification">多視窗變更通知與查詢</h3>
295
296<p>
297  已將下列可支援多視窗顯示的新方法新增至 {@link android.app.Activity}
298  類別。如需每個方法的詳細資訊,請參閱
299  <a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK 參考資料</a>。
300</p>
301
302<dl>
303  <dt>
304    <code>Activity.inMultiWindow()</code>
305  </dt>
306
307  <dd>
308    呼叫即可知道活動是否處於多視窗模式。
309  </dd>
310
311  <dt>
312    <code>Activity.inPictureInPicture()</code>
313  </dt>
314
315  <dd>
316    呼叫即可知道活動是否處於子母畫面模式。
317
318    <p class="note">
319      <strong>注意:</strong>子母畫面模式為多視窗模式的特殊情況。
320如果 <code>myActivity.inPictureInPicture()</code>
321      傳回 true,那麼 <code>myActivity.inMultiWindow()</code> 也會傳回 true。
322
323    </p>
324  </dd>
325
326  <dt>
327    <code>Activity.onMultiWindowChanged()</code>
328  </dt>
329
330  <dd>
331    每當活動進入或離開多視窗模式,系統就會呼叫這個方法。
332如果活動正在進入多視窗模式,系統會將 true 的值傳遞給方法,若活動正要離開多視窗模式,則會傳遞 false。
333
334
335  </dd>
336
337  <dt>
338    <code>Activity.onPictureInPictureChanged()</code>
339  </dt>
340
341  <dd>
342    每當活動進入或離開子母畫面模式,系統就會呼叫這個方法。
343如果活動正在進入子母畫面模式,系統會將 true 的值傳遞給方法,若活動正要離開子母畫面模式,則會傳遞 false。
344
345
346  </dd>
347</dl>
348
349<p>
350  上述的每一個方法也都有 {@link android.app.Fragment} 版本,例如
351 <code>Fragment.inMultiWindow()</code>。
352</p>
353
354<h3 id="entering-pip">進入子母畫面模式</h3>
355
356<p>
357  呼叫新方法
358  <code>Activity.enterPictureInPicture()</code>,即可將活動放入子母畫面模式。如果裝置不支援子母畫面模式,這個方法就沒有作用。
359如需詳細資訊,請參閱<a href="picture-in-picture.html">子母畫面</a>文件。
360
361</p>
362
363<h3 id="launch">在多視窗模式中啟動新活動</h3>
364
365<p>
366  當您啟動新活動,可以提示系統應儘可能在目前活動的旁邊顯示新的活動。
367如要這樣做,請使用旗標
368  <code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>。
369傳遞此旗標會要求下列行為:
370
371</p>
372
373<ul>
374  <li>如果裝置處於分割畫面模式中,系統會嘗試在啟動新活動的活動旁邊建立該活動,讓兩個活動分享螢幕。
375
376系統不保證一定能這樣做,但會儘可能讓活動相鄰。
377
378  </li>
379
380  <li>如果裝置未處於分割畫面模式,這個旗標就沒有作用。
381  </li>
382</ul>
383
384<p>
385  如果裝置處於自由形式模式,而您正在啟動新的活動,您可以呼叫
386  <code>ActivityOptions.setLaunchBounds()</code>,指定新活動的尺寸與畫面位置。
387如果裝置未處於多視窗模式,這個方法就沒有作用。
388
389</p>
390
391<p class="note">
392  <strong>注意:</strong>如果您在工作堆疊內啟動活動,該活動就會取代畫面上的活動,繼承它的所有多視窗屬性。
393
394如果您想要在多視窗模式中,以個別的視窗啟動活動,您必須在新的工作堆疊中啟動該活動。
395
396</p>
397
398<h3 id="dnd">支援拖放功能</h3>
399
400<p>
401  使用者可以在兩個活動分享螢幕時,將一個活動中的資料<a href="{@docRoot}guide/topics/ui/drag-drop.html">拖放</a>到另一個活動。
402
403(之前,使用者只能在單一活動內拖放資料)。
404因此,若您的應用程式目前不支援拖曳功能,建議您將該功能新增至應用程式。
405
406</p>
407
408<p>
409  N Preview SDK 擴充 <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
410  套件,支援跨應用程式的拖放功能。如需下列類別與方法的詳細資訊,請參閱 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK 參考資料</a>。
411
412
413</p>
414
415<dl>
416  <dt>
417    <code>android.view.DropPermissions</code>
418  </dt>
419
420  <dd>
421    語彙基元物件負責指定權限,授予給放下接收者應用程式。
422
423  </dd>
424
425  <dt>
426    <code>View.startDragAndDrop()</code>
427  </dt>
428
429  <dd>
430    {@link android.view.View#startDrag View.startDrag()} 的新別名。傳遞新旗標
431    <code>View.DRAG_FLAG_GLOBAL</code>,就可以啟用跨活動的拖放功能。
432如果您需要將 URI 權限授予接收者活動,請視需要傳遞新旗標
433    <code>View.DRAG_FLAG_GLOBAL_URI_READ</code> 或
434    <code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>。
435
436  </dd>
437
438  <dt>
439    <code>View.cancelDragAndDrop()</code>
440  </dt>
441
442  <dd>
443    取消目前進行中的拖曳操作。只能由產生拖曳操作的應用程式呼叫。
444
445  </dd>
446
447  <dt>
448    <code>View.updateDragShadow()</code>
449  </dt>
450
451  <dd>
452    取代目前所進行拖曳操作的拖曳陰影。只能由產生拖曳操作的應用程式呼叫。
453
454  </dd>
455
456  <dt>
457    <code>Activity.requestDropPermissions()</code>
458  </dt>
459
460  <dd>
461    針對利用 {@link android.view.DragEvent} 中包含的 {@link
462    android.content.ClipData} 傳遞的內容 URI,要求權限。
463  </dd>
464</dl>
465
466<h2 id="testing">測試應用程式的多視窗支援</h2>
467
468<p>
469  不論您是否針對 Android N 更新您的應用程式,都應該確認應用程式在多視窗模式中的行為為何,以免使用者試圖在執行 Android N 的裝置上以多視窗模式啟動應用程式。
470
471
472</p>
473
474<h3 id="configuring">設定測試裝置</h3>
475
476<p>
477  如果您在裝置上安裝 Android N,即自動支援分割畫面模式。
478
479</p>
480
481<h3 id="test-non-n">應用程式若非以 N Preview SDK 建置</h3>
482
483<p>
484  若您並非以 N Preview SDK 建置應用程式,而且使用者會試圖在多視窗模式中使用該應用程式,除非應用程式宣告螢幕方向固定,否則系統會強制調整應用程式大小。
485
486
487</p>
488
489<p>
490  若您的應用程式並未宣告螢幕方向固定,您應該在執行 Android N 的裝置上啟動應用程式,並嘗試將應用程式放入分割畫面模式。
491
492確認強制調整應用程式大小時的使用者體驗可以接受。
493
494</p>
495
496<p>
497  若您的應用程式宣告螢幕方向固定,您應該嘗試將應用程式放入多視窗模式。
498確認您這樣做時,應用程式依然會處於全螢幕模式。
499
500</p>
501
502<h3 id="test-mw">若您支援多視窗模式</h3>
503
504<p>
505  如果您以 N Preview SDK 建置應用程式且未停用多視窗支援,請在分割畫面與自由形式模式下,確認下列行為:
506
507
508</p>
509
510<ul>
511  <li>以全螢幕模式啟動應用程式,然後長按 [總覽] 按鈕以切換到多視窗模式。
512確認應用程式可以正確切換。
513  </li>
514
515  <li>以多視窗模式直接啟動應用程式,並確認應用程式可以正確啟動。
516您可以按下 [總覽] 按鈕,然後長按應用程式的標題欄,再拖曳到螢幕上其中一個醒目提示的區域,即可以多視窗模式啟動應用程式。
517
518
519  </li>
520
521  <li>在分割畫面模式中拖曳分隔線調整應用程式的大小。
522  確認可以調整應用程式大小而不會當機,同時可以看見必要的 UI 元素。
523
524  </li>
525
526  <li>如果您已指定應用程式的最小尺寸,請嘗試將應用程式的大小調整到低於指定的尺寸。
527確認您無法將應用程式的大小調整到小於指定的最小值。
528
529  </li>
530
531  <li>經由所有測試確認應用程式的效能可以接受。例如,確認在調整應用程式大小之後,不會遲遲不更新 UI。
532
533
534  </li>
535</ul>
536
537<h4 id="test-checklist">測試檢查清單</h4>
538
539<p>
540  若要確認應用程式在多視窗模式中的效能,請嘗試下列操作。
541除非另外註明,否則您應該在分割畫面與多視窗模式中嘗試這些操作。
542
543</p>
544
545<ul>
546  <li>進入和離開多視窗模式。
547  </li>
548
549  <li>從您的應用程式切換到另一個應用程式,並確認當應用程式不在使用中但可看見時,能正常運作。
550例如,如果是播放影片的應用程式,請確認當使用者與另一個應用程式互動時,影片會持續播放。
551
552
553  </li>
554
555  <li>在分割畫面模式中,嘗試移動分隔列以加大和縮小應用程式。
556在並排與上下排列設定都要嘗試這些操作。
557確認應用程式不會當機,可以看見基本功能,而且不會花太長的時間完成調整大小操作。
558
559
560  </li>
561
562  <li>快速連續執行數次調整大小操作。確認應用程式不會因此當機或流失記憶體。
563如需檢查應用程式記憶體使用量的詳細資訊,請參閱<a href="{@docRoot}tools/debugging/debugging-memory.html">調查 RAM 使用狀況</a>。
564
565
566  </li>
567
568  <li>以數個不同的視窗設定正常使用您的應用程式,並確認應用程式都能正常運作。
569確認文字可以閱讀,而且 UI 元素不會太小而無法與之互動。
570
571  </li>
572</ul>
573
574<h3 id="test-disabled-mw">若已停用多視窗支援</h3>
575
576<p>
577  若您已設定
578  <code>android:resizableActivity="false"</code> 來停用多視窗支援,您應該在執行 Android N 的裝置上啟動應用程式,並嘗試將應用程式放入自由形式與分割畫面模式。
579
580確認您這樣做時,應用程式依然會處於全螢幕模式。
581
582</p>
583