官术网_书友最值得收藏!

2.4 屏幕切換

在一般情況下,Android的每一個屏幕基本上是一個活動(Activity),屏幕之間的切換實際上就是在活動間互相調用的過程,在程序中通過使用Intent完成屏幕跳轉的動作。

Android屏幕跳轉的關系和方式如圖2-8所示。

圖2-8 屏幕跳轉的關系和方式

從程序的角度,屏幕之間“切換”的過程實際上是一個屏幕啟動了另外一個屏幕。從一個Activity啟動另外一個Activity的結果是“跳轉”,也就是“屏幕的切換”。在Android中有如下兩種類型的跳轉。

startActivity():簡單啟動一個屏幕;

startActivityForResult():以帶有返回結果的方式啟動一個屏幕。

另外一個方面,如果A屏幕(活動)啟動B屏幕之后,自己退出,那么這將是一個沒有返回的跳轉;如果A屏幕啟動B之后,自己沒有退出,那么B退出的時候可能又返回到A,這就是一個可返回的跳轉。顯然,只有在啟動者沒有退出的情況下,才有返回結果接收的問題。

2.4.1 啟動活動的方法

Activity等類繼承自Context,Context中的startActivity()方法用于啟動一個簡單的活動,如下所示:

        public void startActivity (Intent intent)

Intent用于傳遞兩個屏幕之間的信息,實現屏幕的跳轉功能。調用者可以通過Intent傳遞參數,也可以獲得跳轉對象的返回信息。Android中的各個屏幕一般是對等的,具有啟動關系的兩個屏幕沒有運行時的依賴關系。

本示例是一個簡單的屏幕之間的跳轉,從一個屏幕跳轉到另一個屏幕,在啟動第二個屏幕后,前一個屏幕消失。

示例程序:Forward(ApiDemo=>App=>Activity=>Forward)

源代碼:

              com/example/android/apis/app/Forward.java
              com/example/android/apis/app/ForwardTarget.java

本示例包含了兩個活動,在UI上它們就是兩個屏幕,分別為跳轉的源和目的,它們在AndroidManifest.xml中的定義如下所示。

        <activity android:name=".app.Forwarding"
                  android:label="@string/activity_forward ding">
            <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>
        </activity>
        <activity android:name=".app.ForwardTarget">  </activity>

兩個活動的名稱分別為Forwarding和ForwardTarget,由于第二個活動沒有intent-filter,因此在程序中只能由第一個活動來啟動。

Forwarding程序的運行結果如圖2-9所示。

圖2-9 活動的跳轉程序運行結果(左Forward;右ForwardTarget)

在第一個活動(Forwarding)啟動后,單擊“Go”按鈕跳轉到第二個活動(ForwardTarget)。第二個活動退出后,不會返回到第一個活動。

跳轉的核心內容在Java源文件Forward.java的以下片段中處理:

        public void onClick(View v)
        {
            Intent intent = new Intent();                          // 建立Intent
            intent.setClass(Forwarding.this, ForwardTarget.class);//在Intent中設置活動目標
            startActivity(intent);
            finish();                                               // 結束當前活動
        }

啟動第二個活動需要使用Intent,在其setClass()方法中設置源和返回的內容,Intent是android.content包中的類,用于啟動活動、服務或者消息接收器。

這里使用的Intent的setClass()方法的原型如下所示:

        Intent  setClass(Context packageContext, Class<?> cls)

第一個參數是當前的上下文類型Context,因此把當前的活動設置過去即可(Activity本身繼承了Context),第二個參數是Intent所包含的Java類,直接設置ForwardTarget.class類即可。

本例中使用了finish()方法表示當前的活動結束,這樣在第二個活動(ForwardTarget)啟動時,第一個活動(Forward)已經不存在了。如果沒有調用finish()方法,第二個活動啟動時,第一個活動就會進入停止狀態,onPause()和onStop()方法將被接連調用。當第二個活動退出后,第一個活動重新出現,也就是會調用其中的onStart()和onResume()方法。

2.4.2 帶有返回結果的啟動活動

在某些時候,從跳轉的對象返回時,跳轉源屏幕需要得到其返回的結果,這樣兩個屏幕可實現一些交互的效果。

Activity中的以下幾個方法運動啟動帶有返回結果的跳轉,如下所示:

        public void startActivityForResult (Intent intent, int requestCode)
        public void  finishActivity(int requestCode)
        protected void onActivityResult (int requestCode, int resultCode, Intent data)

startActivityForResult()可以取得返回結果的活動啟動方法;finishActivity()用于結束一個使用startActivityForResult()啟動的活動;onActivityResult()用于接收被啟動的Activity返回的結果。

提示:上述幾個方法只能在Activity中使用,啟動者和被啟動者之間有所關聯。

一個被以startActivityForResult()方式啟動的活動,可以使用setResut()方法設置內容給其啟動者:

        public void setResut(int resultCode, Intent intent)

按照這種模式,在Activity的啟動者和被啟動者之間,進行傳遞的數據有如下4個。

啟動Intent:由啟動者傳遞給被啟動者,含義和沒有返回結果的啟動相同;

請求碼(int類型):由啟動者傳遞給自己;

返回碼(int類型):由被啟動者傳遞給啟動者;

返回數據(Intent類型):由被啟動者傳遞給啟動者。

后三個也就是啟動者的onActivityResult()中所接收的三個參數,其中返回碼有以下的Activity類的幾個默認數值:

        public static final int RESULT_OK           // -1
        public static final int RESULT_FIRST_USER   // 0
        public static final int RESULT_CANCELED    // 1

以下程序用于一個帶有返回結果的活動。

參考示例程序:ReceiveResult(ApiDemo => App=>Activity=>ReceiveResult)

源代碼:

              com/example/android/apis/app/ReceiveResult.java
              com/example/android/apis/app/SendResult.java

ReceiveResult程序的運行結果如圖2-10所示。

圖2-10 帶有返回結果的跳轉運行結果(左:ReceiveResult;中:SendResult;右:ReceiveResult)

初始化界面如圖2-10中左圖所示,單擊“Get Result”按鈕將跳轉到第二個屏幕,如圖2-10中的中圖所示;在第二個屏幕中單擊“Corky”和“Violet”按鈕將返回第一個屏幕,如圖2-10中的右圖所示。右圖中顯示的也就是返回結果的內容。

Java源文件ReceiveResult.java的代碼片段如下所示:

        static final private int GET_CODE = 0;
            private OnClickListener mGetListener = new OnClickListener() {
              public void onClick(View v) {
                    Intent intent = new Intent(ReceiveResult.this, SendResult.class);
                    startActivityForResult (intent, GET_CODE); // 帶有返回結果的跳轉
            }
        };

這里調用的是startActivityForResult()方法,設置一個GET_CODE為請求代碼,這樣可以獲得目標活動的返回信息。這個方法的原型為:

        public void startActivityForResult (Intent intent, int requestCode)

被跳轉的目標Java源文件SendResult.java的代碼片段如下所示:

        private OnClickListener mCorkyListener = new OnClickListener()
        {
            public void onClick(View v)
            {
              setResult(RESULT_OK,(new Intent()).setAction("Corky!"));// 設置返回結果
              finish();                     // 結束SendResult
            }
        };
        private OnClickListener mVioletListener = new OnClickListener()
        {
            public void onClick(View v)
            {
              setResult(RESULT_OK,(new Intent()).setAction("Violet!"));// 設置返回結果
              finish();                // 結束SendResult
            }
        };

被跳轉的目標程序將返回值返回,這里使用的依然是Intent作為交互的信息,通過setAction()設置不同的活動。

由于被跳轉的目標程序是被顯示Intent調用起來的,因此,返回后繼續由ReceiveResult.java對返回值進行處理。返回的信息通過重新實現Activity的onActivityResult()方法來實現,兩個整數類型的參數requestCode和resultCode分別代表請求代碼和結果碼,第三個參數Intent(類型data)表示活動間交互附加的數據信息。

        @Override
        protected void onActivityResult(int requestCode,
                                          int resultCode, Intent data) {
            if (requestCode == GET_CODE) {
              Editable text = (Editable)mResults.getText();
              if (resultCode == RESULT_CANCELED) {      // 處理程序使用回退按鍵返回的情況
                  text.append("(cancelled)");
              } else {                                    // 處理程序使用setResut()返回的情況
                  text.append("(okay ");
                  text.append(Integer.toString(resultCode));
                  text.append(") ");
                  if (data != null) {
                      text.append(data.getAction());      // 將設置返回數據的動作
                  }
              }
              text.append("\n");
            }
        }

這里onActivityResult()是一個被繼承的方法,其參數data就是這個活動接收到的返回結果,data.getAction()可以從返回的Intent中取回內容。

參數requestCode對應于調用startActivityForResult()的時候啟動活動時指定的申請碼。其作用在于,一個活動啟動了多個活動的時候,根據這個requestCode可以區分是哪一個活動返回了。參數resultCode比較特殊,當把啟動的程序自己返回的時候,這個數值可以由被啟動的程序設置。如果被啟動的程序被使用回退按鍵返回,那么這個數值將為RESULT_CANCELED(0)。

對于resultCode,雖然其類型是整型,但是由于它有幾個默認值(Activity類中定義的-1,0,1)用于處理特殊情況,因此,如果用其表示自定義的結果,它只能表示枚舉類型,不足以表示整數類型的數據(會和特殊情況有沖突)。更多的返回結果,應該通過Intent來表示。

主站蜘蛛池模板: 滨州市| 普安县| 固安县| 普宁市| 定远县| 开江县| 东辽县| 枣阳市| 垣曲县| 集贤县| 沙坪坝区| 龙岩市| 渝中区| 泾阳县| 昌邑市| 台东县| 双辽市| 宁城县| 克东县| 龙井市| 北票市| 农安县| 辛集市| 涞水县| 贵南县| 桓仁| 马尔康县| 荔波县| 隆回县| 体育| 织金县| 弋阳县| 广灵县| 南充市| 通许县| 镇安县| 贺州市| 遂昌县| 甘肃省| 营口市| 武鸣县|