Activity详解,Intent起到了什么作用?(二)

大家好,我是小布丁。

在很多应用中都有跳转的功能,比如刚打开B站的页面,一点击就能进入TB。。。广告虽然可恶,但是功能还是很实用的。那这个功能是怎么实现的呢?听我慢慢道来。

Activity(一)可以看这篇文章Activity详解,用最通俗的语言告诉你什么是Activity(一)

显式Intent

先创建一个新项目,目前项目中只有一个系统创建的MainActivity,在这个项目中创建另一个Activity,再学习如何跳转过去。

右击包名com.example.myapplication->New->Activity->Empty Views Activity,创建另一个Activity。这里没有修改默认名称,新创建的Activity改名为AnotherActivity。

图片

实现功能:在MainActivity的布局中加入一个按钮,点击这个按钮进入AnotherActivity:

修改activity_main布局文件为:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <Button
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:id="@+id/button1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="jump"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Button控件是按钮,android:id="@+id/button1" 给控件设置一个id,在MainActivity中通过控件的id获得控件,再给控件添加逻辑。android:text="jump" 表示按钮上的文字是jump。具体参数不明白没关系,我还会写一篇文章详细介绍一些常见控件的使用方法。可以订阅一下这个公众号,最新文章都会先发在这里。

接下来实现点击这个按钮就能跳转到MainActivity2的功能。点击按钮发生什么是逻辑上的行为,让我们把目光转回到MainActivity中,通过给button添加逻辑来实现跳转的功能。

图片

重点在后几行代码,我们来详细分析一下:

val button1:Button=findViewById(R.id.button1)

通过findViewById获取按钮控件,等之后学了viewBinding之后就可以直接获得控件啦,不过刚开始学用findViewById还是很好理解的。

button1.setOnClickListener{
    val intent=Intent(this,AnotherActivity::class.java)
    startActivity(intent)
}

button1.setOnClickListener{}点击button1后会执行{}中的逻辑,这块详细说开还挺复杂的,有人想看吗,留个言,有一个人想看我就写~

Intent的构造函数接受两个参数,第一个参数要求提供一个启动Activity的上下文,第二个参数用于指定想要启动的Activity。第一个参数this表示启动AnotherActivity的上下文是MainActivity,第二个参数表示要启动的Activity是AnotherActivity,写法记住就可以,Activity名称::class.java。

startActivity传入intent参数就可以启动AnotherActivity了。

看到这一步的朋友们可以试试,点击之后真的跳转啦!

隐式Intent

隐式Intent不会指明启动哪个Activity,而是根据action和category选择合适的Activity启动。

通过在<activity>标签下配置<intent-filter>的内容,可以指定当前Activity能够响应的action和category。

给AnotherActivity指定action和category:

图片

MainActivity启动action为"android.intent.action.FACTORY_TEST",category为"android.intent.category.DEFAULT"的Activity:

button1.setOnClickListener{
            val intent=Intent("android.intent.action.FACTORY_TEST")
            startActivity(intent)
        }

调用了Intent的另一个构造函数,传入action的内容,再调用startActivity启动intent。不知道大家有没有发现,在启动隐式Intent的时候,我们只指定了action的内容,没有指定category,其实"android.intent.category.DEFAULT"是默认的category,在调用startActivity之前会自动将这个category添加到intent中。所以可以省略,在这就已经启动了action为"android.intent.action.FACTORY_TEST",category为"android.intent.category.DEFAULT"的Activity。

在隐式Intent中,只能指定一个action,可以指定多个category,目前我们的intent只有一个默认的category,再添加一个category的用法为:

button1.setOnClickListener{
            val intent=Intent("android.intent.action.FACTORY_TEST")
            intent.addCategory("com.example.myapplication.JUMP")//添加的category
            startActivity(intent)
        }

注意:这时MainActivity启动action为"android.intent.action.FACTORY_TEST",category为"android.intent.category.DEFAULT"和"com.example.myapplication.JUMP"的Activity,此时AnotherActivity指定了action为"android.intent.action.FACTORY_TEST",category为"android.intent.category.DEFAULT",如果想点击按钮跳转AnotherActivity,还需要给AnotherActivity添加一个category:

图片

这样就没有问题啦!

使用Intent向下一个Activity传递数据

思路:调用intent的putExtra函数,把想要传递的数据暂时存到intent中,到下一个Activity再取出来。

还是用MainActivity和AnotherActivity来操作,在MainActivity启动AnotherActivity时,传递一个字符串"information":

MainActivity点击按钮后启动AnotherActivity并传递消息:

图片

intent调用putExtra函数传递消息,putExtra函数有两个参数,第一个参数相当于键,AnotherActivity取出消息时需要用到。第二个参数相当于值,我们把真正需要传递的信息放到这个参数里。

AnotherActivity提取消息:

图片

调用intent的getStringExtra传入键,获得信息。如果获取string的消息,调用getStringExtra,如果获取int的消息,调用getIntExtra,如果获取double的消息,调用getDoubleExtra。

下面那行代码是弹出获得的消息,具体使用方法我就不详细说了。

使用Intent回传消息给上一个Activity

思路:调用intent的putExtra函数,把想要传回的数据暂存到intent中,上一个Activity在onActivityResult函数中取出。

还是用MainActivity和AnotherActivity来操作,在MainActivity启动AnotherActivity时,调用startActivityForResult:

MainActivity点击按钮后启动AnotherActivity并期待收到消息:

图片

startActivityForResult的第一个参数是intent,第二个参数是requestCode,在收到消息时判断数据的来源。这里不明白没关系,后面讲到回调函数还会详细说的。

AnotherActivity传回消息:

图片

构建了一个Intent,把要传递的内容用putExtra函数传进去。再调用setResult函数,这个函数专门用于向上一个Activity传递数据。第一个参数向上一个Activity返回处理结果,一般只使用RESULT_OK和RESULT_CANCELED这两个值。第二个参数传入有数据的intent。最后调用finish销毁Activity。

MainActivity是调用startActivityForResult来启动AnotherActivity的,在AnotherActivity被销毁后ManinActivity会调用onActivityResult函数。因此我们需要在MainActivity中重写这个方法来处理返回的数据。

图片

onActivityResult有三个参数,第一个参数是requestCode,与startActivityForResult函数的requestCode参数相对应,一个Activity可能调用很多次startActivityForResult,这个参数来判断数据来源。第二个参数是resultCode,就是在AnotherActivity传回的处理结果,第三个参数是AnotherActivity传回的数据。再用Toast弹出收到的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值