1. 程式人生 > >Android 元件系列-----Activity的傳值和回傳值

Android 元件系列-----Activity的傳值和回傳值

在這篇隨筆裡將講解Activity的傳值和回傳值。

一、通過startActivity來進行Activity的傳值

在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來傳入一個Intent物件,這個Intent物件我們可以精確的指定我們需要跳轉的Activity上,或者通過Intent物件來指定我們要完成的一個action操作。

①.通過setClass方法來指定我們要跳轉的Activity

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);

②.通過setAction方法來我們要完成的一個action操作

Intent  intent = new Intent();
intent.setAction("com.xiaoluo.android_intent.second");

通過這種方式可以來指定我們的Intent物件要完成某個操作,這個操作可以是啟動一個Activity,我們可以在AndroidManifest.xml中在 <Activity> 元素下指定一個 <intent-filter> 物件,然後其子元素宣告一個 <action> 元素,這樣我們可以將這個action動作繫結到了這個Activity上,即Android作業系統會去找與intent物件中指定的action名字的 <intent-filter>物件,然後執行相應的動作,例如:

複製程式碼

     <activity 
            android:name="com.xiaoluo.android_intent.SecondActivity"
            android:label="SecondActivity">
            <intent-filter>
                <action android:name="com.xiaoluo.android_intent.second"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

複製程式碼

這樣我們的Intent物件,在啟動時,就會找到名字為 com.xiaoluo.android_intent.second 的<intent-filter>物件,來啟動我們的SecondActivity。

我們來看看如何在Activity物件中進行值的傳遞,也是通過 Intent 物件的各種putExtra方法來進行傳遞:

MainActivity:

複製程式碼

public class MainActivity extends Activity
{
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new ButtonListener());
    }

    class ButtonListener implements OnClickListener
    {
        @Override
        public void onClick(View v)
        {
//            Intent intent = new Intent();
//            intent.setClass(MainActivity.this, SecondActivity.class);
            Intent  intent = new Intent();
            intent.setAction("com.xiaoluo.android_intent.second");
            
            intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一個引數指定name,android規範是以包名+變數名來命名,後面是各種型別的資料型別
            intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");
            
            Bundle bundle = new Bundle();  //  Bundle的底層是一個HashMap<String, Object
            bundle.putString("hello", "world");
            intent.putExtra("bundle", bundle);
            
            startActivity(intent);
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

複製程式碼

SecondActivity:

複製程式碼

public class SecondActivity extends Activity
{
    private TextView textView;
    private final String TAG = "SecondActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        textView = (TextView)findViewById(R.id.textView);
        
        //    得到跳轉到該Activity的Intent物件
        Intent intent = getIntent();
        
        int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);
        String name = intent.getStringExtra("com.xiaoluo.android_intent.name");
        Bundle bundle = intent.getBundleExtra("bundle");
        String world = bundle.getString("hello");
        
        Log.i(TAG, age + ", " + name + ", " + world);
         
        textView.setText(name + " : " + age + ", " + world);
        
        System.out.println(intent);
    }
}

複製程式碼

在第二個Activity物件中,可以通過 getIntent() 方法來得到跳轉到這個Activity的Intent物件,然後通過 Intent 物件的各種 getXXExtra 方法來得到我們的傳過來的值。

AndroidManifest.xml檔案如下:

複製程式碼

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaoluo.android_intent"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xiaoluo.android_intent.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity 
            android:name="com.xiaoluo.android_intent.SecondActivity"
            android:label="SecondActivity">
            <intent-filter>
                <action android:name="com.xiaoluo.android_intent.second"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

複製程式碼

這樣我們就可以實現Activity直接的值的傳遞。

二、通過startActivityForResult方法來得到Activity的回傳值

在一些情況下,我們通過 A activity跳轉到 B activity上,這時希望 A activtiy能從 B activity上得到一些返回值,這個時候我們就不能使用startActivity方法了,而是使用 startActivityForResult方法來完成我們的操作。

例如,我們希望完成下面一個功能,在MainActivity上,寫上一個算術表示式,然後跳轉到到第二個SecondActivity上,在這個Activity上將第一個Activity的表示式顯示出來,然後我們可以輸入我們的算術表示式結果,然後點選按鈕,將這個結果值又返回給我們的MainActivity,並將結果填充到算術表示式中,具體看如下程式碼:

activity_main.xml:

複製程式碼

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="70dp"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText1"
        android:text=" + "
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText2"
        android:text=" = "
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView2" />
    
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/editText3"
        android:layout_centerInParent="true"
        android:layout_marginTop="30dp"
        android:text="跳轉到SecondActivity"/>

</RelativeLayout>

複製程式碼

second.xml:

複製程式碼

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView
        android:id="@+id/textView1"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    
    <EditText 
        android:id="@+id/editText1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView1"/>
    
    <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/editText1"
        android:text="返回給MainActivity"/>
    
</RelativeLayout>

複製程式碼

然後我們來看看兩個Activity

MainActivity:

複製程式碼

public class MainActivity extends Activity
{
    private Button button;
    private EditText editText1;
    private EditText editText2;
    private EditText editText3;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button);
        editText1 = (EditText)findViewById(R.id.editText1);
        editText2 = (EditText)findViewById(R.id.editText2);
        editText3 = (EditText)findViewById(R.id.editText3);
        
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");
                intent.setClass(MainActivity.this, SecondActivity.class);
                /*
                 * 如果希望啟動另一個Activity,並且希望有返回值,則需要使用startActivityForResult這個方法,
                 * 第一個引數是Intent物件,第二個引數是一個requestCode值,如果有多個按鈕都要啟動Activity,則requestCode標誌著每個按鈕所啟動的Activity
                 */
                startActivityForResult(intent, 1000);
            }
        });
    }
    
    /**
     * 所有的Activity物件的返回值都是由這個方法來接收
     * requestCode:    表示的是啟動一個Activity時傳過去的requestCode值
     * resultCode:表示的是啟動後的Activity回傳值時的resultCode值
     * data:表示的是啟動後的Activity回傳過來的Intent物件
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1000 && resultCode == 1001)
        {
            String result_value = data.getStringExtra("result");
            editText3.setText(result_value);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

複製程式碼

我們看到,這裡我們使用的是 startActivityForResult 的這個方法,

複製程式碼

public void startActivityForResult (Intent intent, int requestCode)

Same as calling startActivityForResult(Intent, int, Bundle) with no options.

Parameters
intent    The intent to start.
requestCode    If >= 0, this code will be returned in onActivityResult() when the activity exits.

Throws   android.content.ActivityNotFoundException

複製程式碼

第一個指定我們的Intent物件,第二個requestCode指定我們的一個啟動標誌值,因為我們可能有多個按鈕,如果都是跳轉到同一個Activity物件上,我們需要對其進行標誌,才知道是哪個Activity物件跳轉過來的。

我們看到這裡還有一個 onActivityResult 方法,這個方法就是用來處理我們Activity的回傳值的方法,所有的Activity回傳值的操作都是在這個方法中完成。

複製程式碼

protected void onActivityResult (int requestCode, int resultCode, Intent data)

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.

You will receive this call immediately before onResume() when your activity is re-starting.

Parameters
requestCode    The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
resultCode    The integer result code returned by the child activity through its setResult().
data    An Intent, which can return result data to the caller (various data can be attached to Intent "extras").

複製程式碼

接下來,我們看看SecondActivity這個類:

複製程式碼

public class SecondActivity extends Activity
{
    private Button button;
    private TextView textView;
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        button = (Button)findViewById(R.id.button1);
        textView = (TextView)findViewById(R.id.textView1);
        editText = (EditText)findViewById(R.id.editText1);
        
        Intent intent = getIntent();
        String message = intent.getStringExtra("message").toString().trim();
        textView.setText(message);
        
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                String result = editText.getText().toString().trim();
                Intent intent = new Intent();
                intent.putExtra("result", result);
                /*
                 * 呼叫setResult方法表示我將Intent物件返回給之前的那個Activity,這樣就可以在onActivityResult方法中得到Intent物件,
                 */
                setResult(1001, intent);
                //    結束當前這個Activity物件的生命
                finish();
            }
        });
    }
}

複製程式碼

這個類裡面我們將MainActivity傳過來的值給TextView賦上,然後通過點選按鈕將值回傳給我們的 MainActivity,通過 setResult 方法可以將我們的值儲存在Intent物件中,並返回給MainActivity物件,通過的 onActivityResult 方法來處理得到的回傳Intent物件。finish()方法我們可以顯示的結束這個Activity物件的生命。

最後我們來看一下AndroidManifest.xml檔案:

複製程式碼

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaoluo.android_activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xiaoluo.android_activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.xiaoluo.android_activity.SecondActivity"
            android:label="SecondActivity" >
        </activity></application>

</manifest>

複製程式碼

我們來看看效果圖:

                                                                    
                                                                           全棧開發者微信公眾號 

相關推薦

Android 元件系列-----Activity回傳

在這篇隨筆裡將講解Activity的傳值和回傳值。 一、通過startActivity來進行Activity的傳值 在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來

Android 元件系列Activity回傳

在這篇隨筆裡將講解Activity的傳值和回傳值。 一、通過startActivity來進行Activity的傳值 在Android中,如果我們要通過一個Activity來啟動另一個Activity,可以使用 startActivity(Intent intent)方法來

Android 元件系列 -- Activity 啟動流程(9.0)

在學習完Android應用程式啟動過程原始碼分析,針對最新Android9.0的程式碼,以相應的順序再次學習。在9.0的版本中對於Activity的啟動流程上並沒有太大的變化,但是在程式碼層面,改動的卻很多。 流程概覽 以Launcher啟動APP為例: Lau

Android Service向Activity引數資料

作為Android開發人員來說,Activity 向Service傳資料很容易,用Intent跳轉的時候攜帶資料,但是Service向Activity傳資料對於剛接觸可能相對有點難度,所以,此篇部落格記錄下Service向Activity用廣播傳值。 An

使用Intent回傳

CA request int tar edi 字符串 AS button tst 簡單傳值 FirstActivity.java findViewById(R.id.button).setOnClickListener(new View.OnClickLi

mui跨頁面的

記錄 dial .html right options xtra tom ng- 根據 最近在做一個基於mui框架的移動app、遇到跨頁面傳值的問題、在此做以記錄 mui.openWindow({ url:‘parkDeta

PHP中關於href的問題

問題:在網頁開發過程中或多或少都會遇見如:index.php?id=1&page=2這類的東西,那麼我們如何在index.php中把傳過來的值獲取到呢? 下面是在javascript中獲取href傳過來的值: 方法一:用正則表示式 function getQueryStrin

Android元件系列----Android Service元件深入解析

【前言】 花了週末兩天的時間,整理了一下作為Android四大元件之一的Service的基礎知識,通過這篇文章,應該可以明白:對Service的理解、在什麼地方使用、怎麼使用、要注意哪些問題等。 【本文主要內容】 一、Service的基本概念(四大元件之一)二、定義(啟動)一個Servi

微信小程式通過按鈕問題

在wxml檔案中進行傳值: <button class='cancle_btn' type='default' size='mini' bindtap='cancleCollected' id="{{item.poem_id}}">取消收藏</button

Android元件系列(1):自動完成輸入內容的元件(AutoCompleteTextView )

本文為原創,如需轉載,請註明作者和出處,謝謝!     AutoCompleteTextView 和 EditText 元件類似,都可以輸入文字。但 AutoCompleteText

Android元件系列----ContentProvider內容提供者

【宣告】  歡迎轉載,但請保留文章原始出處→_→  生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae/p/4108017.html   【正文】 一

標籤獲取

1.<a>標籤傳值的形式--引數固定:<a href="地址?引數名=值"></a>,多個引數用&隔開<a href="地址?引數1=值&引數

Effective C++讀書筆記----自定義型別的返回問題

對於自定義型別,傳參的時候儘可能的使用傳引用來代替傳值。 看如下這個例子: #include <iostream> using namespace std; #include <string> class Person {

Android元件Activity講解

       在Android系統中activity提供視覺化的使用者介面,一個Android應用通常由多個activity組成。多個activity組成了Activity棧,當前活動的Activity處於棧頂。Activity有自己的生命週期,由Android系統來控制。

javascript函式的宣告、呼叫、返回

在javascript中函式的宣告方法有兩種: function func (){ alert("hello,world"); } var func =new Function (alert("hello,world")); var func = function(

android的spinner中,實現取VALUEID

spinner繫結資料來源可以是.xml檔案繫結,也可以是字串陣列繫結,但是我在網上找到的都是隻能單個字串拉上去,沒有可以自定義的ID來識別;這讓很多的事情都不好辦,比如說從資料庫中提取的ID和String,不能自動的繫結上去 為了實現在android的spinner實

android Dialog給Activity

package com.fermax.test; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Bundle

jquery easyUi 在日期控制元件裡面獲取的方法

前提是該匯入到js包肯定匯入進來了 $("#txtstart").datetimebox('getValue');//取值 $("#txtstart").datetimebox('setValue', calEvent.start+""); //賦值

session的

Web中的Session指的就是使用者在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是使用者瀏覽這個網站所花費的時間。Session 是 用於保持狀態的基於 Web伺服器的方法。Session 允許通過將物件儲存在 Web伺服器的記憶體中在整個使用者會話

Python Ctypes 多級指標 引數 返回

最近在搞神經網路框架這塊,由於框架是用C++寫的但是後續的操作不想再用C++寫(主要C++寫的頭疼)所以準備將後面的工作轉入python中寫這裡涉及到利用Python 和Ctypes 來實現py