Android 隐式 Intent

我们从前几章节中学习到,所以隐式启动 Intent 就是根据启动类 (category) 或者动作 (action) 名启动一组组件

隐式 Intent 不用指定组件名,而是指定要启动的组件的 category 、action 和 data

这时候 Android 系统会去适配 AndroidManifest.xml 中相关组件的 Intent-filter 逐一匹配出满足属性的组件,当不止一个满足时,会弹出一个让我们选择启动哪个的对话框

Intent 中的五个属性,Extra 和 flags 是不参与匹配的

隐式 Intent 的类别

  1. 包含预定义动作的隐式 Intent

    我们知道 Android 系统内建了一些具有相同 category 和 action 的组件,这些我们

    如果我们的 Activity 的 action 和 category 设置和它们一样,就称之为 包含预定义动作的隐式 Intent

  2. 包含自定义动作的隐式 Intent

如果我们的 Activity 的 action 和 category 都是我们自己设置的,那么就称之为 包含自定义动作的隐式 Intent

一句话,如果 action 和 category 使用的是 android.intent 开头的,则为预定于,否则为自定义

范例

我们用一个 demo 来演示下这两种类别

  1. 创建一个 空的 Android 项目 cn.twle.android.ImplicitIntent

  2. 修改 activity_main.xml 添加一个 <Button>

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/btn_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动另一个 Activity" />
    </LinearLayout>
    
  3. 在 res/layout 新建一个布局 activity_second.xml ,很简单,就一个 <TextView>

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="我是第二个 Activity" />
    </LinearLayout>
    
  4. 新建 SecondActivity,在 MainActivity.java 新建文件 SecondActivity.java

    package cn.twle.android.implicitintent;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    public class SecondActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
        }
    }
    

预定义动作的隐式 Intent

  1. 修改 MainActivity.java

    package cn.twle.android.implicitintent;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn_start = findViewById(R.id.btn_start);
            btn_start.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
    
                    // 启动一组 action=View 的 Activity
                    Intent it = new Intent();
                    it.setAction(Intent.ACTION_VIEW);
                    startActivity(it);
    
                }
    
            });
        }
    }
    
  2. 然后修改 AndroidManifest.xml 添加 SecondActivity

    我们给 SecondActivity 指定了 action 和 category

    <activity android:name=".SecondActivity"
                android:label="第二个Activity">
        <intent-filter>
              <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>           
     </activity>
    

运行 APP,点击 启动另一个 Activity ,所有 Action 为 VIEW 的 Activity 被筛选出来,由用户进一步选择


自定义动作的隐式 Intent

接下来我们使用自定义的 action 与 category 来激活 SedondActivity

  1. 复用上面的范例

  2. 修改 AndroidManifest.xml 中的 SecondActivity

    <activity android:name=".SecondActivity"
            android:label="第二个 Activity">
        <intent-filter>
            <action    android:name="ms_action"/>
            <category  android:name="ms_category"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>           
    </activity>
    

    虽然我们自定义了一个 category , 但是还是要把默认的加上,不然会报错的

  3. 修改 MainActivity.java

    package cn.twle.android.implicitintent;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn_start = findViewById(R.id.btn_start);
            btn_start.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
    
                    // 启动一组 action=View 的 Activity
                    Intent it = new Intent();
                    it.setAction("ms_action");
                    it.addCategory("ms_category");
                    startActivity(it);
    
                }
    
            });
        }
    }
    

运行 APP,点击 启动另一个 Activity ,所有 action 为 ms_action 的 Activity 被筛选出来,由用户进一步选择 (只有一个,所以不用选择,直接跳转了)


我们可以多定义几个 action,设置一些 category 相同,一些 action 相同,多试试,你就能明白了

参考文档

  1. Android Intent 官方 API

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

♥   简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.