Acitivity的基本知识

7 篇文章 0 订阅
1 篇文章 0 订阅

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()
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值