❤️【Android精进之路-06】真的有必要说说Intent,Intent就仙女的魔法棒❤️

简介: 上一篇文章我们详细介绍了Activity组件的创建以及传参。但是其中的关键人物Intent 却没有做过多的介绍。

前言

上一篇文章我们详细介绍了Activity组件的创建以及传参。但是其中的关键人物Intent 却没有做过多的介绍。

这篇文章就来重点介绍下Intent。因为它不仅仅在创建Activity中被使用到,在后面介绍的另外两个组件Service和Broadcast中也会被用到。

一句话就是Intent很重要,我们必须要掌握它。

学习一门技术最重要的是学会查看其Api文档。这里介绍一个可访问的Android SDK的API文档 。

闲话少叙,直接进入今天的主题。

Intent的定义

Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。它主要应用在组件的启动阶段,通过它,你的应用程序可以向Android表达某种请求,Android系统会根据意愿的内容选择适当的组件进行响应。不同类型的组件有不同的传递Intent方法:

1.要激活一个新的Activity,可以调用startActivity()方法,或者startActivityForResult()方法

2.要启动一个新的Service,可以调用startService()方法,或者调用Context.bindService() 方法将调用此方法的上下文对象与service绑定。

3.Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。

Intent的构成

Intent的主要信息有:

1.action(动作):表示要执行的一般操作,比如ACTION_VIEW,ACTION_SEND,ACTION_WEB_SEARCH等等。

2.data(数据): 要操作的数据,例如联系人数据库中的个人记录,表示为Uri。

一些常用的Action:

3.ACTION_VIEW: 用于向用户展示数据

4.ACTION_VOICE_COMMAND :用于启动语音命令

5.ACTION_MAIN:用于作为主入口,即主Activity

6.ACTION_EDIT: 用于显示用户编辑数据

7.ACTION_DIAL: 用于用户拨打电话时指定号码

除了主要的信息以外,Intent还有一些次要的信息。

8.category(类别): 用于指定动作的类别或范畴

<category android:name="android.intent.category.LAUNCHER" />

表示该Activity会被显示在最上层的启动列表中,即在启动器启动时会首先显示给用户

9. type(数据类型): 指定Intent的数据的显示类型(MIME类型)。通常,类型是从数据本身推断出来的。通过设置此属性,可以强制使用显式类型。

10. component(组件): 用于指定intent的组件的名称

11. extras(扩展信息): 扩展信息,用户可以通过它设置Activity之间传递的参数。例如:如果我们有一个发送邮件消息的操作,我们通过它传递主题,正文等数据

Intent的解析

Intent的解析方式有两种:第一种是显式Intent,第二种是隐式Intent。

1.显式Intent

显示Intent就是直接设置组件名称或者设置组件的类名。它指定了特定的组件。比如:下面这样

Intent intent = new Intent(MainActivity.this, MyAty.class);

就明确指定了需要激活的Activity是MyAty。

2. 隐式Intent

隐式Intent,就是没有指定特定的组件。不过,它需要提供足够的信息提供Android系统以确定哪个可用组件最适合该Intent运行。

Intent intent = new Intent("com.jay.learnintent.MyAty");

这样说的还是有点笼统。那就举个例子吧!比如约人吃饭这个意图。显式Intent就是:我要约张三吃饭。明确指定了约饭对象是张三。到点了直接一个电话叫张三出来。而隐式Intent就是: 我要约个朋友吃饭。这里只确定了吃饭这个意图,具体的约饭对象没有具体指定,可能张三,可能是李四。到时候看哪个有空就约哪个出来。

显式Intent在上一篇文章已经有示例了,这里就不再赘述了。这里重点说说隐式Intent。

隐式Intent

首先创建一个名为MyAty的Activity。我们可以看到在manifests->AndroidManifest.xml 中会自动注册该Activity。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jay.learnintent">
    <application  ......>
 <activity
            android:name=".MyAty"
            android:exported="true"
            android:label="MyAty">
        </activity>
           </application>
</manifest>

这里有一点需要说明的是android:name=".MyAty" 为啥名称为**.MyAty**。这是因为Android系统 接着我们需要在<activity></activity> 标签中加上如下两行配置:

<intent-filter>
                <!-- 指明行为方式是Activity -->
                <category android:name="android.intent.category.DEFAULT" />
                <!--指明动作名称,可以根据此名称直接启动该Activity-->
                <action android:name="com.jay.learnintent.MyAty" />
            </intent-filter>

这里通过<action android:name="com.jay.learnintent.MyAty" /> 指定该Activity的动作名称为com.jay.learnintent.MyAty ,这里的动作名称可以是任意的名称,之所以指定类的全路径名名是为了方便区分。

接着在MainActivity中通过隐式Intent的方式启动MyAty。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btnStartMyAty).setOnClickListener(view -> {
            //隐式Intent
            Intent intent = new Intent("com.jay.learnintent.MyAty");
            startActivity(intent);
        });
    }

运行结果是:

链接

从一个应用启动另一个应用

隐式Intent 还有一个好处就是可以从一个应用程序的Activity启动另一个应用程序的Activity。下面定义了两个应用程序分别是app和app1。通过隐式Intent可以从app1的MainActivity启动app的MyAty。

app1的MainActivity的如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btnStartAppMyAty).setOnClickListener(view -> {
            Intent intent = new Intent("com.jay.learnintent.MyAty");
            startActivity(intent);
        });
    }

Android系统会根据Intent中指定的action名称去查找合适的可用组件。

链接

当两个组件的action名称相同时会怎么样呢?让我们接着来看下面这个例子:

在app中再定义一个名为FilterAty的Activity。然后在AndroidManifest.xml中配置其活动名称与MyAty的活动名称保持一致。

AndroidManifest.xml

<activity
            android:name=".FilterAty"
            android:exported="true"
            android:label="FilterAty">
         <intent-filter>
             <!-- 指明行为方式是Activity -->
             <category android:name="android.intent.category.DEFAULT" />
             <!--指明Activity的名称,可以根据此名称直接启动该Activity-->
             <action android:name="com.jay.learnintent.MyAty" />
         </intent-filter>
        </activity>
        <activity
            android:name=".MyAty"
            android:exported="true"
            android:label="MyAty">
            <intent-filter>
                <!-- 指明行为方式是Activity -->
                <category android:name="android.intent.category.DEFAULT" />
                <!--指明Activity的名称,可以根据此名称直接启动该Activity-->
                <action android:name="com.jay.learnintent.MyAty" />
            </intent-filter>
        </activity>

修改完配置之后首先运行app应用使FilterAty注入到应用中,也就是使配置生效。然后运行app1应用程序查看效果。

链接

从效果图可以看出如果有有多个动作名相同的Activity的话,应用程序在激活Activity时会有一个弹框展示所有可用的Activity。你可以选择其中一个Activity作为激活对象。

当然,这种情况下也可以指定只激活特定的Activity。比如:这种情况下指定只激活FilterAty。

1.先修改AndroidManifest.xml

<activity
            android:name=".FilterAty"
            android:exported="true"
            android:label="FilterAty">
         <intent-filter>
             ........
             <data android:scheme="app"></data>
         </intent-filter>
        </activity>

在FilterAty的activity标签中增加<data android:scheme="app"></data> 配置,用于指定操作的数据是app。

然后,修改app1的MainActivity

2, Activity

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btnStartAppMyAty).setOnClickListener(view -> {
             //启动指定的Activity  app://hello (任意参数)
            Intent intent = new Intent("com.jay.learnintent.MyAty", Uri.parse("app://hello"));
            startActivity(intent);
        });
    }
}

这里在Intent中指定了Uri是以app开头。

总结

本文详细介绍了Intent的各种应用场景。希望对读者朋友们有所帮助。

相关文章
|
3月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
50 0
|
6月前
|
存储 SQL 人工智能
Android Activity启动流程一:从Intent到Activity创建
Android Activity启动流程一:从Intent到Activity创建
|
9月前
|
Android开发
关于Android中intent传值问题
关于Android中intent传值问题
57 0
|
4月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
43 0
|
8月前
|
Java API Android开发
Android 中Activity和Intent的详解
Android 中Activity和Intent的详解
75 0
|
8月前
|
Java Android开发
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
76 1
|
10月前
|
Java API 文件存储
Android:常用的隐式 Intent
本篇文章的内容其实是属于上一篇文章(Android 基础知识5:Intent 和 Intent 过滤器)的延伸,考虑到篇幅长度的原因,所以没有把本篇文章的内容写到上一篇文章中,另外单独写成一篇文章还有个好处就是方便读者查阅。这篇文章主要为大家列举了常用的隐式 Intent,大家如果在平时工作中有相关的需求可以直接复制代码使用。
67 0
Android:常用的隐式 Intent
|
10月前
|
XML 存储 前端开发
Android:Intent 和 Intent 过滤器
在前 4 篇文章中,我们介绍了 Android 四大组件的基础知识,四大组件是构成我们 App 的基础,也是 Android 系统设计的最佳体现。各个组件之间完全是解耦的,如果想访问其他组件或者启动其他组件可以使用 Intent 来操作。在四种组件类型中,有三种(Activity、Service 和 Broadcast)均可以通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。所以我们可以把 Intent 当作是各个组件之间的信使(无论该组件是自己 App 的还是其他 App)。
51 0
Android:Intent 和 Intent 过滤器
|
Java Android开发 网络架构
❤️【Android精进之路-05】怎么创建Activity,如何启动另一个Activity,干货满满,建议收藏❤️
上一篇文章❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️ 介绍了Activity的基本概念以及生命周期,但是没有说到如何创建Activity,Activity之间如何传值。SO,本文将重点讲解Activity的创建以及如何Activity之间如何传递参数。
161 0
❤️【Android精进之路-05】怎么创建Activity,如何启动另一个Activity,干货满满,建议收藏❤️
|
Java Android开发
❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️
Activity组件是Android的用户接口程序,它充当了Android应用程序与用户的交互入口。
166 0
❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️