Android 隐式 Intent

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

隐式 Intent 不用指定组件名,而是指定要启动的组件的 categoryactiondata

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

Intent 中的五个属性,Extraflags 是不参与匹配的

隐式 Intent 的类别

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

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

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

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

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

一句话,如果 actioncategory 使用的是 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 指定了 actioncategory

    <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

接下来我们使用自定义的 actioncategory 来激活 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.