Activity詳解二 activity數據傳遞

来源:http://www.cnblogs.com/androidWuYou/archive/2016/09/20/5887779.html
-Advertisement-
Play Games

首先看效果圖: 1.Bundle類的作用 Bundle類用作攜帶數據,它類似於Map,用於存放key-value名值對形式的值。相對於Map,它提供了各種常用類型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putX ...


首先看效果圖:

 

1.Bundle類的作用

  Bundle類用作攜帶數據,它類似於Map,用於存放key-value名值對形式的值。相對於Map,它提供了各種常用類型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用於往Bundle對象放入數據,getXxx()方法用於從Bundle對象里獲取數據。Bundle的內部實際上是使用了HashMap<String, Object>類型的變數來存放putXxx()方法放入的值。簡單地說,Bundle就是一個封裝好的包,專門用於導入Intent傳值的包。

2.為Intent附加數據的兩種寫法

  第一種寫法,用於批量添加數據到Intent:

Intentintent = new Intent();

  Bundle bundle = new Bundle();//該類用作攜帶數據

  bundle.putString("name","Alice");

  intent.putExtras(bundle);//為意圖追加額外的數據,意圖原來已經具有的數據不會丟失,但key同名的數據會被替換

  第二種寫法:這種寫法的作用等價於上面的寫法,只不過這種寫法是把數據一個個地添加進Intent,這種寫法使用起來比較方便,而且只需要編寫少量的代碼

  Intent intent = new Intent();

  intent.putExtra("name","XXX");

  那麼,這兩種方法有什麼區別呢?

  完全沒有區別。當你調用putExtras()方法時,所傳入的Bundle會被轉化為Intent的鍵值(別忘了Intent也以鍵值模式轉載數據)。

  那麼,現在看看如何將Intent和Bundle取出來。

  方法很簡單,直接使用this.getIntent()就可以得到傳來的Intent,然後在這個Intent的基礎上調用getExtras()就可以得到Bundle。然後這個Bundle你想要什麼得到什麼就get什麼。

  比如String str=bundle.getString("USERNAME"); 就是得到鍵為“USERNAME”的字元串,int num=bundle.getInt("Number");就是得到鍵為“Number”的整型。

android中的組件間傳遞的對象一般實現Parcelable介面,當然也可以使用java的Serializable介面,前者是android專門設計的,效率更高,下麵我們就來實現一個Parcelabel。

1. 創建一個類實現Parcelable介面,具體實現如下:

public class ParcelableData implements Parcelable{  

    private String name;  

    private int age;  

    public ParcelableData(){  

        name = "guest";  

        age = 20;  

    }  

    public ParcelableData(Parcel in){  

        //順序要和writeToParcel寫的順序一樣  

        name = in.readString();  

        age = in.readInt();  

    }  

    public String getName(){  

        return name;  

    }  

    public void setName(String name){  

        this.name = name;  

    }  

      

    public int getAge(){  

        return age;  

    }  

    public void setAge(int age) {  

        this.age = age;  

    }  

    @Override  

    public int describeContents() {  

        // TODO Auto-generated method stub  

        return 0;  

    }  

    @Override  

    public void writeToParcel(Parcel dest, int flags) {  

        // TODO Auto-generated method stub  

        dest.writeString(name);  

        dest.writeInt(age);  

    }  

    public static final Parcelable.Creator<ParcelableData> CREATOR = new Parcelable.Creator<ParcelableData>() {  

        public ParcelableData createFromParcel(Parcel in) {  

            return new ParcelableData(in);  

        }  

        public ParcelableData[] newArray(int size) {  

            return new ParcelableData[size];  

        }  

    };  

}  

 

2. 通過下麵的方法發送對象。Bundle類也實現了Parcelable介面,一般在android中我們是通過Bundle來封裝數據併進行傳送的。

Intent intent = new Intent();  

intent.setClass(this, SubActivity.class);  

// 直接添加  

//intent.putExtra("MyData", new ParcelableData());  

  

// 通過Bundle  

Bundle bundle = new Bundle();  

bundle.putString("MyString", "test bundle");  

bundle.putParcelable("MyData", new ParcelableData());  

intent.putExtras(bundle);  

startActivity(intent);  

 

 

3. 下麵的接收對象的方法。

//ParcelableData parcelableData = getIntent().getParcelableExtra("MyData");  

Bundle bundle = getIntent().getExtras();  

ParcelableData parcelableData = bundle.getParcelable("MyData");  

String testBundleString = bundle.getString("MyString");  

Log.v("string=", testBundleString);  

Log.v("name=", parcelableData.getName());  

Log.v("age=", ""+parcelableData.getAge());  

 3 DEMO下載

activity代碼:

package mm.shandong.com.testbundle;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


import java.util.ArrayList;

import mm.shandong.com.testbundle.entity.Person;

public class TestBundleActivity extends AppCompatActivity {
    EditText editText1;
    EditText editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_bundle);
        editText1 = (EditText) findViewById(R.id.editText1);
        editText2 = (EditText) findViewById(R.id.editText2);
    }
   ///提交選擇的地區,並把地區傳遞給TestBundleActivity3
    public void submitRegion(View view) {
        EditText editTextRegion = (EditText) findViewById(R.id.editTextRegion);
        Intent intent = new Intent(this, TestBundleActivity3.class);
        String region = editTextRegion.getText().toString();
        if (!TextUtils.isEmpty(region)) {
            intent.putExtra("region", region);
            startActivity(intent);
        } else {
            Toast.makeText(this, "地區不能是空值", Toast.LENGTH_SHORT).show();
        }
    }
    ///把需要計算的兩個值都是Integer類型,傳入到TestBundleActivity1
    public void calculte(View view) {
        Intent intent = new Intent(this, TestBundleActivity1.class);
        Bundle bundle = new Bundle();
        String first = editText1.getText().toString();
        String second = editText2.getText().toString();
        if (!TextUtils.isEmpty(first) && !TextUtils.isEmpty(second)) {
            bundle.putInt("first", Integer.parseInt(first));
            bundle.putInt("second", Integer.parseInt(second));
            intent.putExtras(bundle);
            startActivity(intent);
        } else {
            Toast.makeText(this, "數值不能是空", Toast.LENGTH_SHORT).show();
        }
    }
    ///傳遞Serializable對象到TestBundleActivity2
    public void login(View view) {
        EditText editTextName = (EditText) findViewById(R.id.editTextName);
        EditText editTextCode = (EditText) findViewById(R.id.editTextCode);
        Intent intent = new Intent(this, TestBundleActivity2.class);
        Bundle bundle = new Bundle();
        String name = editTextName.getText().toString();
        String code = editTextCode.getText().toString();
        if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(code)) {
            Person person = new Person();
            person.setName(name);
            person.setCode(code);
            bundle.putSerializable("person", person);
            intent.putExtras(bundle);
            startActivity(intent);
        } else {
            Toast.makeText(this, "姓名編號不能是空", Toast.LENGTH_SHORT).show();
        }
    }

}

 

本人微博:honey_11

 

Demo下載
最後,以上例子都來源與安卓無憂,請去應用寶或者豌豆莢下載:例子源碼,源碼例子文檔一網打盡

 


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

-Advertisement-
Play Games
更多相關文章
  • 第一種方法:獲取手機的IMSI碼,並判斷是中國移動\中國聯通\中國電信 第二種方法 ...
  • 2014.7版本 ADT Bundle http://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.ziphttp://dl.google.com/android/adt/adt-bundle-windows-x86_64-201 ...
  • ➠更多技術乾貨請戳:聽雲博客 0x01 iOS體系架構 1.1 iOS 系統的整體體系架構 用戶體驗( The User Experience layer ):SpringBoard 同時支持 Spotlight。 應用軟體開發框架(The Application Frameworks layer) ...
  • 當應用不再使用時,通常需要關閉應用,可以使用以下三種方法關閉android應用: 第一種方法:首先獲取當前進程的id,然後殺死該進程。android.os.Process.killProcess(android.os.Process.myPid()) 接下來實踐一下: 添加點擊事件代碼 在點擊按鈕之 ...
  • 操作系統 Windows/MacOSX/Linux 編程語言 Java HTML/JS (Hybrid/Web App) C/C++ (NDK) SQL (DB) Kotlin 開發工具 IDE Android Studio Eclipse 調試工具 網路調試 Charles Wireshark F ...
  • 一、問題 使用cocoapods搜索某些庫時,搜索到的版本低於Github上面的版本,這樣會導致一些問題。例如我在使用一個LTNavigationBar這個庫時,在我升級到iOS10的時候,會導致導航欄有些內容顯出不出來,在最新的LTNavigationBar版本上已經修複這個問題。但是我使用coc ...
  • 現在在蘋果的官網上,我們已經可以下載到Xcode8的GM版本了,加上9.14日凌晨,蘋果就要正式推出iOS10系統的推送了,在此之際,iOS10的適配已經迫在眉睫啦,不知道Xcode8 beat版本,童鞋們有木有下載過來試試呢?就我的使用來說,總體覺得蘋果還是坑不斷,但是也在一直進步的啦。下麵我就來 ...
  • 一個react-native的下拉框組件,支持安卓和iOS。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...