安卓开发面试题(6/30)Intent全解析

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)


嵌入式


本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

Intent在实际工作的使用率可以说和四大组件一样的多,特别是初级的安卓面试,很可能会问到,面试官可能会问:

  1. 什么是Intent? ⭐⭐⭐⭐⭐
  2. 显式Intent和隐式Intent的区别?⭐⭐⭐⭐
  3. 在隐式启动中Intent可以设置多个action,多个category吗?⭐⭐⭐⭐
  4. 隐式Intent的匹配规则?⭐⭐⭐⭐⭐
  5. 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高频面试题全解析 文章被收录于专栏

#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论
了解安卓基础面全解析
点赞 回复
分享
发布于 2022-10-18 14:51 河南

相关推荐

面试官很早就到了,守时好评。 1、自我介绍2、讲了一下用大模型在公司做了啥业务,应用方面的。3、拷打项目(项目的架构设计,redis的缓存数据结构设计)4、MySQL的事务隔离(实现机制,读已提交和可重复读的区别,跟面试官讨论了很久可重复读是否会出现幻读的情况,然后结论就是面试官说如果事务全部使用当前读就不会发生幻读,因为都加上了间隙锁(确实),但是如果是这样的话性能上会有很大的损失吧,况且真的有人不会使用快照读吗?这个待议,反正背一下结论就好了)5、分布式事务(我不太了解)6、设计一个加密解密的网络通信机制(发送邮件,照搬了https的非对称加密传输,比如CA抵御中间人攻击,如果性能不高,可换成对称加密)7、做题(K组翻转链表,不足K个照样翻转,调了半天没调出来,但是讲了大体思路(prev,pre,cur)三个指针怎么迭代翻转,后面发现是有一个变量写反了~~~)8、问了问感兴趣的方向(想做算法还是后端)9、有无offer10、反问(抖音业务,部门工作介绍,该继续改进的地方)总体感觉强度很高,思维性很强,八股含量比较少,很多问题都比较吃理解能力和思维能力。-----4.1感谢信了,不觉得奇怪,字节现在hc太少了,反思一下,虽然说自我感觉面试没啥问题,但还是觉得自己在分布式这方面不太熟吧,同时项目里面的项目不太能够经得起拷打,有时间的xdm还是早做准备多参加开源项目或者多多实习,不要像我一样整天只会crud了。
点赞 评论 收藏
转发
4 22 评论
分享
牛客网
牛客企业服务