1. 程式人生 > >Android開發之Activity的建立跳轉及傳值

Android開發之Activity的建立跳轉及傳值

在Android系統的江湖中有四大元件:活動(Activity), 服務(Service), 廣播接收器(Broadcast Reciver)和內容提供者(Content Provider)。今天所介紹的就是Android開發中的四大元件之一:Activity,其他那三大元件以後再進行介紹。說道Android中的Activity,如果你做過iOS開發的話,Activity類似於iOS中的ViewController(檢視控制器)。在應用中能看到的東西都是放在活動中的。活動是安卓開發比較重要的東西,是使用者互動和資料的入口。本篇部落格要介紹的內容是活動的建立,活動的跳轉與值的透傳。

iOS中的ViewController也是有自己的生命週期的,瞭解Activity或者ViewController的生命週期是很有必要的,這要你才能搞明白在什麼時間做什麼事情,關於iOS開發的東西請詳看之前的部落格:《我的iOS開發系列博文》和《我的Objective-C系列文章》。好廢話少說,Activity將要登場。

使用Android Studio建立一個Android的Add New Activity工程(步驟略,詳見上篇部落格),在這個工程中預設會有一個Blank Activity,而且在Blank Activity中自動添加了一個Text View, 上面寫著"Hello World", 執行這個工程就會看到Hello World在一個白色的活動中。

我們把這個工程中建立的一個新的Activity,然後再有Hello World中新增一個按鈕,點選按鈕跳轉到我們建立的新的Activity中。在新的按鈕中點選Back返回到上一個Activity中。

一、Activity的建立與元件新增 

1.建立一個Blank Activity

在Android Studio的檔案資源目錄中,選中你要建立Activity的包,右鍵單擊->New -> Activity ->各種Activity, 在這兒我們選擇Blank Activity,點選即可,操作如下圖所示。

點選完後出現下面的對話方塊來新建一個Activity,也就是我們自定義的Activity。Activity Name: 活動的名字,Layout Name: 活動對應佈局檔案的名字,Titile: 上面導航條顯示的名字。Menu Resource Name: 選單的xml配置檔案的名稱(稍後會詳細介紹),點選Finishi即可。

活動建立後會在資源目錄中生成三個檔案,如下圖所示,java中的SecondActivity檔案有前面的"C"標誌可知,是Java的Class檔案,也就是Activity對應的原始檔。而Layout檔案中的activity_second.xml是Activity對應的佈局檔案,在佈局檔案中你可以指定給Activity新增那些控制元件,並且可以控制這些控制元件的樣式和位置。第三個就是menu下的menu_second.xml檔案,該檔案是定義導航中的下拉選單內容的,稍後給大家演示。

2. 控制元件新增

往Activity中新增控制元件就需要操作我們的Layout資料夾下Activity所對應的xml檔案了。接下來要做的事情是在MainActivity中的佈局檔案中新增一個按鈕,然後在程式碼中獲取一個按鈕,並且監聽按鈕的點選事件,按鈕點選事件觸發後彈出一個提示框。詳細的看一下如何去新增控制元件並監聽控制元件的事件。

(1) 新增按鈕

開啟activity_main.xml佈局檔案, 切換到Design模式下,在Design模式下你可以以拖拽的方式來建立控制元件,以及定位控制元件。下方是添加了一個Button, 並且Button上的Text為ShowToast(Toast是安卓中顯示資訊用的元件)。

你也可以切換到Text模式下去看xml的文字,下面的大框中就是我們剛才拖拽出來的Button所對應的xml的內容,其中包括與佈局有關的資訊:控制元件的寬高,上下左右的邊距等,還有控制元件的一些屬性:控制元件獨有的id以及控制元件顯示的文字(Text)等。當然如果對xml佈局的屬性較為了解,就可以使用純程式碼去宣告和佈局你的控制元件。

(2)在程式碼中獲取控制元件

經過上面的步驟,已經宣告並配置好了一個button。如果想再程式碼中進行控制元件的使用,首先得通過上面button的id來例項化控制元件。下面的程式碼是在MainActivity檔案中的onCreat()方法中新增的,關於onCreate方法,稍後的Activity的生命週期會詳細的介紹到。在Java原始碼中可以通過findViewById來例項化Layout佈局檔案中指定的控制元件。上面button的id為“myFirstButton”,所以例項化該button的方法如下:

 //獲取介面上的按鈕
        Button myFirstButton = (Button) findViewById(R.id.myFirstButton);

例項化Button後我們需要監聽按鈕的點選事件,下面使用的監聽方式類似iOS中的Block回撥。就是給button賦一個點選按鈕執行的方法。點選按鈕就會執行下方的回撥方法,並且可以通過Toast進行內容提示。

1  //按鈕點選的回撥
2         myFirstButton.setOnClickListener(new View.OnClickListener() {
3             @Override
4             public void onClick(View v) {
5                 Toast.makeText(MainActivity.this, "點選MyFirstButton", Toast.LENGTH_LONG).show();
6             }
7         });

經過上面的步驟,點選ShowToast按鈕就會提示“點選MyFirstButton”的內容,下方是執行的結果截圖:

二、Activity間的跳轉與傳值

在上面我們建立了一個名為SecondActivity的Blank Activity一直沒有,從上面的執行效果可以看出在MainActivity中有一個Go Second Activity的Button, 她就是用來跳轉到SecondActivity的,不同Activity見跳轉可以傳值,也可以在返回的時候返回值,接下來就介紹Activity間的跳轉和傳值問題。

1. 使用Intent進行Activity的跳轉

Intent在Android開發中被譽為“意圖”,從字面意思不難理解,就是“你打算去哪”。Intent與iOS開發中的NavigationController(導航控制器)極為相似,不過又有所不同。NavigationController是一個“棧”形式的容器,控制器可以通過push或者pop操作進行"入棧"和"出棧",這個入棧和出棧的操作也就是檢視控制器進行切換的操作。Intent實現原理也是一樣的,也有一個棧,這個棧中儲存的內容是一個個的Activity,Activity的Start和Finish操作對應著棧的Push和Pop操作。

(1)在"Go Second Activity" button的單擊事件中新增跳轉程式碼,跳轉到SecondActiviy,程式碼如下, 下方程式碼是放在onCreate方法中。在下方使用的Intent類的構造器中,第一個引數是當前Activity,第二個引數是將要跳轉的Activity。通過startActivity方法來啟動Intent, 與其說是啟動Intent, 倒不如說事把當前Activity如棧,把將要顯示的Activity放入棧頂。

 Button goSecondActivityButton = (Button) findViewById(R.id.go_sceond_button);
        goSecondActivityButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //新建一個Intent(當前Activity, SecondActivity)=====顯示Intent
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);

                //啟動Intent
                startActivity(intent);
            }
        });

(2) 如果MainActivity中的值要傳給要跳轉過去的SecondActivity,那麼就可以通過Intent的物件中的putExtra方法來進行傳值。在上面的程式碼startActivity()方法的上方加上下面這段程式碼就是給目標Activity傳值。data是一個String型別的變數,其中存的值是要傳給將要跳轉的Activity的。物件intent通過呼叫putExtra來進行傳值,第一個引數是值得名字,也就是值的key, 在下個Activity中通過這個key來獲取對應的value。

1                 //傳值給下一個Activity
2                 String data = "我是上一個Activity中傳過來的值";
3 
4                 intent.putExtra("extra_data", data);

(3) 在新的Activity中我們需要獲取傳過來的值顯示在TextView上,並且點選一個Back按鈕返回到上一層Activity,具體程式碼如下。這些程式碼是放在第二個Activity的onCreate()方法中的。可以通過getIntent獲取是通過那個Intent跳轉的,換句話說事獲取當前的導航棧。獲取Intent物件後,通過getStringExtra()方法傳入一個相應的鍵,通過這個鍵來獲取值。因為我們傳入的值是String型別的所以用getStringExtra(), 不同型別的值對應著不同的方法。然後把獲取的值顯示在TextView上。之後點選Button返回。 Button中的finish()方法是結束當前Activity,就會自動返回上一個Activity。TextView和Button也是通過拖拽的方式來獲取的,然後通過id進行事件的處理和賦值。

 1         //獲取上一個Activity傳過來的值
 2         Intent intent = getIntent();
 3         String data = intent.getStringExtra("extra_data");
 4         
 5         //將獲取的值顯示在TextView上
 6         TextView dataTextView = (TextView) findViewById(R.id.data_text_view);
 7         dataTextView.setText(data);
 8 
 9         //點選Button返回上一個Activity
10         Button backButton = (Button) findViewById(R.id.bank_button);
11         backButton.setOnClickListener(new View.OnClickListener() {
12             @Override
13             public void onClick(View v) {
14                 finish();
15             }
16         });

經過上面的步驟,最終執行效果如下,點選MainActivity中的Go Second Activity按鈕就會跳轉到第二個Activity,並且把第一個頁面中傳的值會在第二個Activity中進行顯示。點選SecondActivity中的Back按鈕就會執行finish()方法返回上一個Activity。

2. 使用Intent開啟系統功能

你可以以協議的方式開啟系統的某些功能,比如開啟系統的瀏覽器,系統的撥號鍵盤等。在iOS也是這樣,不過是通過Application物件開啟某些協議如tel://撥號協議等來呼叫系統功能。在安卓系統中也可以通過Intent物件來做這些操作。

(1)呼叫瀏覽器開啟連結的程式碼如下,下方程式碼是呼叫瀏覽器開啟連結。ACTION_VIEW是比較智慧的,他會通過使用者傳入的資料來開啟相應的應用,下方是通過setData傳入的網址,所以就會呼叫瀏覽器,如果傳入的時tel:10010, 就會呼叫撥號盤。

 Button openBaiduButton = (Button) findViewById(R.id.open_baidu_button);
        openBaiduButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //呼叫本地瀏覽器開啟網址
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

(2)呼叫撥號盤你可以通過上面的方式改變一下傳入的資料即可,但是你還可以通過Intent.ACTION_DIAL也是可以呼叫撥號盤的,具體程式碼如下所示:

1         Button telPhoneButton = (Button) findViewById(R.id.tel_number);
2         telPhoneButton.setOnClickListener(new View.OnClickListener() {
3             @Override
4             public void onClick(View v) {
5                 Intent intent = new Intent(Intent.ACTION_DIAL);
6                 intent.setData(Uri.parse("tel:10010"));
7                 startActivity(intent);
8             }
9         });

點選上方兩個按鈕第一個會通過瀏覽器開啟網址,第二個會開啟撥號盤,執行效果如下所示。

3.從返回中的Activity中獲取值

從上面的例項中可知,我們可以把值從一個Activity中傳入到下一個Activity中。接下來要做的事情剛好相反,是從返回的頁面中獲取值。這種傳值也是通過Intent來做的。我們在MainAcvitiy中新增一個按鈕“Go Third Activity”,點選按鈕跳轉到第三個Activity中,然後返回獲取第三個Activity中傳過來的值。

(1)跳轉時通過startActivityForResult()方法來進行值得回傳,第一個引數就是intent物件,第二個引數是requestCode(請求碼)。requestCode在返回後的回撥方法中會使用到。

  Button goThiredActivityButton = (Button) findViewById(R.id.go_third_button);
        goThiredActivityButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //從下一個Activity中獲取資料
                Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
                startActivityForResult(intent, 1);
            }
        });

(2)在ThirdActivity中要做的事情就是通過Intent返回值,具體程式碼如下所示,返回值也是通過Intent物件的putExtra方法,然後去執行setReault方法即可。setResult()方法的第一個引數是resultCode(結果碼),也是在上一個Activity中接收值的回撥中使用。

 Button backButton = (Button) findViewById(R.id.third_back_button);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = getIntent();
                intent.putExtra("data_return", "我是第三個Activity中返回的資料");
                setResult(RESULT_OK, intent);
                finish();
            }
        });

(3)接著就得在MainActivity中去重寫處理返回值的回撥方法了,也就是onActivityResult回撥方法。在方法中通過key來獲取傳過來的值,並把值賦值給MainActivity中的TextView具體程式碼如下:

 1     @Override
 2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3         switch (requestCode) {
 4             case 1:
 5                 if (resultCode == RESULT_OK) {
 6                     String returnedData = data.getStringExtra("data_return");
 7 
 8                     TextView returnedDataTextView = (TextView) findViewById(R.id.return_textview);
 9                     returnedDataTextView.setText(returnedData);
10                 }
11                 break;
12         }
13     }

經過上面的步驟,執行效果如下,點選Go Third Activity會跳轉到ThirdActivity中,然後從ThirdActivity中點選Back按鈕進行返回就會在上一個Activity中的TextView上顯示ThirdActivity中返回的值,具體效果如下所示。

Android開發技術交流qq群;701740775