本文介绍: image.pngIntentintent源码(Android P)Android中的Intent是一个非常重要且常用的类,可以用来一个组件启动App中的另一个组件或者是启动一个App的组件,这里所说的组件指的是Activity、Service以及Broadcast。Intent中文意思指”意图”,按照Android设计理念,Android使用Intent来封装程序的”调…

Intent

intent源码(Android P)

Android中的Intent是一个非常重要且常用的类,可以用来在一个组件中启动App中的另一个组件或者是启动另一个App的组件,这里所说的组件指的是Activity、Service以及Broadcast。

Intent中文意思指”意图”,按照Android设计理念,Android使用Intent来封装程序的”调用意图”,不管启动Activity、Service、BroadcastReceiver,Android都使用统一的Intent对象封装这一”启动意图”。

启动三大组件

下面是Intent启动不同组件的部分方法:
Activity组件:

startActivity(Intent intent);
startActivityForResult(Intent intent,int requestCode);

Service组件:

startService(Intent intent);
bindService(Intent intent,ServiceConnection conn,int flags);

BroadcastReceiver组件:

sendBroadcast(Intent intent);
sendOrderedBroadcast(Intent intent,String receiverPermission);

Intent的构成

Intent由6部分信息组成:
Component Name、Action、Data、Category、Extras、Flags

根据信息的作用用于,又可分为三类:

  1. Component Name、Action、Data、Category
    这4中信息决定了Android会启动哪个组件,其中Component Name用于在显式Intent中使用,Action、Data、Category、Extras、Flags用于在隐式Intent中使用。
  2. Extras
    里面包含了具体的用于组件实际处理数据信息。
  3. Flags
    其是Intent的元数据,决定了Android对其操作的一些行为

信息名字|含义

Component name

要启动的组件的名称

(显式启动)设置component name,Android会直接将Intent传递给组件名所指定的组件去启动它。

Component name对应的类为ComponentName。

/**
     * Create an intent for a specific component.  All other fields (action, data,
     * type, class) are null, though they can be modified later with explicit
     * calls.  This provides a convenient way to create an intent that is
     * intended to execute a hard-coded class name, rather than relying on the
     * system to find an appropriate class for you; see {@link #setComponent}
     * for more information on the repercussions of this.
     *
     * @param packageContext A Context of the application package implementing
     * this class.
     * @param cls The component class that is to be used for the intent.
     *
     * @see #setClass
     * @see #setComponent
     * @see #Intent(String, android.net.Uri , Context, Class)
     */
    public Intent(Context packageContext, Class<?&gt; cls) {
        mComponent = new ComponentName(packageContext, cls);
    }
Action

是表示了要执行操作字符串,比如查看选择,其对应着Intent Filter中的action标签<action /&gt;。
例如:

<intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Intent类和Android中其他framework级别的一些类也提供了许多已经定义好的具有一定通用意义的action

以下是一些用于启动Activity的常见的action

名字 含义
Intent.ACTION_VIEW 其值为 “android.intent.action.VIEW”,当你有一些信息想让通过其他Activity展示用户的时候,你就可以将Intent的action指定为ACTION_VIEW,比如在一个图片应用查看一张图片,或者在一个地图应用中展现一个位置
Intent.ACTION_SEND 其值为”android.intent.action.SEND”,该action常用来做“分享”使用,当你有一些数据想通过其他的App(例如QQ、微信百度云等)分享出去的时候,就可以使用此action构建Intent对象,并将其传递给startActivity()方法,由于手机上可能有多个App的Activity均支持ACTION_SEND这一action,所以很有可能会出现如下的图片所示的情形让用户具体选择要通过哪个App
Data

Intent中的data指的是Uri对象数据的MIME类型,其对应着Intent Filter中的data标签<data />。

一个完整的Uri由schemehost、portpath组成,格式是<scheme>://<host>:<port>/<path>

例如:

content://com.example.project:200/folder/subfolder/etc

Uri就像一个数链接,组件可以根据此Uri获得最终的数据来源。通常将Uri和action结合使用,比如我们将action设置为ACTION_VIEW,我们应该提供将要被编辑修改文档的Uri。

Category

category包含了组件如何处理Intent的一些其他信息.

以下是一些常见的category

  • CATEGORY_BROWSABLE 目标组件会允许自己通过一个链接被一个Web浏览器启动,该链接可能是一个图片链接或e-mail信息等。
  • CATEGORY_LAUNCHER 用于标识Activity是某个App的入口Activity。

你可以在Intent类中查找到更多预定义category

Extras

顾名思义,就是额外的数据信息,Intent中有一个Bundle对象存储着各种键值对,接收该Intent的组件可以从中读取出所需要的信息以便完成相应的工作

有的Intent需要靠Uri携带数据,有的Intent是靠extras携带数据信息。
源码

// create Bundle if it doesn't already exist
 if (intent.mExtras == null) intent.mExtras = new Bundle();
Flags

flag就是标记的意思.

Intent类中定义的flag能够起到作为Intent对象的元数据的作用。

这些flag会告知Android系统如何启动Activity,以及在该Activity启动后如何对待它。
源码中:

/**
     * Set special flags controlling how this intent is handled.  Most values
     * here depend on the type of component being executed by the Intent,
     * specifically the FLAG_ACTIVITY_* flags are all for use with
     * {@link Context#startActivity Context.startActivity()} and the
     * FLAG_RECEIVER_* flags are all for use with
     * {@link Context#sendBroadcast(Intent) Context.sendBroadcast()}.
     *
     * <p>See the <a href="{@docRoot}guide/topics/fundamentals.html#acttask">Application Fundamentals:
     * Activities and Tasks</a> documentation for important information on how some of these options impact
     * the behavior of your application.
     *
     * @param flags The desired flags.
     *
     * @return Returns the same Intent object, for chaining multiple calls
     * into a single statement.
     *
     * @see #getFlags
     * @see #addFlags
     *
     * @see #FLAG_GRANT_READ_URI_PERMISSION
     * @see #FLAG_GRANT_WRITE_URI_PERMISSION
     * @see #FLAG_DEBUG_LOG_RESOLUTION
     * @see #FLAG_FROM_BACKGROUND
     * @see #FLAG_ACTIVITY_BROUGHT_TO_FRONT
     * @see #FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
     * @see #FLAG_ACTIVITY_CLEAR_TOP
     * @see #FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
     * @see #FLAG_ACTIVITY_FORWARD_RESULT
     * @see #FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
     * @see #FLAG_ACTIVITY_MULTIPLE_TASK
     * @see #FLAG_ACTIVITY_NEW_TASK
     * @see #FLAG_ACTIVITY_NO_HISTORY
     * @see #FLAG_ACTIVITY_NO_USER_ACTION
     * @see #FLAG_ACTIVITY_PREVIOUS_IS_TOP
     * @see #FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
     * @see #FLAG_ACTIVITY_SINGLE_TOP
     * @see #FLAG_RECEIVER_REGISTERED_ONLY
     */
    public Intent setFlags(int flags) {
        mFlags = flags;
        return this;
    }
列举intent的几种构造函数
/**
     * Create an empty intent.
     */
    public Intent() {
    }

    /**
     * Copy constructor.
     */
    public Intent(Intent o) {
        this.mAction = o.mAction;
        this.mData = o.mData;
        this.mType = o.mType;
        this.mPackage = o.mPackage;
        this.mComponent = o.mComponent;
        this.mFlags = o.mFlags;
        if (o.mCategories != null) {
            this.mCategories = new HashSet<String>(o.mCategories);
        }
        if (o.mExtras != null) {
            this.mExtras = new Bundle(o.mExtras);
        }
    }

    @Override
    public Object clone() {
        return new Intent(this);
    }

    private Intent(Intent o, boolean all) {
        this.mAction = o.mAction;
        this.mData = o.mData;
        this.mType = o.mType;
        this.mPackage = o.mPackage;
        this.mComponent = o.mComponent;
        if (o.mCategories != null) {
            this.mCategories = new HashSet<String>(o.mCategories);
        }
    }

使用例子

显式Intent使用
Intent intent = new Intent(this, ActivityB.class);
startActivity(intent);

还有一种方式是隐式使用,不在多说。

原文地址:https://blog.csdn.net/u012739527/article/details/124012430

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8511.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注