Intent

   阅读量:  

Intent

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动Activity、启动Service以及发送广播等场景。Intent大致可以分为两种:显式Intent和隐式Intent。我们先来看一下显式Intent如何使用。

显式Intent

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class<?> cls)。这个构造数接收两个参数:第一个参数Context要求提供一个启动Activity的上下文;第二个参数Class用于指定想要启动的目标Activity,通过这个构造函数就可以构建出Intent的“意图”。

1
2
3
4
5
button1.setOnClickListener {
    val intent = Intent(this, SecondActivity::class.java)
    intent.putExtra("extra_data", data)
    startActivity(intent)
}

更好的Activity启动方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class SecondActivity : BaseActivity() {
    companion object {
        fun actionStart(context:Context,data1:String,data2:String){
            val intent = Intent(context,SecondActivity::class.java)
            intent.putExtra("param1",data1)
            intent.putExtra("param2",data2)
            context.startActivity(intent)
        }
    }
}

Intent接收

1
2
3
4
5
6
7
class SecondActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.second_layout)
		val extraData = intent.getStringExtra("extra_data")
	}
}

隐式Intent

相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出想要启动哪一个Activity,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的Activity去启动。

1
2
3
4
5
6
7
<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.MY_CATEGORY" />
    </intent-filter>
</activity>

只有<action>和<category>中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应该Intent。

1
2
3
4
button1.setOnClickListener {
    val intent = Intent("com.example.activitytest.ACTION_START")
startActivity(intent)
}

每个Intent中只能指定一个action,但能指定多个category。目前我们的Intent中只有一个默认的category,那么现在再来增加一个吧。

1
2
3
4
5
button1.setOnClickListener {
    val intent = Intent("com.example.activitytest.ACTION_START")
    intent.addCategory("com.example.activitytest.MY_CATEGORY")
    startActivity(intent)
}

更多隐式Intent的用法

1
2
3
4
5
6
7
8
button1.setOnClickListener {
    val intent = Intent(Intent.ACTION_VIEW)
    //语法糖替代setData()	
    //val intent = Intent(Intent.ACTION_DIAL)
    //intent.data = Uri.parse("tel:10086")
    intent.data = Uri.parse("https://www.baidu.com")
    startActivity(intent)
}

Intent返回数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
val toNormalActivity= registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
    when(it.resultCode){
        RESULT_OK -> {
            val data=it.data?.getStringExtra("data_return")
            Log.d("NormalActivity","return data is $data")
        }
    }
}
binding.startNormalActivity.setOnClickListener {
    val intent=Intent(this,NormalActivity::class.java)
    intent.putExtra("extra_data","Hello NormalActivity")
    toNormalActivity.launch(intent)
}
1
2
3
4
5
6
override fun onBackPressed() {
    super.onBackPressed()
    val intent = Intent()
    intent.putExtra("data_return", "Hello FirstActivity")
    setResult(RESULT_OK, intent)
    finish()
Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 24, 2022 22:59 +0800