Android到底那个Acitivity启动

启动那个Acitivity有两种方式:implicit(隐藏) intent 和 explicit(明确) intent

Explicit Intent

明确的指定了要启动的Acitivity 
比如以下Java代码,明确指定了要启动B: 
Intent intent= new Intent(this, B.class) 

 

Implicit Intent


没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

当使用startActivity时,隐式Intent解析到一个单一的Activity。如果存在多个Activity都有能力在特定的数据上执行给定的动作的话,Android会从这些中选择最好的进行启动。

 

Implicit Intent 到底发给哪个activity?

这需要进行三个匹配,一个是action,一个是category,一个是data。根据三个的匹配结果,找到应该启动的Activity。

 

Action Implicit Intent

动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。

一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。

<intent-filter>元素中可以包括子元素<action>,比如: 
<intent-filter> 
<action android:name=”com.example.project.SHOW_CURRENT” /> 
<action android:name=”com.example.project.SHOW_RECENT” /> 
<action android:name=”com.example.project.SHOW_PENDING” /> 
</intent-filter> 
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。

Category Implicit Intent

种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。

<intent-filter>元素可以包含<category>子元素,比如: 
<intent-filter . . . > 
<category android:name=”android.Intent.Category.DEFAULT” /> 
<category android:name=”android.Intent.Category.BROWSABLE” /> 
</intent-filter> 
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。

Data Implicit Intent

Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。

  • mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。
  • scheme是URI部分的协议——例如,http:,mailto:,tel:。
  • host-name或“data authority”是介于URI中scheme和path之间的部分(例如,www.google.com)。匹配主机名时,Intent Filter的scheme也必须通过匹配。
  • 数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。

数据在<intent-filter>中的描述如下: 
<intent-filter . . . > 
<data android:type=”video/mpeg” android:scheme=”http” . . . /> 
<data android:type=”audio/mpeg” android:scheme=”http” . . . /> 
</intent-filter> 
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。

解析出来后的处理逻辑

如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Android Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。

Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。

 

 

应用程序的启动

AndroidManifest.xml 文件中,把那个 activity 配置了 <action android:name="android.intent.action.MAIN" /> ,那就就是最先被启动的 Activity ,如果多个设置了,则第一个设置的是最新被启动的 Activity。

如下图设置,是 .SplashActivity 先启动的

上面代码中的

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="ghj1976.HelloWorld" android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk android:minSdkVersion="3" />
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".HelloWorldActivity" android:label="@string/app_name">
		</activity>
		<activity android:name=".SplashActivity" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
</manifest>
 

activity android:name:  activity 的类名,必须有。

android.intent.action.MAIN   决定应用程序最先启动的Activity

android.intent.category.LAUNCHER     决定应用程序是否显示在程序列表里

 

参考资料

Intent Filter匹配

http://www.moandroid.com/?p=1651

什么时候加上android.intent.category.DEFAULT和LAUNCHER

http://www.crazydevelop.com/content.aspx?ID=6416

Android 开发之:Intent.createChooser() 妙用

http://www.oschina.net/bbs/thread/9299

《Cesium 基础知识点》- 申请 Cesium Ion 密钥 一、访问 https://cesium.com/ion/signin/tokens 二、登录/注册 三、申请 四、使用 // 密钥 let defaultAccessToken = 'your token string'; // 设置 Cesium.Ion.defaultAccessToken = defaultAccessToken; // 初始化 let viewer = new Cesium.Viewer('cesiumContainer', {}); ... 阅读详情

相关推荐

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

Android理解:显式和隐式Intent

Intent是Android初学者比较难理解的一个东西。我这里以通俗易懂的语言和通俗易懂的代码,让初学者简单感受一下Intent。intent就是意图的意思。Intent分两种:显式(Explicit intent)和隐式(Implicit intent)。 一、显式(设置Component) 显式,即直接指定需要打开的activity对应的类。 以下多种方式都是一样的,实际上都是设置C...

移动编程 683

手把手教你用Deep Single-Image Portrait Relighting实现人像光影重塑(附GitHub代码)

本文提供了一份详细的实战指南,手把手教你利用Deep Single-Image Portrait Relighting技术实现人像光影重塑。文章从环境搭建、核心原理拆解出发,逐步指导构建简易重光照流程,并探讨了使用预训练模型进行效果优化的进阶方法,最后附上避坑指南与常见问题排查,帮助开发者快速上手这一AI图像处理技术。

weixin_29065015的博客 315

Implicit Intent--含蓄的intent

通过intent调用打电话,打开地图、打开浏览器,创建邮件,创建事件的操作 截图: 代码 package com.example.hellointent; import java.util.Calendar; import java.util.List; import org.apache.http.protocol.HTTP; import android.net.Uri;

zhi07的专栏 1124

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 426

Win11笔记本BIOS设置避坑大全:Secure Boot、RST、UEFI引导,一次讲清

本文详细解析了Win11笔记本BIOS设置中的关键问题,包括Secure Boot、Intel RST和UEFI引导的配置方法,帮助用户避开双系统安装中的常见陷阱。特别针对不同品牌笔记本的BIOS界面差异,提供了实用的操作指南和优化建议,确保系统兼容性和启动效率。

weixin_29251131的博客 687

隐式意图 implicit intent

在我们的APP中用于与其他APP交互 implicit intent 在声明时并不需要指定跳转的activity的名称,而是声明一个要执行的动作action,action中可以携带数据,也可以不携带,根据需求而定 比如说,当我们需要在我们的APP中呼叫某一个电话 package net.oschina.git.zhaikun.androiddeveloped.activitys; imp...

一个IT人的技术成长历程。 1472

CXL协议-第三章 CXL事务层

CXL.io为I/O设备提供了一个非一致的负载/存储接口。图3-1显示了Flex总线分层层次结构中的位置。事务类型、事务分组格式、基于信用的流量控制、虚拟通道管理和事务排序规则遵循PCIe*定义,详情请参考PCIe基础规范的“事务层规范”章节。本章重点介绍了用于CXL.io的著名的PCIe操作模式或特性。

qq_41305217的博客 2769

Android 12 行为变更:适配以Android 12为目标的应用

*其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。这么重要的事情说三遍啦!

2401_83703835的博客 984

Redhawk: dynamic ir drop分析(Clock Buffer Clustering)

在dynamic分析中,ir drop问题多出现在三种情况下,缺power mesh,缺power switch,clock cell过于密集。 前两种情况通过选中具体instance查看min res path都比较容易分析出来,而且大部分问题都出现在channel里,这里不多做赘述。 clock cell过于密集这是观察结果,缺少报告支持,这里分享一下分析方法。 首先,选中压降超过signoff标准的instance,(Results->List of Worst Instance DVD中

m0_61544122的博客 5266

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

Android Acitivity启动模式

Activity启动模式对于我们很多应用中会有不同的要求,这儿简单说一下Activity的四种启动模式之间的差别 1.standard默认启动模式,如果不在AndroidMainfest文件中配置,默认为这个模式。 这种模式下,每次启动这个Activity都会调onCreate方法创建新的实例。 示例代码: public class MainActivity extends

风哲的博客 509

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4073

Android到底哪个Acitivity启动

http://ghj1976.wordpress.com/2011/04/29/android%E5%88%B0%E5%BA%95%E9%82%A3%E4%B8%AAacitivity%E5%90%AF%E5%8A%A8/ Android到底那个Acitivity启动 Posted on 04月 29, 2011by ghj1976 启动那个Acitivity

突围 919

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android 是怎么启动一个Acitivity的?

可以把启动过程分为client端和server端。 一、client端在启动一个Activity时进行的工作 备注:我个人理解,client端指的是相对后台ActivityManagerService 进程来说的前台用户可见的进程,如在界面启动某一个Activity的就是Laucher进程。这里则以从home桌面启动一个Activity来分析启动过程: (1)Launcher 这个进程的

SnailDream 2025

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android中Acitivity的启动方式启动模式讲解

一、 activity的启动方式分为两种显示启动和隐式启动 1、显示启动方式: A:最常见的 MainActivity是当前的activity类,TargetActivity类是需要跳转到的类 startActivity(new Intent(MainActivity.this,TargetActivity.class)); B:通过Intent的ComponentName ComponentName cn = new ComponentName("MainActivity的全类名","T.

硅谷海盗的博客 1118

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android活动Acitivity启动模式之singleTask

前面的文章介绍了Android 活动Activity的启动模式:standard

残缺的孤独 2528

Android复习-Acitivity的启动模式

所谓启动模式就是配置文件中的这个属性: <activity android:name=".Main3Activity" android:launchMode="standard"> launchMode属性用来标识Activity的启动模式,不行的话默认为standard。一共有四种: 在介绍这四种模式之前首先的明确一个任务栈的概念,

Ade-rui的博客 473

Android 系统和Acitivity启动流程

在Android中,所有的应用程序进程与系统服务进程(SystemServer)都是有Zygote进程孕育出来的。当ActivityManagerService启动一个应用程序时,就会通过Socket与Zygote进程进行通信,请求它孕育出一个子进程来作为即将要启动的应用程序的进程。在系统中有两个重要服务:PackageManagerService和ActivityManagerService,都...

幸福的小飞猪 270

Android活动Acitivity启动模式之singleTop

在文章Android活动Acitivity启动模式之standard中,介绍了活动的默认启动模式standard

残缺的孤独 1万+

Android网页中启动Acitivity

原文详细介绍 http://blog.youkuaiyun.com/caroline_wendy/article/details/50297671 人们每天都要访问大量的手机网页, 如果把手机网页(Web)和应用(App)紧密地联系起来, 就可以增大用户的访问量, 也有其他应用场景, 如网页中调用支付链接,新闻中启动问诊界面, 提供优质的原生功能等等. 如何在网页(Web)中, 通过Inten

欢迎加入Android老司机学院 482266514(技术交流群)密码优快云 900

Android活动Acitivity启动模式之singleInstance

前面文章介绍了

残缺的孤独 1529

Android活动Acitivity启动模式之standard

Android的活动是通过任务Task来进行管理的,

残缺的孤独 2629
上一篇: Android启动画面Splash
下一篇: Android Application Task Activities的关系
whatsyourname
博客等级 码龄23年 13粉丝 326原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值