大家好,我是小布丁。
在很多应用中都有跳转的功能,比如刚打开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弹出收到的消息。