安卓开发面试题(6/30)Intent全解析
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看(承诺免费售后答疑):《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看(承诺免费售后答疑):《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看(承诺免费售后答疑):《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看(承诺免费售后答疑):《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法和配置,制作Gradle插件,请看(承诺免费售后答疑):《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!
正文开始⬇
Intent在实际工作的使用率可以说和四大组件一样的多,特别是初级的安卓面试,很可能会问到,面试官可能会问:
- 什么是Intent? ⭐⭐⭐⭐⭐
- 显式Intent和隐式Intent的区别?⭐⭐⭐⭐
- 在隐式启动中Intent可以设置多个action,多个category吗?⭐⭐⭐⭐
- 隐式Intent的匹配规则?⭐⭐⭐⭐⭐
- Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案?⭐⭐⭐
看完以下的解析,一定可以让面试官眼前一亮。
目录
- 1、什么是Intent
- 1.1 显示Intent
- 1.2 隐式Intent
- 1.3 Intent的组成部分
- 1.3.1 componentName
- 1.3.2 action
- 1.3.3 category
- 1.3.4 data
- 1.3.5 type
- 1.3.6 extras
- 1.3.7 flags
- 1.4 隐式Intent匹配规则总结
- 1.5 显示Intent与隐式Intent的区别
- 2、拓展
- 2.1 Intent携带数据的大小
- 2.2 PendingIntent
1、什么是Intent
Intent,中文可翻译为“意图”,可用于Android同个应用程序中各个组件之间的交互,或者不同应用程序之间的交互。可以用来表明当前组件的思想和意图,比如想执行某个动作,想发送某些数据等等。每个组件都有不同的启动方法:
- Activity:可以调用startActivity() 或 startActivityForResult() 传递 Intent来打开新的Activity;
- Service:可以调用startService()传递 Intent 来启动服务,也可通过 bindService() 传递 Intent 来绑定到该服务;
- Broadcast,可以调用sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播;
Intent分为显式Intent和隐式Intent,我们以打开新的Activity为例进行讲解。
1.1 显示Intent
显式指定意图,系统就会根据我们指定的意图,打开我们想打开的Activity。Intent有如下构造函数:Intent(Context packageContext, Class<?> cls)。其中第二个参数就是指定想启动的Activity。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
通过上面两行代码,我们可以显式指定打开SecondActivity.class。
1.2 隐式Intent
不指定特定的意图,而是通过清单文件里,每个Activity节点下事先配置好的(也就是“Intent过滤器”),由系统根据我们设定的Intent,从系统所有Activity中选出最符合的我们要求的Activity。先看看例子:
// 清单文件中 XuruiActivity 提前声明好如下:
<activity android:name=".XuruiActivity">
<intent-filter>
<action android:name="com.example.android.xuruitest"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.android.xuruicategory"/>
</intent-filter>
</activity>
// 代码调用
Intent intent = new Intent();
intent.setAction(com.example.android.xuruitest);
intent.addCategory(com.example.android.xuruicategory);
startActivity(intent); //1
执行 [注释1]的代码后,系统会发现XuruiActivity的所设定的内容,和当前Intent所设定的内容最匹配,系统就会打开XuruiActivity,但这个过程中,我们并没有显式的指出打开XuruiActivity,而是通过设置了一些特定条件进行匹配,如“action”,“category”等,从而隐式地打开了XuruiActivity。
1.3 Intent的组成部分
“action”,“category”都是Intent的组成部分。为了更好的理解隐式Intent,需要了解一个Intent由几部分组成:
- componentName:目的组件
- action(动作):用来表现意图的行动
- category(类别):用来表现动作的类别
- data(数据):表示与动作要操纵的数据
- type(数据类型):对于data范例的描写
- extras(扩展信息):扩展信息
- Flags(标志位):期望这个意图的运行模式
1.3.1 componentName
指定Intent目标组件的类名。可以这么记得,如果直接指定了componentName,那就是显式Intent。我们可以通过setComponent()、setClass()、setClassName()等方法指定:
// 1、Intent构造
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
// 2、setComponent()方法
ComponentName componentName = new ComponentName(this, SecondActivity.class); //2
ComponentName componentName = new ComponentName(this, "com.example.android.SecondActivity"); //3
ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.android.SecondActivity"); //4
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
// 3、setClass/setClassName方法
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
intent.setClassName(this, "com.example.android.SecondActivity");
intent.setClassName(this.getPackageName(), "com.example.android.SecondActivity");
startActivity(intent);
我们看看[注释2-4]这三种方式:
- [注释2]:this是当前Activity,直接写类名,则该Activity必须在同个包名内;
- [注释3]:this是当前Activity,类名包括包名,则可以在当前包跳转到其他包的Activity;
- [注释4]:this是当前Activity所在的应用程序,类名包括包名,则可以在当前包跳转到其他包的Activity;
在可以使用应用的Context代替Activity的Context时,都推荐使
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。