目录
第三章
3.1Activity的基本用法
3.1.1设置主Activity
3.1.2在Activity中使用Toast
3.1.3在Activity中使用Menu
3.2销毁一个Activity
3.3使用Intent
3.3.1显示Intent
3.3.2隐式Intent
3.4向下一个Activity传递数据
3.5返回数据给上一个Activity
3.6Activity的生命周期
3.8标准函数
3.9静态方法
第三章
3.1Activity的基本用法
在onCreate()方法中,调用setContentView()方法传入一个布局文件的id。
在AndroidManifest.xml中的<application>标签内注册。
3.1.1设置主Activity
在标签内部加入<intent - filter>标签,并在<intent - filter>标签内部添加
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />这两句声明即可
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
...>
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3.1.2在Activity中使用Toast
静态方法makeText()创建出一个Toast对象,然后调用show() 将Toast显示出来。makeText()方法需要传入3个参数。第一个参数是Context,即Toast要求的上下文。第二个参数是Toast显示的文本内容。第三个参数是Toast显示的时长,有两个内置常量可以选择:Toast.LENGTH_SHORT(2秒)和Toast.LENGTH_LONG(3.5秒)。
Toast.makeText(this, "show msg", Toast.LENGTH_SHORT).show()
3.1.3在Activity中使用Menu
Menu resource file
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
onCreateOptionsMenu()方法。
在onCreateOptionsMenu()方法中编写的menuInflater使用了语法糖, 调用了父类的getMenuInflater()方法。getMenuInflater()方法能够得到一个MenuInflater对象,再调用它的inflate()方法,就可以给当前Activity创建菜单了。 inflate()方法接收两个参数:第一个参数用于指定通过哪一个资源文件来创建菜单,这里传入上文中创建的Menu resource file;第二个参数用于指定菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。最后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
3、 设置菜单的响应事件。
在onOptionsItemSelected()方法中,我们通过调用item.itemId来判断点击的是哪一个
菜单项。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.add_item -> Toast.makeText(this, "You clicked Add",
Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this, "You clicked Remove",
Toast.LENGTH_SHORT).show()
}
return true
}
3.2销毁一个Activity
除了使用返回键,还可以使用finish()方法。
btn.setOnClickListenter{
finish()
}
3.3使用Intent
Intent分为显示Intent和隐式Intent
3.3.1显示Intent
第一个参数context,即启动Activity的上下文;第二个参数Class用于指定想要启动的目标Activity,最后将构建好的intent传入startActivity()方法。
button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
3.3.2隐式Intent
AndroidManifest.xml文件中的<activity>标签下,配置能够响应的action和category。
<activity android:name=".FirActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
android.intent.category.DEFAULT是一种默认的category所以不用指定category
button1.setOnClickListener {
val intent = Intent("com.example.activitytest.ACTION_START")
startActivity(intent)
}
一个Intent只能指定一个action,但能指定多个catagory。
在<intent-filter>标签下注册category
<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.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
在Activity中指定多个category:
button1.setOnClickListener {
val intent = Intent("com.example.activitytest.ACTION_START")
intent.addCategory("com.example.activitytest.MY_CATEGORY")
startActivity(intent)
}
3.3.3更多隐式Intent用法
使用Intent启动其他程序的Activity :
button1.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
}
指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去,效果为打开系统浏览器进入百度页面。
除此之外还可以在<intent - filter>标签中配置<data>标签,用于更精确地指定当前Activity能够响应的数据。<data>标签中主要可以配置以下内容:
- android:scheme。用于指定数据的协议部分,如上例中的https部分。
- android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
- android:port。用于指定数据的端口部分,一般紧随在主机名之后。
- android:path 。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内 容。
- android:mimeType 。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有当<data>标签中指定的内容和Intent中携带的Data 完全一致时,当前 Activity 才能够响应
该 Intent。
<activity android:name=".ThirdActivity">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https" />
</intent-filter>
</activity>
3.4向下一个Activity传递数据
putExtra()方法。第一个参数是键,用于之后从Intent中取值,第二个参数才是真正要传递的数据。
button1.setOnClickListener {
val data = "Hello SecondActivity"
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("extra_data", data) // 第一个参数是键,第二个参数是要传递的数据
startActivity(intent) // 使用startActivity启动
}
2、使用getStringExtra()方法中传入键值将数据取出。
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
val extraData = intent.getStringExtra("extra_data") //使用getStringExtra方法取出
Log.d("SecondActivity", "extra data is $extraData")
}
}
3.5返回数据给上一个Activity
1、使用startActivityForResult()方法启动activity。startActivityForResult方法接收两个参数,第一个参数是intent;第二个参数是请求码
button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, 1) // 使用startActivityForResult启动activity
}
setResult()方法接收两个参数:第一个参数用于向上一个Activity返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值;第二个参数则把带有数据的Intent传递回去。最后调用finish()方法销毁当前Activity.
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
button2.setOnClickListener {
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
setResult(RESULT_OK, intent) // setResult方法返回数据
finish()
}
}
}
SecondActivity被销毁之后会回调上一个Activity的onActivityResult()方法,因此需要重写onActivityResult()方法。
onActivityResult()方法带有3个参数:第一个参数requestCode,即我们在启动Activity 时传入的请求码;第二个参数resultCode,即我们在返回数据时传入的处理结果;第三个参数data,即携带着返回数据的Intent。
由于在一个Activity中有可能调用startActivityForResult()方法去启动很多不同的Activity,每一个Activity返回的数据都会回调到onActivityResult()这个方法中,因此需要过检查requestCode的值来判断数据来源。确定数据是从SecondActivity返回的之后,通过resultCode的值来判断处理结果是否成功,最后将值取出。
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")
}
}
}
3.6Activity的生命周期
- onCreate()
- onStart()
- onReaume()
- onPause()
- onStop()
- onDestroy()
3.7Activity的启动模式
- standard 在standard模式下,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。
- singleTop 在启动Activity时如果发现返回栈的栈顶已经是该Activity,则直接使用它,不会再创建新的Activity实例。
- singleTask 每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。
- singleInstance 在这种模式下,会有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,都共用同一个返回栈。
3.8标准函数
with、run、apply
with函数:
val result = with(obj) {
// 这里是obj的上下文
"value" // with函数的返回值
}
run函数:
val result = obj.run {
// 这里是obj的上下文
"value" // run函数的返回值
}
apply函数:
val result = obj.apply {
// 这里是obj的上下文
}
// result == obj
3.9静态方法
Kotlin中实现静态方法的两种方式:注解和顶层方法
1、给单例类或companion object 中的方法加上@JvmStatic注解( @JvmStatic 注解只能加在单例类或 companion object 中的方法上)。
class Util {
fun doAction1() {
println("do action1")
}
companion object {
@JvmStatic
fun doAction2() {
println("do action2")
}
}
}
顶层方法指的是那些没有定义在任何类中的方法:
fun doSomething() {
println("do something")
}