Android--Intent和过滤器

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);

startActivity(intent);

打开浏览器访问网站

Uri uri = Uri.parse(“http://www.baidu.com”);

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

startActivity(intent);

发送短信

Uri uri = Uri.parse(“smsto:10000”);

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

intent.putExtra(“sms_body”, “Hello”);

startActivity(intent);

播放多媒体

Intent intent = new Intent(Intent.ACTION_VIEW);

Uri uri = Uri.parse(“file:///sdcard/11.mp3”);

intent.setDataAndType(uri, “audio/mp3”);

startActivity(intent);

拍照并存储图片

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

long time = Calendar.getInstance().getTimeInMillis();

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment

.getExternalStorageDirectory().getAbsolutePath()+“/tucue”, time + “.jpg”)));

startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

发送邮件

Intent intent = new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL, “l1245265290@163.com”);

intent.putExtra(Intent.EXTRA_SUBJECT, “Subject”);

intent.putExtra(Intent.EXTRA_TEXT, “Hello”);

intent.setType(“text/plain”);

startActivity(intent);

Intent Filter


IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。声名在清单文件中。

用途

Intent Filter是各个组件用于描述其功能的,通过组件的Intent Filter信息,Android的组件管理应用就可以了解和掌握各个组件所具备的能力和能够处理的请求并匹配符合条件的Intent对象。

每个组件都可以有任意数量的Intent Filter。组件包含的Intent Filter对象越多,说明他能接受Intent请求范围越广,同时,其实现也会越复杂。

IntentFilter的匹配规则

IntentFilter的过滤信息有action,category,data.一个组件可以包含多个intent-filter,一个intent只要能完全匹配一组intent-filter即可成功的启动对应的组件。

1.action的匹配

如果IntentFilter中有action,Intent中必须有action

Intent中的action必须在相应IntentFilter中存在

Intent中只需要有一个action和IntentFilter中相同即可

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

[外链图片转存中…(img-1vvPxCTp-1723374500013)]

[外链图片转存中…(img-DCeZtdur-1723374500013)]

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值