在 Android 中,界面的跳转通常是通过启动不同的 Activity 来实现的,下面介绍一下 Activity 的启动方法。

显式调用

显式调用,字面意思即”明显的调用“,我们可以在调用方法中明确的知道我们即将启动的 Activity,显示调用的具体方法如下:

val intent = Intent(this, SecondActivity::class.java)
// SecondActivity::class.java 相当于Java中的 SecondActivity.class
startActivity(intent)

我们需要构建一个 Intent 对象,第一个参数传入 this 即当前 Activity 的上下文,第二个对象传入 SecondActivity::class.java 作为目标 Activity,这样我们的意图就很明显,即我们想跳转到 SecondActivity 这个界面,我们只需要调用 startActivity 这个函数就可以达到我们的目的了。

隐式调用

隐式调用与显式调用相反,它没有明确的说明要跳转到哪个 Activity,而是通过 action, category **[ˈkætəɡəri] ** 和 data 这三个过滤信息由系统去匹配复合条件的 Activity。

为 Activity 设置过滤信息

如果我们想要通过隐式调用去启动一个 Activity,我们首先要为这个 Activity 设置过滤信息,否则是不能通过隐式调用去启动这个 Activity 的。过滤信息在 AndroidMainfest.xml 文件中注册 Activity 时设置,通过在 <activity> 标签下配置<intent-filter> 的内容,可以指定当前Activity能够响应的action,category和data。

<activityandroid:name=".activity.SplashActivity"android:theme="@style/SplashTheme"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><dataandroid:host="room.join"android:scheme="bjhlliveapp" /></intent-filter>
</activity>

当使用隐式调用启动 Activity 时,需要同时匹配 action,category 和 data,否则匹配失败。一个 <intent-filter>下的 action,category 和 data 可以有多个,一个 activity 可以有多个 <intent-filter> 标签,只要成功匹配其中任意一个<intent-filter>中的信息即可匹配成功。

下面详细说明一下各种信息的匹配规则。

action

action 是一个字符串**(区分大小写)**,系统已经为我们预定义了一些 action,如 android.intent.action.MAIN 等,同时我们也可以自己定义 action,一个<intent-filter> 下可以有多个 action。

当我们使用隐式调用时 Intent 中必须指定 action,当 action 和 activity 的 <intent-filter> 中任意一个 action 相同**(字符串的值相同)**时,匹配成功。

category

category 和 action 一样是一个字符串,同时系统中有定义的 category,我们也可以自己定义 category,但是如果想让一个 activity 支持隐式调用,那么必须在<intent-filter> 中指定 “android.intent.category.DEFAULT” 这个 category。

category 的匹配规则与 action 不同,隐式调用时 Intent 中必须指定 action,但可以没有 category,但是如果指定了 category (可以是一个或多个),那么所有指定的 category 都要和<intent-filter> 中的 category 相同,否则匹配失败。

用通俗的话来讲,category 你可以不指定**(如果不指定一定可以匹配成功)**,但是一旦你指定了,你就要保证你指定的这些 category 都要和你即将启动的 activity 中某一个 <intent-filter> 中的category 相同。

为什么不指定反而可以匹配成功呢?因为前面说了如果 activity 支持隐式调用,则一定要有 “android.intent.category.DEFAULT” 这个 category,系统在调用 startActivity 或者 startActivityForResult 的时候会默认为 Intent 加上 “android.intent. category.DEFAULT” 这个category,所以可以匹配成功。

data

data 的语法结构如下:

<data android:scheme="string"android:host="string"android:port="string"android:path="string"android:pathPattern="string"android:pathPrefix="string"android:mimeType="string" />

data 由两部分组成,mimeType 和 URI。mimeType 指媒体类型,比如image/jpeg、audio/mpeg4-generic 和 video/* 等,可以表示图片、文本、视频等不同的媒体格式,而URI中包含的数据就比较多了,下面是URI的结构:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

例如:

content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

URI 中每个数据的含义如下:

  • Scheme:URI 的模式,比如http、file、content 等,如果 URI 中没有指定scheme,那么整个 URI 的其他参数无效,这也意味着 URI 是无效的。
  • Host:URI 的主机名,比如 www.baidu.com,如果 host 未指定,那么整个 URI 中的其他参数无效,这也意味着 URI 是无效的。
  • Port:URI 中的端口号,比如80,仅当 URI 中指定了 scheme 和 host 参数的时候 port 参数才是有意义的。
  • path、pathPattern 和 pathPrefix:这三个参数表述路径信息,其中 path 表示完整的路径信息;pathPattern 也表示完整的路径信息,但是它里面可以包含通配符 “*”,“*” 表示0个或多个任意字符,需要注意的是,由于正则表达式的规范,如果想表示真实的字符串,那么“*” 要写成“\*”, “\”要写成“ \\\”;pathPrefix 表示路径的前缀信息。

data 的匹配规则较为复杂,但总的来说就是 Intent 中的 data 必须和 <intent-filter> 中的一致,如果 <intent-filter> 中没有,则 Intent 也没有,如果 <intent-filter> 中有,则 Intent 中必须有切必须和 <intent-filter> 中相同。

调用方法

val intent = Intent("android.intent.action.CPW")
// intent 构造函数指定 action
intent.addCategory("android.intent.category.DEFAULT")
// addCategory 方法指定category
intent.setDataAndType(Uri.parse("file://abc"), "text/plain")
// setDataAndType 方法指定data,参数为 URI 和 mimeType
startActivity(intent)

以上就是关于 Activity 启动方法的全部内容了!

Activity的启动方法相关推荐

  1. AndroidStudio安卓原生开发_Activity的启动方法_3种activity的启动方法_显示启动Activity---Android原生开发工作笔记82

    暂时不写内容,后边补上,因为工作太忙,先把图,以及重要的难点说明写出来,后边会修改成详细的文章 intent意图,机制,可以实现activity,不同组件之间通讯需要用intent

  2. Android开机启动Activity或者Service方法

    这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

  3. Activity详解Activity的使用步骤、生命周期及其启动模式、启动方法

    开始我们先来回顾一下Activity的基础知识: Activity是应用程序的表现层,应用程序中可以包含多个Activity,它们之间可以相互跳转,来达到手机屏幕的切换.Activity通过View来 ...

  4. 源码分析-Activity的启动流程

    以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...

  5. Android Activity的onRestart()方法

    先说下Activity 几种情况的生命周期流程 1 Activity 第一次启动的时候生命周期 onCreate----->onStart------>onResume 2 锁屏的时候 o ...

  6. 【拒绝一问就懵】之Activity的启动流程

    背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...

  7. Activity A 启动 Activity B 生命周期

    Activity A启动 B: A.onPaunse - B.onCreate - B.onStart - B.onResume - A.onstop 2021-02-26 16:26:34.578 ...

  8. Android 四大组件之——Acitivity(三) 深入了解Activity的启动流程

    上图为整个Activity的启动流程 接下来我们大概分析 在我们的Android系统中,应用程序是由Launcher这个应用启动起来的.当我们安装好应用程序之后,就会在Launcher的界面上生成一个 ...

  9. Activity的启动过程(源码API27)

    Oreo -> Android8.1 -> API level 27 启动activity的方式有以下几种: 1.在应用程序中startActivity()或startActivityFo ...

最新文章

  1. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
  2. 计算机组成原理——指令流水线
  3. C++ struct结构体 实现搜索二叉树(BST)
  4. hadoop namenode管理元数据机制
  5. MVC3.0 将网站设为首页和加为收藏的实现(IE/Firefox)
  6. Android自定义滑动进度条,Android自定义View实现圆形水波进度条
  7. Intel超线程技术 Hyper-Threading Technology (2) - 早期实现 - 概述
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的共享自习室预约管理系统
  9. DateTimeFormat注解
  10. Vue 学习笔记(1) Vue 基础语法 + Axios 基本使用
  11. 【NOIP2001】【Luogu1029】最大公约数和最小公倍数问题(GCD,枚举)
  12. 关于单细胞批次矫正那些事(二) KBET 用于单细胞批次矫正结果的评估
  13. Spark与深度学习框架——H2O、deeplearning4j、SparkNet
  14. hardmard积 用什么符号表示_[关于数学哲学的科普]为数学学习准备的基础数理逻辑(用自然推理系统展现的命题演算以及一阶谓词演算)...
  15. opencv函数速查笔记
  16. [Unity3D]推荐几个不错的网站
  17. PS 批处理切图去空白
  18. 穷爸爸富爸爸的作者破产了,这本书是垃圾还是宝藏?
  19. matlab复数信号_信号之间的时延估计(续)
  20. selenium模拟登陆之截屏验证码位置跑偏

热门文章

  1. 前度字符串转数组_“薛姨妈”的生日和“尤氏”产育——概念数组与《石头记》藏代修辞格...
  2. 关于Scroller ,scrollTo,scrollBy
  3. 初中毕业能报考成人大专吗 可以选择什么专业
  4. 有一种浪漫,叫淡定从容
  5. CPLD/FPGA/Verilog_Verilog指令_assign用法
  6. nginx简要使用与各个配置说明
  7. python蓝牙模块
  8. nga怀旧服服务器维护,魔兽世界怀旧服:怀旧服1年暴雪热修的那些“BUG”
  9. 数据库中where和having区别
  10. Maven打包出现错误:“There aretest failures”