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启动组件的方法:
组件名称 | 方法名称 |
---|---|
Activity | startActvity() |
startActivity() | |
– | – |
Service | startService() |
bindService() | |
– | – |
Broadcasts | sendBroadcasts() |
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_width
和 layout_height
这两个属性,可选值有3种:match_parent
、fill_parent
、wrap_content
。
其中 match_parent
和 fill_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
中修改 .SecondActivity
的 activity
属性:
action
标签指定当前活动可以响应 com.example.activitytest.ACTION_START
这个活动,而 category
标签包含一些附加信息,表明只有在 action
和 category
中的内容同时匹配上 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_VIEW
为 action
,这是一个 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.xml
中 ThirdActivity
的配置:
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
方法获取到用于启动SecondActivity
的Intent
; - 然后调用
getStringExtra
方法,传入相应的键值(即消息的名称),就可以得到相应的数据了; Log.d
用于打印日志以便于寻找bug
;.show()
用于显示Toast
信息。
Toast.makeText
是 Andriod 的消息模式:
context
:当前的上下文环境。可用getApplicationContext()
或this
;text
:要显示的字符串。也可是R.string
中字符串ID
;duration
:显示的时间长短。Toast
默认的有两个LENGTH_LONG
和LENGTH_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
。
运行结果:
Android 入门(四) | Intent 实现 Activity 切换相关推荐
- Android 5.1系统手机Activity切换透明可以看到桌面
Android 5.1系统手机Activity切换透明可以看到桌面 需要解决的问题 我们在开发时,在部分手机中进行Activity跳转,我们会先看到该手机的桌面然后才会看到我们需要跳转的Activit ...
- Android入门(四)——页面跳转
目录 一.如何创建多个页面 二.如何进行页面跳转 1.传递参数方式一 2.传递参数方式二(传递多个参数) 三.设置页面自动跳转(用到线程) 四.Activity生命周期 一.如何创建多个页面 一个ac ...
- Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解
在Android中,Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任. 一般情况下,使用Intent对象进行简单窗口切换的代码如下: Intent i=new Int ...
- [android] 练习样式主题自定义activity切换动画
主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" en ...
- Android入门(五) | Activity 的生命周期
文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗? Activ ...
- Android 入门之Intent应用
1.显示Intent Intent intent=new Intent(RequestActivity.this,ResultActivity.class); startActivity(intent ...
- Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧
文章目录 Activity 的启动模式 standard singleTop singleTask singleInstance 技巧 了解当前界面是哪个 Activity 随时随地退出程序 启动活动 ...
- 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity
问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...
- Android入门篇(四):自动拨打电话、手动拨打电话
Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...
最新文章
- Python Multiprocessing with PyCUDA
- HDU 2202 计算几何
- python __future__ 的几种特性
- 2020 年热门编程语言的发展方向
- MiniDao Framework 1.3.0 发布,J2EE持久化解决方案
- iOS 14.5新功能:解锁iPhone更方便!
- 6月14日Linux设备驱动开发免费讲座PPT
- HTML5在线编辑器Wysihtml5之Bootstrap扩展
- 手动杀毒,SOLA病毒(也称之为worm.script.bat.Agent、Trojan.Win32.Sola病毒)
- flash视频的param属性解释
- MTK最新工具(刷机,写号,升级等)合集含工具源码
- 案例推荐《微博:随时随地迎战大流量》
- 柳传志二十年驭人成就柳氏联想
- 提高多表关联数据查询效率
- Python字符串地常规操作:取值,切片,查找,替换,分割,拼接,转义
- HyperX Alloy Mars2游戏机械键盘,深耕专业电竞机游戏械键盘
- 中型研发组织管理之--选择人
- tws蓝牙耳机哪个牌子好?2022蓝牙耳机排行榜
- js 你知道为什么[]==![]是成立的吗(强制类型转换)
- 2021最稳C/C++学习路线
热门文章
- mysql获取当前时间毫秒_MySQL性能指标及计算方法
- 零基础Unreal Engine 4(UE4)图文笔记之粒子系统
- 详细js读取execl内容并展示
- 【转】Net Framework,Net Core 和 Net Standard 区别
- libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...
- vs c语言 多线程demo,一个多线程的Socket通信Demo(C语言实现)
- python需要配置环境变量吗_python需要设置哪些环境变量?我只知道一个PYTHONHOME指向安装目录。(python详细安装教程 path)...
- 【Python学习】 - 手写数字识别 - python读入mnist数据集的多种方法
- 【POJ - 3159】Candies (差分约束,卡SPFA)
- 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)