Activity是什么
它是一种可以包含用户界面的组件,主要用于和用户交互。
Activity的使用
加载布局
在onCreate方法中使用setContentView方法加载布局。
setContentView(R.layout.activity_main);
注册Activity
所有的Activity都要在AndroidManifest.xml中进行注册:
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
其中<intent-filter>
标签中的两句代码是指定当前Activity为启动应用程序的首界面。
销毁一个Activity
我们可以通过返回键或者使用finish()
方法
Intent
Intent是各组件之间交互的一种重要方式,可以指明需要执行的动作,也可以在各组件之间传递数据。
一般可用于启动Activity、Service以及发送广播等。
显式Intent
这种方式很明显地表达出我们的“意图”,所以称之为显式Intent。
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
首先我们通过Intent的构造函数构建出一个“意图”,第一个参数是上下文,第二个参数就是目标Activity。然后通过startActivity()
方法即可启动目标Activity。
隐式Intent
隐式Intent并没有明确地指出想要启动哪一个Activity,而是需要去指定一系列的action和category等信息,然后由系统去分析这个Intent,并启动相应的Activity。
启动本应用程序中的Activity
为了能响应隐式Intent,我们需要去AndroidManifest中给activity指定相应的action和category,如下:
<activity
android:name=".SecondActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在<action>
标签里我们指明了可以响应的action,即com.example.activitytest.ACTION_START
。
<category>
标签里则是一些附加的信息。
只有这两个标签中的内容同时匹配Intent中指定的action和category时,该Activity才能够响应该Intent。
此时构建Intent方法如下:
val intent = Intent("com.example.activitytest.ACTION_START")
由于我们指定的category是使用的DEFAULT,是一种默认的category,所以无需手动指定。
然而一个Intent只能指定一个action,不过可以指定多个category。
<category android:name="com.example.activitytest.MY_CATEGORY" />
此时调用Intent的addCategory()方法指定category,如下:
val intent = Intent("com.example.activitytest.ACTION_START")
intent.addCategory("com.example.activitytest.MY_CATEGORY")
启动其他应用程序中的Activity
比如需要在应用中展示一个网页的时候,可以调用系统的浏览器来打开该网页即可,如下:
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
这里使用了setData()
方法,它接收一个Uri对象,用于指定当前Intent正在操作的数据,这些数据通常以字符串的形式传入Uri.parse()
方法中解析产生的。
Intent传递数据
使用Intent的puExtra()方法,以键值对的形式:
intent.putExtra("data","from FirstActivity")
在目标Activity中取出:
intent.getStringExtra("data")
intent实际用的是getIntent()
方法,只不过Kotlin写法不同。
返回数据给上一个Activity
FirstActivity
这就需要在启动下一个Activity的时候用startActivityForResult()
方法,它有两个参数,第一个是Intent,第二个是请求码。
startActivityForResult(intent, 1)
请求码只要是唯一的就行,需要在回调的时候用到。
SecondActivity
val intent = Intent()
intent.putExtra("data","from SecondActivity")
setResult(RESULT_OK, intent)
finish()
这里需要构建Intent,然后传入数据,再调用setResult()
方法,此方法是专门用于向上一个Activity返回数据的,它的第一个参数是返回处理结果,一般使用RESULT_OK或RESULT_CANCELED;第二个参数是Intent。
回到FirstActivity
当SecondActivity销毁时,会回调到上一个Activity的onActivityResult()
方法中,即FirstActivity。所以我们需要重写该方法,它有三个参数,分别是请求码、返回处理结果、返回的数据(由Intent携带)。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
1 -> if(resultCode == RESULT_OK){
val Data = data?.getStringExtra("data")
Log.d("FirstActivity", "data is $Data")
}
}
}
requestCode即为我们在FirstActivity中发出的请求码,而resultCode是SecondActivity返回的处理结果。
因为我们从FirstActivity前往SecondActivity的时候使用的请求码是1,所以返回时就可以由请求码1来判断是否是从SecondActivity返回的。
在SecondActivity中可以通过点击事件返回,但如果用户用的是手机的back键返回,就需要监听onBackPressed()
方法了,如下:
override fun onBackPressed() {
val intent = Intent()
intent.putExtra("data","from SecondActivity")
setResult(RESULT_OK, intent)
finish()
}