Intent显示跳转与隐式跳转,如何使用?(美团)
这道题想考察什么?
- 是否了解Intent跳转的真实场景使用,是否熟悉Intent使用场景?
考察的知识点
- Intent跳转处理在项目中使用与基本知识
考生应该如何回答
1.显示意图与隐式意图的区别,说说你的简单理解?
答:
在Activity的跳转中
Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity
通过设置Activity的包名和类名实现跳转,称为显式意图
通过指定动作实现跳转,称为隐式意图
显式意图
- 跳转到同一项目下的另一个Activity,直接指定该Activity的字节码即可
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
startActivity(intent); - 跳转至其他App中的Activity,需要指定该应用的包名和该Activity的类名
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
startActivity(intent);
隐式意图
- 隐式意图跳转至指定Activity
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent); - 要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点
<intent-filter >
<action android:name="com.itheima.second"/>
<data android:scheme="asd" android:mimeType="aa/bb"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
- action 指定动作(可以自定义,可以使用系统自带的)
- data 指定数据(操作什么内容)
- category 类别 (默认类别,机顶盒,车载电脑)
- 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配
- intent-filter节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可
获取通过setData传递的数据
/ /获取启动此Activity的intent对象
Intent intent = getIntent();
Uri uri = intent.getData();
显式意图和隐式意图的应用场景
- 显式意图用于启动同一应用中的Activity
- 隐式意图用于启动不同应用中的Activity
- 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
2.你在工作中,留意过在Android中Intent显示跳转和隐式跳转,如何使用?
答:
显式 Intent 调用:
// 创建一个显式的 Intent 对象(方法一:在构造函数中指定)
Intent intent = new Intent(Intent_Demo1.this, Intent_Demo1_Result1.class);
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.putExtras(bundle);
intent.putExtra("name", "derry");
intent.putExtra("userInfo", new UserInfo(1, "name"));
startActivity(intent);
// 创建一个显式的 Intent 对象(方法二:用 setClass 方法)
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.setClass(Intent_Demo1.this, Intent_Demo1_Result1.class);
intent.putExtras(bundle);
startActivity(intent);
// 创建一个显式的 Intent 对象(方法三:用 setClass 方法)
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.setClassName(Intent_Demo1.this, "com.great.activity_intent.Intent_Demo1_Result1");
intent.putExtras(bundle);
startActivity(intent);
//创建一个显式的 Intent 对象(方法四:用 setComponent 方法)
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("id", strID);
//setComponent方法的参数:ComponentName
intent.setComponent(new ComponentName(Intent_Demo1.this,
Intent_Demo1_Result1.class));
intent.putExtras(bundle);
startActivity(intent);
Intent隐式跳转 Action:
// 创建一个隐式的 Intent 对象:Action 动作
/**
* 这里指定的是 AndroidManifest.xml 文件中配置的
* <intent-filter>标签中的<action android:name="com.great.activity_intent
.Intent_Demo1_Result3" />
* 所在的 Activity,注意这里都要设置 <category android:name="android.intent.
category.DEFAULT" />
*/
Intent intent = new Intent();
// 设置 Intent 的动作
intent.setAction("com.great.activity_intent.Intent_Demo1_Result3");
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.putExtras(bundle);
startActivity(intent);
AndroidManifest.xml:
<activity android:name="Intent_Demo1_Result3"
android:label="Intent_Demo1_Result3">
<intent-filter>
<action android:name="com.great.activity_intent.Intent_Demo1_Result3" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Category 类别:
// 创建一个隐式的 Intent 对象:Category 类别
Intent intent = new Intent();
intent.setAction("com.great.activity_intent.Intent_Demo1_Result33");
/**
* 不指定 Category 或 只指定 AndroidManifest.xml 文件中 <intent-filter>
* 标签中配置的任意一个 Category
* <category android:name="android.intent.category.DEFAULT" /> 除外,就可以访问该 Activity,
*/
intent.addCategory(Intent.CATEGORY_INFO);
intent.addCategory(Intent.CATEGORY_DEFAULT);
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.putExtras(bundle);
startActivity(intent);
AndroidManifest.xml:
<activity android:name="Intent_Demo1_Result2"
android:label="Intent_Demo1_Result2">
<intent-filter>
<category android:name="android.intent.category.INFO" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Date 数据 跳转:
// 创建一个隐式的 Intent 对象,方法四:Date 数据
Intent intent = new Intent();
Uri uri = Uri.parse("http://www.great.org:8080/folder/subfolder/etc/abc.pdf");
// 注:setData、setDataAndType、setType 这三种方法只能单独使用,不可共用
// 要么单独以 setData 方法设置 URI
// intent.setData(uri);
// 要么单独以 setDataAndType 方法设置 URI 及 mime type
intent.setDataAndType(uri, "text/plain");
// 要么单独以 setDataAndType 方法设置 Type
//intent.setType("text/plain");
/**
* 不指定 Category 或 只指定 AndroidManifest.xml 文件中 <intent-filter> 标签中配置的任意一个 Category
* <category android:name="android.intent.category.DEFAULT" /> 除外,就可以访问该 Activity
*/
Bundle bundle = new Bundle();
bundle.putString("id", strID);
intent.putExtras(bundle);
startActivity(intent);
AndroidManifest.xml:
<activity android:name="Intent_Demo1_Result2"
android:label="Intent_Demo1_Result2">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<data
android:scheme="http"
android:host="www.great.org"
android:port="8080"
android:pathPattern=".*pdf"
android:mimeType="text/plain"/>
</intent-filter>
</activity>
最后
有需要面试题的朋友可以关注一下哇哇,以上都可以分享!!!
网友评论