当前位置: 首页 > 面试经验 >

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

优质
小牛编辑
167浏览
2023-03-28

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





系列专栏:




  • 安卓系统Framework面经专栏链接:Android系统面试题解析大全

  • 安卓系统Framework面经目录详情:Android系统面经_Framework开发面经_150道面试题答案解析





  • 安卓高频面经解析大全专栏链接:Android面试题解析大全

  • 安卓高频面经解析大全目录详情:安卓面经_Android面经_150道安卓基础面试题目录





  • 嵌入式面经解析大全专栏链接:嵌入式面经_C++软件开发面经_111道面试题全解析

  • 嵌入式面经解析大全目录详情:111道嵌入式面经题全解析软件开发面经C++面经目录




本人是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时,都推荐使用应用的Context,且Activity名称前面加上包名可以打破同个包内的限制,所以推荐使用[注释4]的方式。


1.3.2 action


用来表示



 类似资料: