【Android】Activity 如何進行數據傳輸

在這里插入圖片描述

三三要成為安卓糕手

一:Activity之間的數據傳輸

問題:不同的Activity之間怎么進行數據傳輸呢?

比如第一個頁面中有一些字符串數據之類的要通過數據傳輸,傳遞給第二個頁面進行顯示的

1:MainActivity做處理

在定義一個按鈕,和一個文本輸入框

	<Buttonandroid:id="@+id/btn_second3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="攜帶數據,跳轉到Second頁面"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/btn_second2"/><EditTextandroid:id="@+id/et_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="請輸入一些數據"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/btn_second3"/>
        findViewById(R.id.btn_second3).setOnClickListener(this);etData = findViewById(R.id.et_data);

繼續在onClick方法中寫一個else if()

		else if (id == R.id.btn_second3) {Intent intent = new Intent(this, SecondActivity.class);String string = etData.getText().toString();if(string != null && string.length() > 0){intent.putExtra("key_data",string);               }startActivity(intent);}

(1)putExtra

Extra翻譯為額外;它的作用是在通過 Intent 啟動另一個組件(如 Activity)時,攜帶一些額外的數據

有點Cookie和Session會話的味道了,記住這里的key值一定要匹配

(2)邏輯梳理

從輸入框中獲取string字符串

2:SecondActivity做處理

xml布局自己定義一個TextView,此處略

		Intent intent = getIntent();String keyData = intent.getStringExtra("key_data");TextView textView = findViewById(R.id.text_view);if(keyData != null && keyData.length() > 0){textView.setText(keyData);}

這邊呢接收數據,并讓string顯示在頁面上

看一下兩者聯系

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

3:效果

效果就這樣,第二個頁面(右圖)接受到了,就顯示出來

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

二:Activity之間的數據回傳

問題:MainActivity怎么接收SecondActivity回傳的數據

1:MainActivity做處理

(1)startActivityForResult

<Buttonandroid:id="@+id/btn_second4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="跳轉到Second頁面,等待Second返回數據"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/et_data"/>
		findViewById(R.id.btn_second4).setOnClickListener(this);
		else if (id == R.id.btn_second4) {//老方式startActivityForResult(new Intent(this, SecondActivity.class),9);}
  • startActivityForResult方法在安卓API30以后已經過時了,但是很多商業中也會用到這個玩意,也得學bro

    • 參數一:Intent 對象,“要啟動哪個頁面”,也可以在 Intent 里用 putExtra 攜帶數據傳給目標頁面。
    • 參數二:requestCode(請求碼),給這次跳轉打個 “標記 9”,等目標頁面返回數據時,能通過這個標記識別 “這是 btn_start_second4 按鈕跳轉的返回”。

(2)onActivityResult

@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 9 && resultCode == 8){int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);String keyComeBackString = data.getStringExtra("key_comeBackString");Log.i(TAG, "onActivityResult: num = " + keyComeBackNum);Log.i(TAG, "onActivityResult: string = " + keyComeBackString);etData.setText(keyComeBackNum + keyComeBackString);}}
  • requestCode:“請求碼”,自己定義的一個整數標記,這里是9; 區分 “是哪一次啟動 Activity 的請求”

    • 比如:一個頁面有多個按鈕,都用 startActivityForResult 跳轉到不同頁面,靠 requestCode 就知道 “這次返回的數據,對應之前哪個按鈕的跳轉” 。
  • resultCode:“結果碼”,是目標 Activity 返回的狀態標記

  • data:一個 Intent 對象,是目標 Activity 返回的 “數據載體”; 記得判空

    • getInExtra取到的值如果為空,默認為0

2:SecondActivity做處理

在SecondActivity的xml中在定義一個Button控件

<Buttonandroid:id="@+id/btn_back"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="往MainActivity回傳數據"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"/>

(1)setResult

		findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int comeBack = 798;String string = "surprise ma da faker";Intent backIntent = new Intent();backIntent.putExtra("key_comeBackNum",comeBack);backIntent.putExtra("key_comeBackString",string);setResult(8,backIntent);finish();}});
  • setResult(8,backIntent),這里我們的結果碼就是8

3:邏輯梳理

  • 啟動時

    • 通過 startActivityForResult(intent, 9) 啟動 SecondActivity,這里的 9 就是 requestCode(請求碼)。
  • 目標頁面返回時
    SecondActivity 中,需要通過 setResult(8, data) 來設置返回結果:

    • 第一個參數 8 就是 resultCode(結果碼,自定義的標記)
    • 第二個參數 dataIntent 對象,通過 putExtra 存入數據(key_comeBackNumkey_comeBackString
  • 接收返回時:回到當前頁面的 onActivityResult 方法:

    • 通過 requestCode == 9 判斷:“這是之前用請求碼 9 啟動的頁面返回的結果”
    • 通過 resultCode == 8 判斷:“目標頁面返回了結果碼 8 的狀態”
    • data 中取出攜帶的 key_comeBackNumkey_comeBackString,并更新到 etData 輸入框中

4:finish問題延伸

提問:在第二個頁面做了一些數據后,不馬上finish,而是手動關閉,這個時候回傳的數據還能收到嗎

最后一句代碼finish刪掉;finish的作用就是,點擊btn_bakc2這個按鈕后activity_second這個頁面就退出了

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

這里我們點擊返回按鈕,同樣MainActivity能接收到傳回來的數據,并不受影響

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

三:Activity數據回傳的新方式

1:.launch

用于啟動目標 Activity 并等待其返回結果的核心方法。它的作用類似于傳統的 startActivityForResult()

創建點擊事情的準備工作

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

		//跳轉到第二個頁面,等待回傳數據else if (id == R.id.btn_second5) {activityResultLancher.launch(new Intent(this, SecondActivity.class));}

2:registerForActivityResult

可以理解一個接收Activity結果的注冊器,負責 “結果回調”,能在當前 Activity中優雅接收、處理返回的數據。

是傳統的startActivityForResult + onActivityResult 機制的平替

private ActivityResultLauncher<Intent> activityResultLancher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult o) {int resultCode = o.getResultCode();//返回的結果碼Intent data = o.getData();//返回的數據if (resultCode == 8) {int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);String keyComeBackString = data.getStringExtra("key_comeBackString");Log.i(TAG, "onActivityResult: key_comeBackNum = " + keyComeBackNum);Log.i(TAG, "onActivityResult: key_comeBackString" + keyComeBackString);etData.setText("接受到的數據是" + keyComeBackString + keyComeBackNum);}}});

(1)new ActivityResultContracts.StartActivityForResult()

作用:啟動一個 Activity 并獲取其返回結果

ActivityResultContracts 是一個包含多種預定義合約(Contract)的工具類,StartActivityForResult 是其中一個靜態內部類

(2)new ActivityResultCallback()

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

作用:回調接口,當被啟動的 Activity 關閉并返回結果時觸發

重寫onActivityResult方法,((20250808114147-zw40xjr “前面我們已經使用過這個方法,但是兩者形參不同,”))ActivityResult中包括結果碼(resultCode)返回的數據(data)

(3)o.getResultCode()

(4)o.getdata()

3:結果

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94160.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94160.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94160.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#語言的語法(數據類型)

數據類型 表2.1給出了C#的主要數據類型。注意&#xff0c;基本類型的長度與計算機或操作系統的類型無關。C# 中的字符是16位的寬度&#xff0c;可以表示非拉丁語言中的所有字符。它使用一種叫雙字節碼的字符編碼 系統&#xff0c;其中定義了絕大多數可書寫語言的數以千計的字符…

Vue3 + TypeScript全局阻止非輸入區域的Backspace鍵,防止回退頁面

main.ts/*** 應用程序主入口** 初始化 Vue 應用并掛載到 DOM*/ import "./assets/style/main.scss";import { createApp } from "vue"; // 全局引入element-plus&#xff0c;對打包后的文件大小不是很在乎&#xff0c;那么使用全局導入會更方便 import Ele…

01數據結構-堆排序

01數據結構-堆排序前言1.堆2.堆的操作邏輯3.堆的代碼實現前言 數據結構中的堆是一種結構&#xff0c;C語言的堆是空間管理的程序員malloc&#xff0c;free的空間&#xff0c;兩者沒多大關系。 1.堆 邏輯上 堆&#xff08;Heap&#xff09;是一類基于完全二叉樹的特殊數據結構…

在線課程|基于SprinBoot+vue的在線課程管理系統(源碼+數據庫+文檔)

在線課程 目錄 基于SprinBootvue的在線課程管理系統 一、前言 二、系統設計 三、系統功能設計 1 管理員模塊的實現 2在線課程 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff1a;??大廠碼農|…

Python海象運算符:=

文章目錄簡介??條件判斷優化循環控制簡化?推導式高效計算?正則匹配與數據提取?性能對比參考文獻簡介 海象運算符 :&#xff0c;又稱??賦值表達式??&#xff08;Assignment Expression&#xff09;&#xff0c;Python 3.8 后可用&#xff0c;PEP 572 引入&#xff0c;…

Vue 2 項目中快速集成 Jest 單元測試(超詳細教程)

在 Vue 項目中編寫單元測試&#xff0c;是提升代碼質量和維護性的關鍵一步。本文將帶你從零開始&#xff0c;在一個 Vue 2 Vue CLI 項目中集成 Jest 作為單元測試框架&#xff0c;并運行第一個測試用例。? 適用于 Vue 2 項目&#xff08;如你使用的是 vue-cli-service&#x…

PostgreSQL15——管理表空間

管理表空間一、基本概念二、創建表空間三、修改表空間四、刪除表空間一、基本概念 在 PostgreSQL 中&#xff0c;它是通過表空間&#xff08;Tablespaces&#xff09;來實現邏輯對象&#xff08;表、索引等&#xff09;與物理文件之間的映射。創建數據庫或者數據表&#xff08…

趣打印高級版--手機打印軟件!軟件支持多種不同的連接方式,打印神器有這一個就夠了!

軟件介紹&#xff08;文末獲取&#xff09;趣打印高級版是一款手機打印軟件。軟件支持五種不同的連接方式&#xff0c;每種都有穩定且快速的反應&#xff0c;用戶均可通過手機進行打印機的遠程使用和設置。軟件還支持上傳不同格式的文檔類型進行打印&#xff0c;方便快捷&#…

【開源框架】7 款流行的 Vue 3 后臺管理框架對比

以下是 7 個流行的 Vue 3 后臺管理框架在 Star 數&#xff08;截至 2025 年 8 月21日的 GitHub 最新數據&#xff09;、框架特點、基于的技術棧及開源協議四個方面的詳細對比&#xff1a; 1. Vue-Vben-Admin GitHub 地址&#xff1a;https://github.com/vbenjs/vue-vben-admin…

Datawhale工作流自動化平臺n8n入門教程(一):n8n簡介與平臺部署

前言 在數字化時代&#xff0c;重復性的工作任務正在消耗著我們大量的時間和精力。從數據同步到營銷自動化&#xff0c;從客戶服務到內容管理&#xff0c;這些瑣碎但必要的任務往往讓我們疲于應對。而工作流自動化工具的出現&#xff0c;為我們提供了一個優雅的解決方案。 今天…

SRE - 定位與能力

僅為個人知識總結與記錄 Site Reliability Engineer&#xff1a;站點可靠性工程&#xff08;SRE 軟件工程師 運維專家 可靠性專家&#xff09; 相對傳統的運維工程師&#xff0c;SER 注重開發&#xff0c;效率&#xff0c;追求自動化。對于 SRE 工程師&#xff0c;追究的就是…

StarRocks學習4-查詢優化與性能調優

? 1. 執行計劃分析&#xff08;EXPLAIN&#xff09; &#x1f31f; 作用&#xff1a; 用于查看 SQL 的執行路徑&#xff0c;判斷是否命中索引、物化視圖、Join 策略、并行度等。 &#x1f4cc; 常用命令&#xff1a; EXPLAIN SELECT ...; EXPLAIN VERBOSE SELECT ...;&#x1…

CentOS系統安裝Git全攻略

文章目錄? 方法一&#xff1a;使用 yum 或 dnf 包管理器安裝&#xff08;推薦&#xff09;1. 更新系統軟件包(非必須)[^1]2. 安裝 Git3. 驗證安裝? 方法二&#xff1a;從源碼編譯安裝&#xff08;適用于需要自定義版本或配置&#xff09;1. 安裝依賴包2. 下載 Git 源碼3. 編譯…

VR交通安全學習機-VR交通普法體驗館方案

VR交通安全學習機是一種基于虛擬現實技術的互動式教育設備&#xff0c;旨在通過虛擬環境模擬真實的交通場景&#xff0c;幫助用戶深入了解交通規則、交通信號、道路安全等知識&#xff0c;并通過沉浸式的體驗讓他們親身感受到不遵守交通規則的后果。無論是駕駛員、行人還是騎行…

算法題(188):團伙

審題&#xff1a; 本題需要我們通過解析所有人之間的關系&#xff0c;從而判斷出朋友團體的總個數并輸出 思路&#xff1a; 方法一&#xff1a;擴展域并查集 由于這里涉及對朋友/敵人等關系集合的頻繁操作&#xff0c;所以我們需要使用并查集來操作&#xff0c;但是普通的并查集…

C++開發/Qt開發:單例模式介紹與應用

單例模式是軟件設計模式中最簡單也是最常用的一種創建型設計模式。它的核心目標是確保一個類在整個應用程序生命周期中只有一個實例&#xff0c;并提供一個全局訪問點。筆者白話版理解&#xff1a;你創建了一個類&#xff0c;如果你希望這個類對象在工程中應用時只創建一次&…

Linux筆記---策略模式與日志

1. 設計模式設計模式是軟件開發中反復出現的問題的通用解決方案&#xff0c;它是一套套被反復使用、多數人知曉、經過分類編目的代碼設計經驗總結。設計模式并非具體的代碼實現&#xff0c;而是針對特定問題的抽象設計思路和方法論。它描述了在特定場景下&#xff0c;如何組織類…

關于多個el-input的自動聚焦,每輸入完一個el-input,自動聚焦到下一個

講解原理或者思路&#xff1a;如果你有多個el-input,想要實現每輸入完一個輸入框&#xff0c;然后自動聚焦到下一個輸入框&#xff0c;同理&#xff0c;如果每刪除一個輸入框的值&#xff0c;自動聚焦到上一個輸入框。條件那么首先要做的就是&#xff0c;設置條件&#xff0c;在…

AI 賦能教育變革:機遇、實踐與展望

引言說明教育在社會發展中的重要地位&#xff0c;以及傳統教育面臨的困境。引出 AI 技術為教育變革帶來新機遇&#xff0c;闡述研究其在教育中應用的價值。AI 為教育帶來的機遇個性化學習支持&#xff1a;講解 AI 通過分析學生學習數據&#xff0c;如答題情況、學習時間等&…

(一)八股(數據庫/MQ/緩存)

文章目錄 項目地址 一、數據庫 1.1 事務隔離級別 1. 事務的四大特性 2. Read Uncommited臟讀(未提交讀) 3. Read Commited幻讀(sql默認已提交讀) 4. Repeatable Read 5. Serializable 6. Snapshot(快照隔離) 7. 代碼開啟 8. For update和Repeatable Read的區別 1.2 各種鎖 …