组件_Intent

1、显式 Intent

通过直接 指定组件名 ,而不是 Actoin、Category 形式

demo

// 创建 Intent时,直接指定要启动的 组件 —— 紧耦合

Intent intent = new Intent(this, IntentSecondActivity.class);
startActivity(intent);


或者 
Intent intent = new Intent();
intent.setComponent( Component名字 ) ;

2、隐式 Intent (Action、 Category)

通过指定 ** Actoin、Category **形式

  • Action:动作

    一个 Intent 只有 1个Action

  • Category:分类

    一个 Intent 可以有 多个 Category

主调端:
    intent **不用显示添加**,系统默认添加默认 category —— intent.addCategory()

被调端:
    默认Category 必须**手动添加 配置文件**
    
    <category android:name="android.intent.category.DEFAULT">
  • 调用:

    Action 与 至少1个 Category (可以是默认的) 都匹配,才能响应

demo

// 调用端
    Intent intent = new Intent();
    intent.setAction("component.activity.ACTION");
    intent.addCategory("component.activity.CATEGORY");
    
    startActivity(intent);



<!-- 被调用 Intent 端  的配置文件-->

    <activity
        android:name="component.activity.IntentSecondActivity"
        android:label="@string/intent_second" >
        <intent-filter >
            <action android:name="component.activity.ACTION"/>
            
            <!-- 默认 Category —— 没有其他 Category 时,必须添加默认配置 -->
            <category android:name="android.intent.category.DEFAULT"/>
            
            <category android:name="component.activity.CATEGORY" />
        </intent-filter>
    </activity>

3、隐式 Intent ( Data )

通过 Data 指定 Intent 能响应的 数据类型

被调用端 设置 ** data ** 标签,可以设置任意个种类

  • scheme
  • host
  • port
  • path
  • mimeType

demo

// 主调用端
    Intent intent = new Intent();
    intent.setAction("component.activity.ACTION");
    intent.addCategory("component.activity.CATEGORY");
    
    intent.setData(Uri.parse("http://www.baidu.com:8080/file.py"));


// 被调用端
          <intent-filter>
            <action android:name="component.activity.ACTION" />
            <category android:name="android.intent.category.DEFAULT" />


        <!-- scheme, host, port, path -->
            <data
             android:scheme="http" 
                android:host="www.baidu.com" 
                android:port="8080"
                android:path="file.py"
                >
            </data>
            
        </intent-filter>

4、传递数据

  • 发送端

    调用 putExtra( ) 添加数据

  • 接收端

    调用 getIntent( ) 获取 Intent

    intent.getXXXXXExtra() 获取相应数据

demo

// 发送端,添加、发送数据
intent.putExtra("key", "value");
startActivity(intent);


// 接收端,接收、读取数据
Intent intent = getIntent();
String valueString  = intent.getStringExtra("key");

5、数据回传给上个 Activity

调用、回传流程:

  • 主调用端 :

    调用 startActivityForResult( intent, requestCode( int 值 ) ) 启动下一个 Activity

  • 被调用端

    创建添加数据的 intent ,调用 setResult( RESULT_OK, intent ) 向上个 组件返回数据

  • 主调用端

    由于调用了 startActivityForResult( ) 来启动 组件,此时需重写 onActivityResult( requestCode, resultCode, intent ) 函数,在其中判断、获取返回来的结果

demo

// 主调用端
// 启动可回传数据的  Activity
int requestCode = 10;
startActivityForResult(intent, requestCode);

// 被调用端 —— 回传数据
Intent resultIntent = new Intent();
intent.putExtra("name", "Sandiego");    
setResult(RESULT_OK, resultIntent);     // 设置回传数据

// 主调用端 —— 处理回传结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    switch (requestCode) {
    case 10:
        if ( resultCode == RESULT_OK ) {
            String result = data.getStringExtra("name");
        }
        break;

    default:
        break;
    }
}

推荐阅读更多精彩内容