700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android 入门(四) | Intent 实现 Activity 切换

Android 入门(四) | Intent 实现 Activity 切换

时间:2024-03-04 06:26:02

相关推荐

Android 入门(四) | Intent 实现 Activity 切换

文章目录

Intent显式 Intent定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数定义两个 Activity隐式 Intent更多隐式 Intent 的用法用隐式 Intent 打开系统浏览器自建 Activity 以响应打开网页的 Intent向下一个活动传递数据返回数据给上一个活动

Intent

如何在切换Actiity时携带数据是一个重要问题。我们定义两个xml文件,通过Intent实现在活动间跳转。

什么是xml文件?

xml即可扩展标记语言,是互联网数据传输的重要工具,它可以跨越互联网任何的平台,在服务器之间穿梭结构化数据,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。

xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。xml是标准通用标记语言(SGML)的子集,非常适合Web传输。

Inten启动组件的方法:

显式 Intent

定义两个 xml 文件

定义一个first_layout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击有惊喜~"></Button></LinearLayout>

定义一个second_layout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SecondActivity"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:id="@+id/button_2"android:text="再点一次~"></Button></LinearLayout>

android:orientation

orientation定义了页面组件排列方式是垂直(vertical)还是水平(horizontal)

match_parent 和 wrap_content

Android中所有的控件都具有layout_widthlayout_height这两个属性,可选值有3种:match_parentfill_parentwrap_content

其中match_parentfill_parent的意义相同,但官方更推荐match_parent

match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。wrap_content表示让当前的控件大小能够刚好包含里面的内容,也就是由控件内容决定当前控件的大小。

Intent函数

Intent函数接收两个参数:

第一个参数Context为上下文,一般使用this即可。第二个参数为要启动的目标Activity

函数内部调用了ComponentName函数,该函数可以启动其他应用的 Activity、Service:

pkg:Activity、Service 所在应用的包名。cls:Activity、Service 的包名+类名。

定义两个 Activity

MainActivity

package com.example.intent_test;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.first_layout);Button button1 = (Button)this.findViewById(R.id.button_1);button1.setOnClickListener((View view)->{// 显式IntentIntent intent = new Intent(this, SecondActivity.class);this.startActivity(intent);});}}

SecondActivity

package com.example.intent_test;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.second_layout);Button button2 = (Button)this.findViewById(R.id.button_2);button2.setOnClickListener((View view)->{// 显式IntentIntent intent = new Intent(this, MainActivity.class);this.startActivity(intent);});}}

定义两个 Activity 之后,我尝试运行时曾出现报错,原因是修改AndroidManifest.xml文件时不小心删了一段配置代码……所以说还是能不碰AndroidManifest.xml就不碰它(对于新手而言),如果有同学也出现报错,可以参考一下我的AndroidManifest.xml,检查一下自己的是否有问题:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.intent_test"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Intenttest"><activity android:name=".SecondActivity"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

运行结果:

运行MainActivity

点击之后跳转:

点击再点一次后回跳回图一。

隐式 Intent

AndroidManifest.xml中修改.SecondActivityactivity属性:

action标签指定当前活动可以响应com.example.activitytest.ACTION_START这个活动,而category标签包含一些附加信息,表明只有在actioncategory中的内容同时匹配上Intent的内容的时候,SecondActivity才可以响应Intent

first_layout.xml中添加第二个按钮,(因为 Android 布局界面和业务逻辑分离,因此本质上是在MainActivity的页面布局上添加button3):

MainActivity中为button3绑定隐式Intent

即使不为Intent指定category标签(未调用addCategory()),它也会在调用startActivity()方法时自动添加默认的category(即android.intent.category.DEFAULT)。

每个 Intent 中只能指定一个 action,但却能指定多个 categoryo 。

运行结果:

更多隐式 Intent 的用法

用隐式 Intent 打开系统浏览器

指定Intent.ACTION_VIEWaction,这是一个 Android 统内置的动作,常量值为android.intent.action.VIEW,然后通过Uri.parse方法,解析网址成一个Uri对象,调用setDate将其传递进去。

setData方法可以接受一个Uri对象,指定当前Intent正在操作的数据。通常数据都是以字符串的形式传入到Uri.parse方法中解析产生。

自建 Activity 以响应打开网页的 Intent

与之对应,我们可以在<intent-filter>标签中再配置一个<data>标签,用于更加精确地指定当前活动能够响应什么类型的数据。下面是<data>标签中可以配置的内容:

android:scheme //用于指定数据的协议部分,如httpandroid:host//用于指定数据的主机名部分,如android:port//用于指定数据的端口部分,一般跟随在主机名后android:path//用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容android:mimeType//用于指定可以处理的数据类型,允许使用通配符的方式进行指定

新建ThirdActivity,无需添加多余代码,默认样式即可:

重点在于修改AndroidManifest.xmlThirdActivity的配置:

Intent 只有一个 action 标签,但可以有多个 category 标签。

<action android:name="android.intent.action.VIEW" />

出现该action标签必须配置下面的category标签,否则会报错:

<category android:name="android.intent.category.BROWSABLE" />

android:scheme的值由被打开网页的Url决定:

<data android:scheme="http" />

运行结果:

但实际上通过自定义的 Activity 打开是没有任何内容的,因为我们没有配置相应的xml布局也没有丰富ThirdActivity的逻辑代码:

向下一个活动传递数据

两个 Activity 之间传递数据也是使用 Intent,通过putExtra()方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动之后,只需要把这些数据再从 Intent 中取出就可以了。

Intent.putExtra(String name, @Nullable String value) :向 Intent 中写入数据。Intent.getxxxExtra:向 Intent 中取得数据。

MainActivity中有一个字符串,现在想把它传递到下一个活动当中:

然后在SecondActivity中取出数据:

首先通过getIntent方法获取到用于启动SecondActivityIntent;然后调用getStringExtra方法,传入相应的键值(即消息的名称),就可以得到相应的数据了;Log.d用于打印日志以便于寻找bug.show()用于显示Toast信息。

Toast.makeText是 Andriod 的消息模式:

context:当前的上下文环境。可用getApplicationContext()thistext:要显示的字符串。也可是R.string字符串IDduration:显示的时间长短。Toast默认的有两个LENGTH_LONGLENGTH_SHORT,也可以使用毫秒如 2000ms。

运行结果:

返回数据给上一个活动

SecondActivity中构建一个Intent用于传递数据,然后调用了setResult方法,这个方法专用于向上一个活动返回数据,它有两个参数:

public final void setResult(int resultCode, Intent data) {synchronized (this) {mResultCode = resultCode;mResultData = data;}}

resultCode:用于向上一个活动返回处理结果,一般只用RESULT_OK或者RESULT_CANCELED这两个值;data:将带有数据的Intent传递回去。

通过finish()方法来销毁活动,也可以使用回退键销毁活动,但要重写一下onBackPressed方法:

接下来实现对MainActivity的编写:

Activity中有startActivityFroResult方法,也是用于启动活动的,且在活动销毁时返回一个结果给上一个活动。该方法接受两个参数:

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {startActivityForResult(intent, requestCode, null);}

Intent:启动的 Activity;requestCode:请求码,用于在之后的回调中判断数据来源。

startActivityForResult方法在SecondActivity活动销毁之后会回调MainActivity活动的onActivityResult方法,因此需要在MainActivity中重写来得到返回的数据。onActivityResult方法有三个参数:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {}

请求码requestCode:就是startActivityForResult中传入的int值;resultCode:返回数据时传入的处理结果;data:携带着返回数据的Intent

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。