Android--Intent和过滤器,Android高级工程师进阶学习】

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

Android中提供了Intent机制来协助应用间的交互与通讯。Intent 可以通过多种方式促进组件之间的通信,其基本用例主要包括以下三个:

启动Activity。使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。

启动服务。将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。

传递广播。将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。

Intent的类别


显式 Intent:需要按名称(完全限定类名)指定要启动的组件。 通常在自己的应用中使用显式 Intent 来启动组件,因为此时知道要启动的 Activity 或服务的类名。

隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。

创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。

创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。如果多个 Intent 过滤器兼容,系统会显示一个对话框,支持用户选取要使用的应用。

Intent的属性


component(组件)

Component属性明确指定Intent的目标组件的类名称。该属性是可选项,只用于显示Intent,如果没有指定,则 Intent 是隐式的。

可以使用 setComponent()、setClass()、setClassName() 或 Intent 构造函数设置组件名称。

比如启动一个Activity:

Intent intent = new Intent();

//创建组件,通过组件来响应

ComponentName component = new ComponentName(MainActivity.this, AnotherActivity.class);

intent.setComponent(component);

startActivity(intent);

//或者可以简写为

Intent intent = new Intent();

intent.setClass(MainActivity.this, SecondActivity.class);

startActivity(intent);

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

startActivity(intent);

Action(动作)

用来指定要执行的通用操作的字符串。比如你要吃饭,睡觉,这些就是动作。action可以自定义,也可以使用由 Intent 类(比如ACTION_VIEW,ACTION_PICK等)或其他框架类定义的操作常量。所施加的动作越多,越精确。

category(类别)

类别是一个字符串,包含该类型组件需要处理的意图的附加信息。addCategory() 方法为意图对象添加类别,removeCategory() 方法删除之前添加的类别,getCategories() 获取所有被设置到意图对象中的类别。

Category和action都是作为子元素来声明,举例如下:

Manifest代码:

<activity

android:name=“.AnotherActivity”>

MainActivity代码:

Intent intent = new Intent();

intent.setAction(“com.example.testIntent.ACTION_TEST”);

intent.addCategory(“com.example.testIntent.CATEGORY_TEST”);

startActivity(intent);

只有action和Category同时匹配时,才能响应这个Intent。intent Filter中如果category没有指定,必须使用默认的。intent设置时没有添加category时为自动添加默认的category。每个Intent中只能指定一个action,但可以指定多个category。一个Intent Filter中可以包含多个action和category。

data(数据)和type(数据类型)

data是要访问的数据,用URI表示,通常情况下,使用action+data属性的组合来描述一个意图:做什么。intent Filter中声名时可以只是一个数据类型(type),一条 URI ,或者同时包括数据类型和 URI 。

setData() 方法只能以 URI 来指定数据,setType() 只能以元类型指定数据,setDataAndType() 可以同时指定 URI 和元类型。URI 通过 getData() 读取,类型通过 getType() 读取。如果Intent对象中既包含Uri又包含Type,那么,在中也必须二者都包含才能通过。

Data属性与Type属性的关系比较微妙,这两个属性会相互覆盖,例如:

如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性。

如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性。

如果希望Intent既有Data属性,也有Type属性,则应该调用Intent的setDataAndType() 方法。

注:

Uri字符串总满格式:scheme://host:port/path,例如content://com.android.contacts/contacts/1tel:4536,其中 content 是 scheme 部分, com.android.contacts 是 host 部分,port 部分被省略了,/contacts/1 是 path 部分。

Data属性并不要求被启动组件的<intent-filter…/>中<data…/>之元素android:scheme、android:host、android:port、android:path 完全满足。比如:

如果目标组件的<data…/>子元素只指定了 android:scheme属性,那么只要Intent的Data 属性的scheme部分与android:scheme属性值相同,即可启动该组件。

这里有两点需要注意:

如果<data…/>子元素只有android:port属性,没有指定android:host属性,那么android.port属性将不会起作用。

如果<data…/>子元素只有android:path属性,没有指定android:host属性,那么android:path属性将不会起作用。

常见的几个Data属性:

tel://:号码数据格式,后跟电话号码。

mailto://:邮件数据格式,后跟邮件收件人地址。

smsto://:短信数据格式,后跟短信接收号码。

content://:内容数据格式,后跟需要读取的内容。

file://:文件数据格式,后跟文件路径。

extra(拓展信息)

这是传递给需要处理意图的组件的以键值对描述的附加信息。通过 putExtras() 方法设置,每种方法均接受两个参数:键名和值。也可以创建一个包含所有 extra 数据的 Bundle 对象,然后getExtras() 方法读取。

Intent intent = new Intent(Intent.ACTION_SEND);

Bundle extra = new Bundle();

extra.putString(Intent.EXTRA_EMAIL,“lalala@domain.com”);

extra.putString(Intent.EXTRA_SUBJECT,“Subject”);

extra.putString(Intent.EXTRA_TEXT,“Hello”);

intent.putExtras(extra);

startActivity(intent);

flag(标志位)

说明Android系统如何来启动活动,启动后如何处理。一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。

那么,同一个程序能不能拥有多个task?这就涉及到加载activity的启动模式。注:android中一组逻辑上在一起的activity被叫做task,自己认为可以理解成一个activity堆栈。

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//相当于singleTask

//intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//相当于singleTop

startActivity(intent);

activity的四种启动模式

1.Standard模式

Standard模式是Android的默认启动模式,这种模式下,Activity可以有多个实例,每次启动Activity,无论任务栈中是否已经有这个Activity的实例,系统都会创建一个新的Activity实例。大部分情况下,都应该使用这种模式,当确实有特殊需求时,再考虑其他模式。

2 .SingleTop模式

SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例.

3.SingleTask模式

SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。

4.SingleInstance模式

singleInstance模式也是单例的,但和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstanceActivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。

启动android常用内置组件


拨打电话

Uri uri = Uri.parse(“tel:10086”);

Intent intent = new Intent(Intent.ACTION_DIAL, uri);

文末

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-NR9igI4E-1713692665273)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值