Android组件内核面试题之Intent显示跳转与隐式跳转,如何使用?

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

详细讲解

在这里插入图片描述

Framework专题AMS部分

这道题想考察什么?
  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子节点




  • 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组件内核面试题详解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值