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

2.4 屏幕切換

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

Android屏幕跳轉(zhuǎn)的關(guān)系和方式如圖2-8所示。

圖2-8 屏幕跳轉(zhuǎn)的關(guān)系和方式

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

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

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

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

2.4.1 啟動活動的方法

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

        public void startActivity (Intent intent)

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

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

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

源代碼:

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

本示例包含了兩個活動,在UI上它們就是兩個屏幕,分別為跳轉(zhuǎn)的源和目的,它們在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程序的運行結(jié)果如圖2-9所示。

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

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

跳轉(zhuǎn)的核心內(nèi)容在Java源文件Forward.java的以下片段中處理:

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

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

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

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

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

本例中使用了finish()方法表示當前的活動結(jié)束,這樣在第二個活動(ForwardTarget)啟動時,第一個活動(Forward)已經(jīng)不存在了。如果沒有調(diào)用finish()方法,第二個活動啟動時,第一個活動就會進入停止狀態(tài),onPause()和onStop()方法將被接連調(diào)用。當?shù)诙€活動退出后,第一個活動重新出現(xiàn),也就是會調(diào)用其中的onStart()和onResume()方法。

2.4.2 帶有返回結(jié)果的啟動活動

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

Activity中的以下幾個方法運動啟動帶有返回結(jié)果的跳轉(zhuǎn),如下所示:

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

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

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

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

        public void setResut(int resultCode, Intent intent)

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

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

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

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

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

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

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

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

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

源代碼:

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

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

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

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

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); // 帶有返回結(jié)果的跳轉(zhuǎn)
            }
        };

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

        public void startActivityForResult (Intent intent, int requestCode)

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

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

被跳轉(zhuǎn)的目標程序?qū)⒎祷刂捣祷兀@里使用的依然是Intent作為交互的信息,通過setAction()設(shè)置不同的活動。

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

        @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());      // 將設(shè)置返回數(shù)據(jù)的動作
                  }
              }
              text.append("\n");
            }
        }

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

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

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

主站蜘蛛池模板: 磐石市| 大宁县| 内黄县| 双鸭山市| 五原县| 滁州市| 丽江市| 吉木乃县| 沈丘县| 中江县| 思茅市| 富宁县| 昌宁县| 元阳县| 江津市| 安福县| 邵武市| 达拉特旗| 崇明县| 博湖县| 阿勒泰市| 阿拉尔市| 刚察县| 玛沁县| 江油市| 株洲市| 奉贤区| 余庆县| 运城市| 潼关县| 黎川县| 托里县| 泌阳县| 昌吉市| 苏州市| 噶尔县| 大丰市| 石门县| 阿坝| 洞口县| 芷江|