2023年9月21日 星期四

【Android】Intent (意圖)


類型

  • 隱含(implicit)意圖 : 告知系統動作的類型,讓系統判斷如何完成要求。
  • 明確(explicit)意圖 : 明確告知要啟動的 Activity 。

傳送 Intent


val b = Bundle()
b.putString("key", "Hello~") //把資料放入 Bundle 中
val intent = Intent(this, Main2::class.java) //宣告切換頁面的意圖
intent.putExtras(b) //夾帶 Bundle
startActivity(i)

在 adapter 中使用 context


override fun onBindViewHolder(holder: LetterViewHolder, position: Int) {
    val item = list.get(position)
    holder.button.text = item.toString()
    holder.button.setOnClickListener {
        val context = holder.itemView.context
        val intent = Intent(context, DetailActivity::class.java)
        intent.putExtra("latter", holder.button.text.toString())
        context.startActivity(intent)
    }
}

取出 Bundle 中的資料


intent?.extras?.let{
    val value1 = it.getInt("key1")
    val value2 = it.getString("key2")
}

返回資料 startActivityForResult() (不建議使用此方式)

1. 在第一個 Activity 建立 Intent、 啟動第二個 Activity

val b = Bundle()
b.putString("key", "Hello~") //把資料放入 Bundle 中
val intent = Intent(this, Main2::class.java) //宣告切換頁面的意圖
intent.putExtras(b) //夾帶 Bundle
startActivityForResult(intent, 1)

2. 在第二個 Activity 中接收資料與設定要返回的資料、結束第二個 Activity

intent?.extras?.let {
    val value1 = it.getString("key")
    
    val b = Bundle()
	b.putString("key", "Hi~")
    val intent = Intent().putExtrras(b)
	setResult(Activity.RESULT_OK, intent)
    finish()
}

3. 在第一個 Activity 中取得返回的資料

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    data?.extras?.let {
        if (requestCode==1 && resultCode== Activity.RESULT_OK){
            //取得返回的資料
            val value = it.get("key")
            Log.d("value", value.toString())
        }
    }
}

取得活動結果 (推薦)


隱式意圖使用方式

//開啟網站
val queryUrl: Uri = Uri.parse("${DetailActivity.SEARCH_PREFIX}${item}") 
val intent = Intent(Intent.ACTION_VIEW, queryUrl)
常用意圖 : 通用 Intent  |  Android 开发者  |  Android Developers

檢查是否有應用程式可以處理此意圖

如果沒有能處理的,可能會當機。
if (activity?.packageManager?.resolveActivity(intent, 0) != null) {
    startActivity(intent)
}

參考資料

0 comments:

張貼留言