Android應用:橫豎屏切換總結

来源:http://www.cnblogs.com/challengingtime/archive/2016/02/06/5184447.html
-Advertisement-
Play Games

首先,手機橫豎長度的懸殊差距,註定了app橫豎屏的表現的差異化。老實說,目前絕大多數android的App在產品設計之初都是在豎屏的基礎上進行設計的(也就是單手操作),並無專門地去考慮切換橫屏後的用戶體驗。這些App若是允許切換橫屏操作,而用戶的手機又設置了允許自動旋轉,那麼用戶在使用這些App的時...


      眨眼間,已經到了2016你年春節前,離上一篇博客的時間已經有6個月多,回想起這半年的種種,不得不說,學習和工作實在是太忙了,或許這就是程式員的真實寫照吧。

      寫博客之初,主要的目的還是為了把自己的學習痕跡記錄下來,寫的東西比較基礎,也不多,算是一種督促,希望能堅持地學習下去,因為學識不存在暴發戶,靠的是積累。如果對自己過去半年的學習給個評價,我還是比較滿意的,前期定下來的目標都基本都達到了。單憑這個,我就覺得今年的新年會是個好年。

      說完過去,那麼接著就是將來。因為現在的工作環境上外網不大方便,而且作為開發的主幹之一,還是比較忙的,可見用來擴展學習的時間也不會很多。所以,往後若有空更新博客,都是以記錄為主,記錄工作中遇到的一些問題的解決方法,無論是簡單還是困難的,無論是原創還是轉載。下麵是正題。

 

一、橫豎屏的應用

      首先,手機橫豎長度的懸殊差距,註定了app橫豎屏的表現的差異化。老實說,目前絕大多數android的App在產品設計之初都是在豎屏的基礎上進行設計的(也就是單手操作),並無專門地去考慮切換橫屏後的用戶體驗。這些App若是允許切換橫屏操作,而用戶的手機又設置了允許自動旋轉,那麼用戶在使用這些App的時候很可能會經常碰到橫屏的情況,結果不言而知,App給用戶的體驗就有了折扣。

      所以,碰到這種情況下,不妨根據設計時針對的屏幕模式,固定App的展示方向,正如很多手機游戲固定只能橫屏。

 

二、禁止APP內橫豎屏切換

      讓App禁止掉橫豎屏的切換,這就需要通過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現。

該android:screenOrientation屬性,他有以下幾個參數:
"unspecified":預設值,由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.
"landscape":橫屏顯示(寬比高要長)
"portrait":豎屏顯示(高比寬要長)
"user":用戶當前首選的方向
"behind":和該Activity下麵的那個Activity的方向一致(在Activity堆棧中的)
"sensor":有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了("unspecified"設置除外)。

比如下列設置
android:screenOrientation="portrait"
則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape",為橫屏顯示。

      上述修改也可以在Java代碼中通過類似如下代碼來設置

1 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

 

三、手動觸發APP的橫豎屏切換

      由上面描述可知,當android:screenOrientation為預設值"unspecified"或"sensor"等時,就會有系統根據設備 的旋轉情況來觸發橫豎屏的切換,那麼有沒有方法我們手動在程式中觸發橫豎屏的變換呢,顯然上面為我們提供的 setRequestedOrientation就是系統提供的一個入口,下麵我們給出一個按鍵的方式來觸發的案列:

 

 1 public class MainActivity extends Activity implements OnClickListener {
 2 
 3      private Button mBtnLandscape;
 4 
 5      private Button mBtnPortrait;    
 6 
 7      @Override
 8      protected void onCreate(Bundle savedInstanceState) {
 9 
10          super.onCreate(savedInstanceState);
11 
12          setContentView(R.layout.activity_main);
13 
14          mBtnLandscape = (Button) findViewById(R.id.but_landscape);
15 
16          mBtnPortrait = (Button) findViewById(R.id.but_portrait);
17 
18          mBtnLandscape.setOnClickListener(this);
19 
20          mBtnPortrait.setOnClickListener(this);
21 
22      }
23  
24      @Override
25      public void onClick(View v) {
26 
27                  if(v == mBtnLandscape){
28 
29                              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
30 
31                  }else{
32 
33                              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
34 
35                  }
36 
37      } 
38 
39      @Override
40      public void onConfigurationChanged(Configuration newConfig) {
41 
42          super.onConfigurationChanged(newConfig);
43 
44          String message=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE ? "屏幕設置為:橫屏" : "屏幕設置為:豎屏";
45 
46          Toast.makeText(this, message, Toast.LENGTH_LONG).show();
47 
48      }
49 }

      需要註意的是,手動調用時,無視AndroidManifest中關於screenOrientation的設置;另外上述代碼中的onConfigurationChanged要被調用到也是需要條件的,在這裡,只給代碼,不做討論,後面再給出一個相關的補充說明。

 

四、重啟Activity的橫豎屏切換

      在上面的案列中,預設狀態下,Activity每次橫豎屏切換(包括用setRequestedOrientation調用)都會重新調用一輪 onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,從而銷毀原來的Activity對象,創建新的Activity對象,這是因 為通常情況下軟體在橫豎屏之間切換,界面的高寬會發生轉換,從而可能會要求不同的佈局。具體的佈局切換可以通過如下兩種方法來實現:

      1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件名不變,比如main.xml。layout- land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式自己會調用Activity的 onCreate方法,從而根據當前橫豎屏情況自動載入響應的佈局。

      2)假如佈局資源是不一樣又不按照如上設置,則需要通過java代碼來判斷當前是橫屏還是豎屏然後來載入相應的xml佈局文件(比如mainP為豎屏 mainL為橫屏)。因為當屏幕變為橫屏的時候,系統會重新呼叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate 中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。



 1 @Override
 2 protected void onCreate(Bundle icicle) {
 3 
 4     super.onCreate(icicle);
 5 
 6     int mCurrentOrientation = getResources().getConfiguration().orientation;
 7 
 8     if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
 9 
10         // If current screen is portrait
11 
12         Log.i("info", "portrait"); // 豎屏
13 
14         setContentView(R.layout.mainP);
15 
16     } else if (mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
17 
18         // If current screen is landscape
19 
20         Log.i("info", "landscape"); // 橫屏
21 
22         setContentView(R.layout.mainL);
23 
24     }
25 
26     init();// 初始化,賦值等操作
27 
28     findViews();// 獲得控制項
29 
30     setListensers();// 設置控制項的各種監聽方法
31 
32 }

      上面只是對佈局切換做了描述,實際上由於重啟Activity在未加處理的情況下必然導致數據的丟失和重新獲取,這樣用戶體驗會非常差。為此就要在切換前對數據進行保存,切換重啟後對數據進行恢復,具體操作的步驟如下:

 

 1 // 重寫Activity.onRetainNonConfigurationInstance(),用戶橫豎屏切換前保存數據
 2 @Override
 3 public Object onRetainNonConfigurationInstance() {
 4 
 5     final MyDataObject data = collectMyLoadedData();
 6 
 7     return data;
 8 
 9 }
10 
11 // 在onCreate()函數中調用getLastNonConfigurationInstance(),獲取onRetainNonConfigurationInstance()保存的數據
12 @Override
13 public void onCreate(Bundle savedInstanceState) {
14 
15     super.onCreate(savedInstanceState);
16 
17     setContentView(R.layout.main);
18 
19     final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
20 
21     if (data == null) {
22         data = loadMyData();
23     }
24 }

 

五、非重啟Activity的橫豎屏切換

      雖然重啟Activity為我們提供了保存數據和讀取數據的方式,但是如此一來程式會顯得有些繁瑣,所以有時候程式員往往就不想讓Activity重 啟,Android也為我們提供瞭解決方案,就是通過onConfigurationChanged攔截橫豎屏變換,從而進行必要的重新佈局和切換操作。 操作步驟如下:

      首先,manifest中為相應的Activity設置android:configChanges屬性,從而讓Activity不延續上述的重建流程,具體如下:

Andorid 3.2以前的SDK可以使用如下配置
android:configChanges="orientation|keyboardHidden"

而Adnroid 3.2以後的SDK必須添加一個screenSize屬性,具體如下
android:configChanges="keyboardHidden|orientation|screenSize"
或者
android:configChanges="orientation|screenSize"

      其次,在Activity或View的onConfigurationChanged(Configuration newConfig)函數中獲取當前橫豎屏參數。至於其調用順序跟touch事件的傳遞順序相似,不過他沒有消費事件的概念,會順次調用到每一個 onConfigurationChanged函數。下麵是重寫Activity的例子:

 1 //佈局分別在layout-land和layout-port目錄中的同名main.xml時
 2 @Override
 3 
 4 public void onConfigurationChanged (Configuration newConfig){
 5 
 6     super.onConfigurationChanged(newConfig);
 7 
 8     setContentView(R.layout.main);
 9 
10     findViews();
11 
12     setListensers();
13 
14 }
15 
16 //佈局為不按照layout-land和layout-port目錄,而自定義名字時
17 @Override
18 public void onConfigurationChanged (Configuration newConfig){
19 
20     super.onConfigurationChanged(newConfig);
21 
22     int mCurrentOrientation = getResources().getConfiguration().orientation;
23 
24     if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
25 
26         // If current screen is portrait
27 
28         setContentView(R.layout.mainP);
29 
30         findViews();
31 
32         setListensers();
33 
34     } else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
35 
36         //If current screen is landscape
37 
38         setContentView(R.layout.mainL);
39 
40         findViews();
41 
42         setListensers();
43 
44     }
45 } 

      當然有時候連佈局都不用更改的話,就可以直接對原有控制項進行調用操作了,比如:

 

 1 public class MainActivity extends Activity {
 2 
 3     private TextView textView;
 4 
 5     @Override
 6     public void onCreate(Bundle savedInstanceState) {
 7 
 8         super.onCreate(savedInstanceState);
 9 
10         setContentView(R.layout.main);
11 
12         Log.i("--Main--", "onCreate");
13 
14         textView=(TextView)findViewById(R.id.tv_id);
15 
16     }      
17 
18     @Override
19     public void onConfigurationChanged(Configuration newConfig) {
20 
21         super.onConfigurationChanged(newConfig);
22 
23         Log.i("--Main--", "onConfigurationChanged");
24 
25         if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
26 
27             textView.setText("當前屏幕為橫屏");
28 
29         }else{
30 
31             textView.setText("當前屏幕為豎屏");
32 
33         }
34     }   
35 }

      需要註意的是,onConfigurationChanged函數中只能獲得橫豎屏切換後的參數,在該函數中獲取不到新的Layout和控制項的尺寸位置信息,如果要處理尺寸和位置信息,必須通過消息非同步或者延時調用,下麵是一個App在橫豎屏切換時需要重新設置popupWindow位置的代碼:



 1 @Override
 2 protected void onConfigurationChanged(Configuration newConfig) {
 3 
 4     super.onConfigurationChanged(newConfig);
 5 
 6     //View中不用創建Handler,可直接調用post操作
 7 
 8     //new Handler().postDelayed(new Runnable() {
 9 
10     //    @Override
11     //    public void run() {
12 
13     //        updatePopup();    
14 
15     //    }
16 
17     //}, 500); 
18 
19     postDelayed(new Runnable() {
20 
21         @Override
22         public void run() {
23 
24             updatePopup();      //
25 
26         }
27 
28     }, 500);//如果不在post中,而是直接調用,那麼彈出位置就會有問題
29 
30 }

      雖然上面沒有看到對佈局的顯式調用進行重新佈局,照理控制項的對象沒有被銷毀,但是控制項在橫豎屏切換時應該是需要進行重新layout和measure,然 後再進行重繪的,否則不會引發彈出框位置的變化,至於如何調用重新layout、measure和Draw操作,在這裡就不多展開了。

 

六、對於AndroidManifest.xml設置的補充

      經過上面代碼演示,我們可以看到具體實現涉及到了Manifest工程配置裡面具體Activity的screenOrientation和 configChanges兩個參數,這兩個參數screenOrientation的優先順序是高於configChanges,即假如 screenOrientation設置為固定橫豎屏時,那麼configChanges參數無論怎麼設都沒有辦法引發橫豎屏切換,除非在代碼中手動調用 setRequestedOrientation函數進行修改。

      screenOrientation屬性在前面已經講過了,而關於configChanges屬性設置有如下選項:

描述

mcc

IMSI移動台的國家代碼(MCC)發生變化——一個SIM被探測到並且更新MCC

mnc

IMSI移動台的網路代碼(MNC)發生變化——一個SIM被探測到並且更新MNC

locale

區域發生變化——用戶選擇了一個文本需要顯示的新語言

touchscreen

觸摸屏發生變化。(這個通常不會發生。)

keyboard

鍵盤類型發生變化——例如:用戶插入了外接鍵盤。

keyboardHidden

鍵盤的可訪問性發生變化——例如:用戶發現了硬體鍵盤。

navigation

導航類型(軌跡球或dpad)發生變化。(通常不會發生。)

screenLayout

屏幕佈局發生變化——這個會導致顯示不同的Activity。

fontScale

字體縮放因數發生變化——用戶選擇了新的字體大小。

uiMode

當UI模式發生改變的時候——當用戶放置設備到桌子或/汽車或夜間模式改變的時候可以引起UI模式變化。閱讀UiModeManager。在API級別8時引入。

orientation

屏幕方向發生變化——用戶旋轉了屏幕。註意:如果應用程式的目標API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion聲明),你也需要聲明配置項screenSize,因為這將在設備選擇肖像和屏幕方向時發生改變。

screenSize

當 前可用屏幕大小發生變化。這代表一個當前可用大小的變化,和當前的比率相關,因此當用戶選擇不同的畫面和圖像,會發生變化。然而,如果你的程式目標API 級別是12或更低,你的Activity總是會自己處理這個配置變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設備上)。在API級別13裡加入的。

smallestScreenSize

物 理屏幕大小的變化。不管方向的變化,僅僅在實際物理屏幕打包變化的時候,如:外接顯示器。這個配置項的變化引起在smallestWidth configuration里的變化。然而,如果你的程式目標API級別是12或更低,你的Activity將自己處理這個變化(這個變化不會引起 Activity的重啟,甚至在Android 3.2或更新的設備上)在API級別13裡加入的。

layoutDirection

佈局方向變化。例如書寫方式從左向右(LTR)轉換為從右向左(RTL)

      從上述這個表我們可以看到除了橫豎屏,包括語言、網路、鍵盤和外設等變化都可以被onConfigurationChanged函數監控到。

      結合網上的整理,小結跟這幾配置相關的情景:

      1)不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次(我 在三星4.0設備上發現切橫屏和豎屏都是執行一次,而並非這裡說的有執行兩次的情況,不知道是否以前版本手機會這樣?);

      2)設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次;

      3)設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。

      註:上述描述是在Android3.2以前,如果缺少了keyboardHidden選項,不能防止Activity的銷毀重啟,也就不能執行 onConfigurationChanged方法了。在3.2之後,必須加上screenSize屬性才可以屏蔽調用Activity的生命周期(我在 一些設備上親測可以不需要keyboardHidden,只要screenSize就可以了,但是保險起見還是繼續保留keyboardHidden 吧)。

 

七、對於setRequestedOrientation函數的補充說明

      在上述(二)對於手動觸發橫豎屏切換的時候,我們用到了setRequestedOrientation,那時只是簡單做了下演示,後來發現還是需要做下補充說明的:

      首先在非重啟Activity模式下:

      手動調用setRequestedOrientation之後,假如會引發橫豎屏切換(即請求的橫豎屏要求與當前的橫豎屏情況不一致,就會引發切換),那 麽會立即調用onConfigurationChanged函數;假如不會引發橫豎屏切換(請求前後一致),那麼也就不會調用到 onConfigurationChanged函數。

      這個手動調用setRequestedOrientation的地方也可以在Activity中的任何地方,即也可以在 onConfigurationChanged中調用,但是一旦指定為橫屏或豎屏完成這個變換之後,後面不論屏幕如何進行怎麼翻轉變化,都不會再觸發橫豎 屏切換了,也即等同於在manifest中設置了android:screenOrientation屬性為橫屏或豎屏。如果要恢復為響應橫豎屏隨物理傳 感器設備變換,那麼就需要手動調用類似如下代碼進行恢復:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

      其次在重啟Activity模式下:

      手動調用setRequestedOrientation發出橫豎屏設定請求之後,假如需要進行橫豎屏切換(即請求前後橫豎屏狀態不一致),則會對Activity進行銷毀並重啟;假如不需要需要進行橫豎屏切換,則Activity維持現狀不變;

      手動調用setRequestedOrientation一次,完成變換之後,也跟上面非重啟一樣,相當於在manifest中設置了android:screenOrientation屬性為橫屏或豎屏。要想恢復也需要重新調用類似上面非重啟的調用。

      下麵一個例子:

      讓App啟動的時候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然後手機切換橫豎屏就不能用了該怎麼解決呢?利用上述原理,就可以解決。

 

 

參考博客地址:http://www.cnblogs.com/franksunny/p/3714442.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在文件之後 比較合適出現的 就是 關於 流的操作了。 猜想關於數據的寫入和寫出操作,本質上是01形式的二進位數,而這些數據的排列方式是不能亂套的。他們是一個有序的整體,這隊長長的用於表示一些內容的東西就稱作流了。在這裡面用Stream 來標識。 java.io 包中定義了多個流類,用來實現輸入/輸出
  • 明天就是大年三十了,今天在家有空,想集中整理一下CQRS架構的特點以及相比傳統架構的優缺點分析。先提前祝大家猴年新春快樂、萬事如意、身體健康! 最近幾年,在DDD的領域,我們經常會看到CQRS架構的概念。我個人也寫了一個ENode框架,專門用來實現這個架構。CQRS架構本身的思想其實非常簡單,就是讀
  • 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/nullzx/ 1. ThreadPoolExecutor數據成員Private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING,0))...
  • 字元串原始值修改不了1 var str = "abc"; 2 str[0] = "d"; 3 console.log(str[1]="f"); >>f 4 console.log(str[0]); >>a 5 console.log(str); >>abc提試:字元串是可以通過[]的形式訪問的。 /
  • 本模板為自適應寬度模板,可相容PC,手機等多種環境,適應不同屏幕大小寬度。預覽圖片:進入下載頁:http://hovertree.com/h/bjaf/bnbpkr9p.htm效果預覽http://hovertree.com/texiao/muban/1/ 轉自:http://hovertree.c
  • webpack入門
  • 1.JQuery簡介: JQuery是用js寫的JavaScript庫,是為了簡化js對HTML元素的操作、實現動畫效果並方便為網站提供ajax交互; 2.ready()方法: ready()方法和js的windown.onload()方法類似,都是當頁面的文檔載入完畢後調用該方法;不同的是read
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 功能描述:用戶單擊按鈕彈出菜單。當用戶選擇一個菜單項,會觸發MenuItemClick事件並讓彈出的菜單消失;如果用戶在菜單外單擊,則直接消失彈出的菜單。當菜單消失時,會引發DismissEvent事件(利用此事件...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...