系列专栏:
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,更有专栏内容免费技术答疑。助您提高安卓面试准备效率,为您面试保驾护航!
Intent在实际工作的使用率可以说和四大组件一样的多,特别是初级的安卓面试,很可能会问到,面试官可能会问:
看完以下的解析,一定可以让面试官眼前一亮。
Intent,中文可翻译为“意图”,可用于Android同个应用程序中各个组件之间的交互,或者不同应用程序之间的交互。可以用来表明当前组件的思想和意图,比如想执行某个动作,想发送某些数据等等。每个组件都有不同的启动方法:
Intent分为显式Intent和隐式Intent,我们以打开新的Activity为例进行讲解。
显式指定意图,系统就会根据我们指定的意图,打开我们想打开的Activity。Intent有如下构造函数:Intent(Context packageContext, Class<?> cls)。其中第二个参数就是指定想启动的Activity。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
通过上面两行代码,我们可以显式指定打开SecondActivity.class。
不指定特定的意图,而是通过清单文件里,每个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。
“action”,“category”都是Intent的组成部分。为了更好的理解隐式Intent,需要了解一个Intent由几部分组成:
指定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]这三种方式:
在可以使用应用的Context代替Activity的Context时,都推荐使用应用的Context,且Activity名称前面加上包名可以打破同个包内的限制,所以推荐使用[注释4]的方式。
用来表示