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

文章目录

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


Intent

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

什么是 xml 文件?

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

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

Inten启动组件的方法:

组件名称方法名称
ActivitystartActvity()
startActivity()
ServicestartService()
bindService()
BroadcastssendBroadcasts()
sendOrderedBroadcasts()
sendStickyBroadcasts()

显式 Intent

定义两个 xml 文件

定义一个 first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/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="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_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="http://schemas.android.com/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 
//用于指定数据的协议部分,如http
android:host
//用于指定数据的主机名部分,如www.baidu.com
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()this
  • text:要显示的字符串。也可是 R.string字符串ID
  • duration:显示的时间长短。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

在这里插入图片描述

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析 我们来看一下 src/main/res 下的一些文件&#xff1a; .gradle 和 .idea &#xff1a;这两个目录下放置…

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log &#xff0c;该类提供了五个方法供我们打印日志&#xff1a; Log.v() &#xff1a;用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗&#xff1f;Activity 的状态及生命周期 Android 的应用程序运用 栈&#xff08;Back Stack&#xff09; 的思想来管理 Activity&#xff1a; …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard&#xff1a;默认的启动方式&#xff0c;每次启动一个活动都会重新创建singleTop&#xff1a;如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按钮EditText 控件&#xff1a;输入框ImageView 控件&#xff1a;图片ProgressBar 控件&#xff1a;进度条AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout &#xff1a;线性布局android:layout_gravity &#xff1a;控件的对齐方式android:layout_weight&#xff1a;权重RelativeLayout &#xff1a;相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout &#xff1a;帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限&#xff0c;能够一次性在屏幕上显示的内容不多&#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片&#xff08;Fragment&#xff09;实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片&#xff08;Fragment&#xff09; 我们在手机上看新闻可能是这样的&#xff1a; Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…

Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录拍照并保存到 ImageView 控件布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作隐式 Intent 启动后的回调AndroidManifest.xml从相册选取照片并在 ImageView 控件中显示布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作自定义打开相册的方法 op…

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例VideoView类播放视频的实例MediaPlayer类 对多种格式的音频文件提供了全面的控制方法&#xff1a; 如何获得MediaPlayer实例&#xff1f; 通过构造函数&#xff1a; MediaPlayer mp new MediaPlayer();调用 MediaPlayer.create() 方法&…

Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnection使用OkHttp封装网络操作封装HttpURLConnection封装OkHttpWebView WebView 可以在 应用程序中&#xff08;而不是浏览器&#xff09; 展示一些网页。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask使用服务框架启动/停止服务绑定/解绑服务服务的生命周期前台服务IntentService完整版下载示例下载过程的回调接口&#xff1a;DownloadListener继承 AsyncTask 实现下载功能&#xff1a;Dow…

2020德勤面试开始了吗_2020国考面试开始,近期面试公告汇总,附结构化小组面试流程...

2020年国家公务员考试面试环节逐步恢复考试&#xff0c;各个招录部门已经发布面试考察公告&#xff0c;对于进入面试环节的国考考生来说&#xff0c;有必要了解近期国考面试的招录动态&#xff0c;提前做好面试准备。2020国考国家统计局机关面试面试确认&#xff1a;请进入面试…

项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

项目实施过程中&#xff0c;项目经理常常面临一个重大挑战——需求变更。需求变更无处不在&#xff0c;市场条件变化、新业务出现、战略目标调整、客户需求修改、资源限制等&#xff0c;都会造成需求变更。需求变更会影响项目的时间、成本和质量&#xff0c;对整个项目和团队成…