Intent使用相关

1、Intent的分类

 > 显式意图
 > 隐式意图

》显示意图的使用

//所谓显式意图,即是可以看得见跳转的对象的Intent,例如
Intent intent = new Intent(MaintActivity.this,SecondActivity.class)
// 其中要跳转的界面SecondActivity是明明可见的,所谓“显式"其意在此,在实际中开发中,显式Intent基本上是可以
// 满足大多数的跳转

》隐式意图的使用

 隐式Intent相比于显式Intent来说,没有指明要跳转的界面,而是采用一些抽象的action和catagory信息去进行匹配
 相应的activity
 其使用形式如下:
      //SecondActivity是要跳转的界面,在其清单文件中配置action,category,data等信息
      <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="https"/>
            </intent-filter>
      </activity>

     //在其他界面使用方式如下
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.setData(Uri.parse("https://www.baidu.com"));
     startActivity(intent);

    /**
      使用隐式意图的时候,注意action和catagory完全一样的时候才会进行跳转,但是在上面使用的时候好像没有看到
     指定的action和catagory啊?这是怎么回事呢?其实在我们Intent的源码的时候可以看到它有多个重载的构造方法
     其中常用的有如下两种:
     》Intent(Context packageContext, Class<?> cls)
     》Intent(String action)
     所以得到其实上面已经指定了action了!就是“Intent.ACTION_VIEW”,但是和“android.intent.action.VIEW”
     好像并不一样,这是怎么回事呢?我们在后面的时候会说到。那么现在还有一个问题就是我们并没有指定catagory,
     其实"android.intent.category.DEFAULT"是一中默认的catagory,当使用startActivity()的时候会自动将这
     个catagory添加到intent中
    */

》intent-filter内容介绍

 》action: 其实就相当于一个标识,每一个intent中只能指定一个action,指定的方式有两种,如下:
   ♥ Intent intent = new Intent("action")
   ♥ intent.setAction("action");
       注意: action可以是自定义的一些字符串,只要两者一致就行,但是有一些是系统中自带的一些action,比如说
       拨打电话、使用相机等,其值也是一样的,但是用了一些常量替换的,比如我们上面使用的“Intent.ACTION_VIEW”
       就是用来打开浏览器程序并显示指定的URL,“Intent.ACTION_VIEW”的值就是"android.intent.action.VIEW"

 》category: 也是匹配的一个标识,它是有一个默认的值,所以我们基本上是不用显示的指定的,catagory不同action,
     它是可以有多个值得,即在<intent-filter>中可以配置多个,只要有一条匹配上即可,其指定的方法如下
     intent.addCategory("catagory");

 》data: 用于精确的指定当前活动能够响应什么类型的数据,其中可以配置一下内容:
   ♥ android:scheme。    用于指定数据的写一部分,如上例中的https部分
   ♥ android:host。      用于指定数据的主机名部分,如上例中www.baidu.com
   ♥ android:port。      用于指定数据的端口部分,一般紧随在主机名之后
   ♥ android:path。      用于指定主机名和端口号之后的部分,如一段网址中跟在域名之后的部分
   ♥ android:mimeType。  用于指定可以处理的数据类型,允许以通配符的方式进行指定
 不过一般不会再data中指定很多的内容,一般如上来说,只需指定android:scheme = “https”,就可以响应所有的https协议了

》隐式Intent使用的场景

  ♥ 调用系统的功能,比如调用打电话
 Intent intent = new Intent(Intent.ACTION_DIAL);
        Uri data = Uri.parse("tel:" + phoneNumber);
        intent.setData(data);
        startActivity(intent);
  ♥ 项目(module app)依赖第三方的模块(module B),当(module app)调用(module B)中的相关活动时,只要依赖
    (module B)就可以了,但是若是第三方模块(module B)想要调用项目(module app)中的活动,同样依赖(module app),
    但是这种双向依赖的方式,显然是不可能的,所以就可以采用隐式Intent去调用

》使用Intent启动Activity的最佳写法

// 在实际开发中页面跳转时,传递参数是在正常不过的事了,通常的写法如下
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("param1",param1);
intent.putExtra("param2",param2);
startActivity(intent);
/**
虽然这种写法虽然是正确的,但是在一定程度上会造成一些问题,假如SecondActivity不是我们自己写的,那么在进行传参
的时候,我们必须去阅读SecondActivity的源码来确定需要传的参数,但是任何时候读别人的代码都不是一件容易的事,特别
是当项目比较大的时候,或者去问写这个代码的同事,但是这无疑也增加了沟通的成本,所以可采用如下方式:
*/

//在SecondActivity中写如下方法
public static void actionStart(Context context,String param1,String param2) {
    Intent intent = new Intent(context,SecondActivity.class);
    intent.putExtra("param1",param1);
    intent.putExtra("param2",param2);
    context.startActivity(intent);
}

//在MainActivity中可以这样调用,其中所需参数清楚明白
SecondActivity.actionStart(MainActivity.this,"param1","param2");

猜你喜欢

转载自blog.csdn.net/qq_33768280/article/details/80197338