【Android组件内核面试题】 Intent显示跳转与隐式跳转,如何使用?(美团)

364 阅读4分钟

Intent显示跳转与隐式跳转,如何使用?(美团)

这道题想考察什么?
  1. 是否了解Intent跳转的真实场景使用,是否熟悉Intent使用场景?
考察的知识点
  1. 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>

详细关注公众号:Android老皮
还能解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路