Android 入門(四) | Intent 實現 Activity 切換

文章目錄

  • Intent
  • 顯式 Intent
    • 定義兩個 xml 文件
      • android:orientation
      • match_parent 和 wrap_content
    • Intent函數
    • 定義兩個 Activity
  • 隱式 Intent
  • 更多隱式 Intent 的用法
    • 用隱式 Intent 打開系統瀏覽器
    • 自建 Activity 以響應打開網頁的 Intent
    • 向下一個活動傳遞數據
    • 返回數據給上一個活動


Intent

如何在切換 Actiity 時攜帶數據是一個重要問題。我們定義兩個 xml 文件,通過 Intent 實現在活動間跳轉。

什么是 xml 文件?

xml 即可擴展標記語言,是互聯網數據傳輸的重要工具,它可以跨越互聯網任何的平臺,在服務器之間穿梭結構化數據,不受編程語言和操作系統的限制,可以說它是一個擁有互聯網最高級別通行證的數據攜帶者。

xml 用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。xml 是標準通用標記語言(SGML)的子集,非常適合 Web 傳輸。

Inten啟動組件的方法:

組件名稱方法名稱
ActivitystartActvity()
startActivity()
ServicestartService()
bindService()
BroadcastssendBroadcasts()
sendOrderedBroadcasts()
sendStickyBroadcasts()

顯式 Intent

定義兩個 xml 文件

定義一個 first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="點擊有驚喜~"></Button></LinearLayout>

定義一個 second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SecondActivity"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:id="@+id/button_2"android:text="再點一次~"></Button></LinearLayout>

android:orientation

orientation 定義了頁面組件排列方式是垂直(vertical)還是水平(horizontal)

match_parent 和 wrap_content

Android 中所有的控件都具有 layout_widthlayout_height 這兩個屬性,可選值有3種:match_parentfill_parentwrap_content

其中 match_parentfill_parent 的意義相同,但官方更推薦 match_parent

  • match_parent 表示讓當前控件的大小和父布局的大小一樣,也就是由父布局來決定當前控件的大小。
  • wrap_content 表示讓當前的控件大小能夠剛好包含里面的內容,也就是由控件內容決定當前控件的大小。

Intent函數

在這里插入圖片描述
Intent 函數接收兩個參數:

  • 第一個參數 Context 為上下文,一般使用 this 即可。
  • 第二個參數為要啟動的目標 Activity

函數內部調用了 ComponentName 函數,該函數可以啟動其他應用的 Activity、Service:
在這里插入圖片描述

  • pkg: Activity、Service 所在應用的包名。
  • cls: Activity、Service 的包名+類名。

定義兩個 Activity

MainActivity

package com.example.intent_test;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.first_layout);Button button1 = (Button)this.findViewById(R.id.button_1);button1.setOnClickListener((View view)->{// 顯式IntentIntent intent = new Intent(this, SecondActivity.class);this.startActivity(intent);});}
}

SecondActivity

package com.example.intent_test;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.second_layout);Button button2 = (Button)this.findViewById(R.id.button_2);button2.setOnClickListener((View view)->{// 顯式IntentIntent intent = new Intent(this, MainActivity.class);this.startActivity(intent);});}
}

定義兩個 Activity 之后,我嘗試運行時曾出現報錯,原因是修改 AndroidManifest.xml 文件時不小心刪了一段配置代碼……所以說還是能不碰 AndroidManifest.xml 就不碰它(對于新手而言),如果有同學也出現報錯,可以參考一下我的 AndroidManifest.xml ,檢查一下自己的是否有問題:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.intent_test"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Intenttest"><activity android:name=".SecondActivity"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

運行結果:

運行 MainActivity
在這里插入圖片描述
點擊之后跳轉:
在這里插入圖片描述
點擊再點一次后回跳回圖一。


隱式 Intent

AndroidManifest.xml 中修改 .SecondActivityactivity 屬性:
在這里插入圖片描述

action 標簽指定當前活動可以響應 com.example.activitytest.ACTION_START 這個活動,而 category 標簽包含一些附加信息,表明只有在 actioncategory 中的內容同時匹配上 Intent 的內容的時候,SecondActivity 才可以響應 Intent

first_layout.xml 中添加第二個按鈕,(因為 Android 布局界面和業務邏輯分離,因此本質上是在 MainActivity 的頁面布局上添加 button3):
在這里插入圖片描述
MainActivity 中為 button3 綁定 隱式Intent
在這里插入圖片描述
即使不為 Intent 指定 category 標簽(未調用 addCategory()),它也會在調用 startActivity() 方法時自動添加默認的 category(即 android.intent.category.DEFAULT)。

每個 Intent 中只能指定一個 action,但卻能指定多個 categoryo 。

運行結果:

在這里插入圖片描述
在這里插入圖片描述

更多隱式 Intent 的用法

用隱式 Intent 打開系統瀏覽器

在這里插入圖片描述
指定 Intent.ACTION_VIEWaction,這是一個 Android 統內置的動作,常量值為 android.intent.action.VIEW,然后通過 Uri.parse 方法,解析網址成一個 Uri 對象,調用 setDate 將其傳遞進去。

setData 方法可以接受一個 Uri 對象,指定當前 Intent 正在操作的數據。通常數據都是以字符串的形式傳入到 Uri.parse 方法中解析產生。


自建 Activity 以響應打開網頁的 Intent

與之對應,我們可以在 <intent-filter> 標簽中再配置一個 <data> 標簽,用于更加精確地指定當前活動能夠響應什么類型的數據。下面是 <data> 標簽中可以配置的內容:

android:scheme 
//用于指定數據的協議部分,如http
android:host
//用于指定數據的主機名部分,如www.baidu.com
android:port
//用于指定數據的端口部分,一般跟隨在主機名后
android:path
//用于指定主機名和端口之后的部分,如一段網址中跟在域名之后的內容
android:mimeType
//用于指定可以處理的數據類型,允許使用通配符的方式進行指定

新建 ThirdActivity ,無需添加多余代碼,默認樣式即可:
在這里插入圖片描述

重點在于修改 AndroidManifest.xmlThirdActivity 的配置:
在這里插入圖片描述
Intent 只有一個 action 標簽,但可以有多個 category 標簽。

<action android:name="android.intent.action.VIEW" />

出現該 action 標簽必須配置下面的 category 標簽,否則會報錯:

<category android:name="android.intent.category.BROWSABLE" />

android:scheme 的值由被打開網頁的 Url 決定:

<data android:scheme="http" />

在這里插入圖片描述

運行結果:

在這里插入圖片描述
但實際上通過自定義的 Activity 打開是沒有任何內容的,因為我們沒有配置相應的 xml 布局也沒有豐富 ThirdActivity 的邏輯代碼:

在這里插入圖片描述


向下一個活動傳遞數據

兩個 Activity 之間傳遞數據也是使用 Intent,通過 putExtra() 方法的重載,可以把我們想要傳遞的數據暫存在 Intent 中,啟動了另一個活動之后,只需要把這些數據再從 Intent 中取出就可以了。

  • Intent.putExtra(String name, @Nullable String value) : 向 Intent 中寫入數據。
  • Intent.getxxxExtra: 向 Intent 中取得數據。

MainActivity 中有一個字符串,現在想把它傳遞到下一個活動當中:
在這里插入圖片描述

然后在 SecondActivity 中取出數據:
在這里插入圖片描述

  • 首先通過 getIntent 方法獲取到用于啟動 SecondActivityIntent
  • 然后調用 getStringExtra 方法,傳入相應的鍵值(即消息的名稱),就可以得到相應的數據了;
  • Log.d 用于打印日志以便于尋找 bug
  • .show() 用于顯示 Toast 信息。

Toast.makeText 是 Andriod 的消息模式:

在這里插入圖片描述

  • context:當前的上下文環境。可用 getApplicationContext()this
  • text:要顯示的字符串。也可是 R.string字符串ID
  • duration:顯示的時間長短。Toast 默認的有兩個 LENGTH_LONGLENGTH_SHORT,也可以使用毫秒如 2000ms。

運行結果:

在這里插入圖片描述


返回數據給上一個活動

SecondActivity 中構建一個 Intent 用于傳遞數據,然后調用了 setResult 方法,這個方法專用于向上一個活動返回數據,它有兩個參數:

public final void setResult(int resultCode, Intent data) {synchronized (this) {mResultCode = resultCode;mResultData = data;}
}
  • resultCode:用于向上一個活動返回處理結果,一般只用 RESULT_OK 或者 RESULT_CANCELED 這兩個值;
  • data:將帶有數據的 Intent 傳遞回去。

在這里插入圖片描述
通過 finish() 方法來銷毀活動,也可以使用回退鍵銷毀活動,但要重寫一下 onBackPressed 方法:
在這里插入圖片描述

接下來實現對 MainActivity 的編寫:

Activity 中有 startActivityFroResult 方法,也是用于啟動活動的,且在活動銷毀時返回一個結果給上一個活動。該方法接受兩個參數:

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {startActivityForResult(intent, requestCode, null);
}
  • Intent: 啟動的 Activity;
  • requestCode: 請求碼,用于在之后的回調中判斷數據來源。

在這里插入圖片描述
startActivityForResult 方法在 SecondActivity 活動銷毀之后會回調 MainActivity 活動的 onActivityResult 方法,因此需要在 MainActivity 中重寫來得到返回的數據。onActivityResult 方法有三個參數:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
  • 請求碼 requestCode:就是 startActivityForResult 中傳入的 int 值;
  • resultCode:返回數據時傳入的處理結果;
  • data:攜帶著返回數據的 Intent

在這里插入圖片描述

運行結果:

在這里插入圖片描述

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

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

相關文章

Android入門(二) | 項目目錄及主要文件作用分析

文章目錄項目目錄分析app目錄分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外層目錄下的 build.gradleapp 目錄下的 build.gradle項目目錄分析 我們來看一下 src/main/res 下的一些文件&#xff1a; .gradle 和 .idea &#xff1a;這兩個目錄下放置…

Android入門(三) | Android 的日志工具 Logcat

文章目錄日志工具類 android.util.LogLogcat 中的過濾器日志工具類 android.util.Log Log 從屬日志工具類 android.util.Log &#xff0c;該類提供了五個方法供我們打印日志&#xff1a; Log.v() &#xff1a;用于打印那些最為瑣碎的、意義最小的日志信息。對應級別 verbose&…

Android 客戶端與服務器交互方式

突然想到一個問題就是Android客戶端與服務器交互有幾種方式&#xff0c;因為在腦袋里想當然的就是webservices和json。要在Android手機客戶端與pc服務器交互&#xff0c;需要滿足下面幾種條件&#xff1a;跨平臺、傳輸數據格式標準、交互方便...。 為了與服務器通訊其實無非就…

Android入門(五) | Activity 的生命周期

文章目錄Activity 的狀態及生命周期實現管理生命周期FirstActivitySecondActivityDialogActivity運行結果舊活動被回收了還能返回嗎&#xff1f;Activity 的狀態及生命周期 Android 的應用程序運用 棧&#xff08;Back Stack&#xff09; 的思想來管理 Activity&#xff1a; …

Android入門(六) | Activity 的啟動模式 及 生產環境中關于 Activity 的小技巧

文章目錄Activity 的啟動模式standardsingleTopsingleTasksingleInstance技巧了解當前界面是哪個 Activity隨時隨地退出程序啟動活動的最佳寫法Activity 的啟動模式 standard&#xff1a;默認的啟動方式&#xff0c;每次啟動一個活動都會重新創建singleTop&#xff1a;如果該活…

Android入門(七) | 常用控件

文章目錄TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按鈕EditText 控件&#xff1a;輸入框ImageView 控件&#xff1a;圖片ProgressBar 控件&#xff1a;進度條AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;帶有進度條的提示框TextView 控…

Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄LinearLayout &#xff1a;線性布局android:layout_gravity &#xff1a;控件的對齊方式android:layout_weight&#xff1a;權重RelativeLayout &#xff1a;相對布局相對于父布局進行定位相對于控件進行定位邊緣對齊FrameLayout &#xff1a;幀布局Percent &#xff1…

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限&#xff0c;能夠一次性在屏幕上顯示的內容不多&#xff0c;當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…

關于“三門問題”的一些想法

三門問題&#xff08;Monty Hall problem&#xff09;亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論&#xff0c;大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾&#xff08;Monty Hall&#xff09;。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片&#xff08;Fragment&#xff09;實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片&#xff08;Fragment&#xff09; 我們在手機上看新聞可能是這樣的&#xff1a; Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…