Android入門之在Activity之間穿梭的Intent
概述
Intent 是 Android 程序中各組件之間進(jìn)行交互的一種重要方式,它不僅可以指明當(dāng)前組件想要執(zhí)行的動作,還可以在不同組件之間傳遞數(shù)據(jù)
Intent 大致可分為兩種:顯式 Intent 和隱式 Intent
1. 顯式 Intent
Intent 有多個構(gòu)造函數(shù)的重載,其中一個是 Intent(Context packetContext, Class<?> cls)
,這個構(gòu)造函數(shù)接收兩個參數(shù):
- 第一個參數(shù) Context 要求提供一個啟動 Activity 的上下文
- 第二個參數(shù) Class 用于指定想要啟動的目標(biāo) Activity
通過這個構(gòu)造函數(shù)可以構(gòu)建出 Intent,Activity 類中提供了一個 startActivity()
方法,專門啟動 Activity,它接收一個 Intent 參數(shù)。我們定義一個按鈕 button1,修改點(diǎn)擊事件
button1.setOnClickListener { val intent = Intent(this, SecondActivity::class.java) startActivityForResult(intent) }
使用這種方式啟動 Activity,Intent 的意圖十分明顯,因此稱之為顯式 Intent
2. 隱式 Intent
隱式 Intent 并不明確指出想要啟動哪一個 Activity,而是指定了一系列更為抽象的 action 和 category 等信息,然后交由系統(tǒng)去分析這個 Intent,并幫助我們找出適合的 Activity 去啟動
通過在 <activity> 標(biāo)簽配置 <intent-filter> 的內(nèi)容,可以指定當(dāng)前 Activity 能夠響應(yīng)的 action 和 category,打開 AndroidManifest.xml,添加如下代碼:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.activityest.MY_CATEGORY" /> </intent-filter> </activity>
我們指明了當(dāng)前 Activity 可以響應(yīng) com.example.activitytest.ACTION_START
這個 action,而 <category> 標(biāo)簽則包含了一些附加信息。只有 <action> 和 <category> 中的內(nèi)容同時匹配 Intent 中指定的 action 和 category 時,這個 Activity 才能響應(yīng)該 Intent
button1.setOnClickListener { val intent = Intent("com.example.activitytest.ACTION_START") intent.addCategory("com.example.activityest.MY_CATEGORY") startActivity(intent) }
使用隱式 Intent 不僅可以啟動自己程序內(nèi)的 Activity,還可以啟動其他程序的 Activity,這使得多個應(yīng)用程序之間的功能共享成為可能。比如你的應(yīng)用程序需要展示一個網(wǎng)頁,只需要調(diào)用系統(tǒng)的瀏覽器來打開這個網(wǎng)頁即可
button1.setOnClickListener { val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("https://www.baidu.com") startActivity(intent) }
使用 Intent 傳遞數(shù)據(jù)
1. 向下一個 Activity 傳遞數(shù)據(jù)
在啟動 Activity 時傳遞數(shù)據(jù)的思路很簡單,Intent 提供了一系列 putExtra() 方法的重載,可以把數(shù)據(jù)暫存在 Intent 中,在啟動另一個 Activity 時,再把數(shù)據(jù)從 Intent 中取出即可
button1.setOnClickListener { val data = "Hello SecondActivity" val intent = Intent(this, SecondActivity::class.java) intent.putExtra("extra_data", data) startActivity(intent) }
然后在 SecondActivity 中將傳遞的數(shù)據(jù)取出
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.sceond_layout) val extraData = intent.getStringExtra("extra_data") Log.d("SecondActivity", "extra data is $extraData") }
2. 返回數(shù)據(jù)給上一個 Activity
Activity 類中有一個啟動 Activity 的 startActivityForResult() 方法,可以在 Activity 銷毀時返回結(jié)果給上一個 Activity,該方法接收兩個參數(shù):
- 第一個參數(shù)還是 Intent
- 第二個參數(shù)是請求碼,用于在之后的回調(diào)中判斷數(shù)據(jù)的來源
修改 FirstActivity 中按鈕的點(diǎn)擊事件代碼如下,這里使用了 startActivityForResult() 方法來啟動 SecondActivity,請求碼只要是個唯一值,這里傳入 1
button1.setOnClickListener { val intent = Intent(this, SecondActivity::class.java) startActivityForResult(intent, 1) }
接下來在 SecondActivity 中給按鈕注冊點(diǎn)擊事件,并在點(diǎn)擊事件中添加返回數(shù)據(jù)的邏輯
class SecondActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.sceond_layout) button2.setOnClickListener { val intent = Intent() intent.putExtra("data_return", "Hello FirstActivity") setResult(RESULT_OK, intent) finish() } } }
這里還是構(gòu)建了一個 Intent,只不過這個 Intent 僅僅用來傳遞數(shù)據(jù),然后調(diào)用了 setResult() 方法,該方法專門向上一個 Activity 返回數(shù)據(jù)
setResult() 方法接收兩個參數(shù):
- 第一個參數(shù)用于向上一個 Activity 返回處理結(jié)果,一般只使用 RESULT_OK 或 RESULT_CANCELED 這兩個值
- 第二個參數(shù)則把帶有數(shù)據(jù)的 Intent 傳遞回去
由于我們使用 startActivityForResult() 方法來啟動 SecondActivity,SecondActivity 銷毀后會回調(diào)上一個 Activity 的 onActivityResult() 方法,因此需要在 FirstActivity 中重寫該方法來得到返回數(shù)據(jù)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { 1 -> if (resultCode == RESULT_OK) { val returnedData = data?.getStringExtra("data_return") Log.d("FirstActivity", "returned data is $returnedData") } } }
onActivityResult() 方法帶有三個參數(shù):
- 第一個參數(shù) requestCode,即我們啟動 Activity 時傳入的請求碼
- 第二個參數(shù) resultCode,即我們在返回數(shù)據(jù)時傳入的處理結(jié)果
- 第三個參數(shù) data,即攜帶返回數(shù)據(jù)的 Intent
由于在一個 Activity 中有可能調(diào)用 startActivityForResult() 來啟動很多不同的 Activity,而每一個 Activity 返回的數(shù)據(jù)都會回調(diào)到 onActivityResult() 方法,因此我們首先要做的是通過檢查 requestCode 的值判斷數(shù)據(jù)來源,再通過 resultCode 的值來判斷處理結(jié)果是否成功,最后從 data 中取值并打印
到此這篇關(guān)于Android入門之在Activity之間穿梭的Intent 的文章就介紹到這了,更多相關(guān)Android Intent內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android ToggleButton 詳解及實(shí)例代碼
這篇文章主要介紹了Android ToggleButton 詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Android編程實(shí)現(xiàn)手繪及保存為圖片的方法(附demo源碼下載)
這篇文章主要介紹了Android編程實(shí)現(xiàn)手繪及保存為圖片的方法,涉及Android畫布的使用及圖片的操作技巧,并附帶了demo源碼供讀者下載,需要的朋友可以參考下2015-12-12Android開發(fā)筆記之: 數(shù)據(jù)存儲方式詳解
本篇文章是對Android中數(shù)據(jù)存儲方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05android studio更新gradle錯誤構(gòu)建項(xiàng)目失敗的解決方法
這篇文章主要介紹了android studio更新gradle錯誤構(gòu)建項(xiàng)目失敗的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Android中fragment嵌套fragment問題解決方法
這篇文章主要介紹了Android中fragment嵌套fragment問題解決方法,本文給出兩個解決方法,需要的朋友可以參考下2015-06-06Android 自定義一套 Dialog通用提示框 (代碼庫)
這篇文章主要介紹了Android 自定義一套 Dialog通用提示框 (代碼庫),需要的朋友可以參考下2017-04-04Android跳轉(zhuǎn)到通訊錄獲取用戶名稱和手機(jī)號碼的實(shí)現(xiàn)思路
這篇文章主要介紹了Android跳轉(zhuǎn)到通訊錄獲取用戶名稱和手機(jī)號碼的實(shí)現(xiàn)思路,當(dāng)用戶點(diǎn)擊跳轉(zhuǎn)到通訊錄界面 并取通訊錄姓名和手機(jī)號碼 ,實(shí)現(xiàn)代碼簡單易懂,非常不錯感興趣的朋友一起看看吧2016-10-10Android使用ViewPager完成app引導(dǎo)頁
這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager完成app引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11