Android Intent 消息传递使用详解

和你一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、Intent 简介
二、Intent 主要用途
三、Intent 分类
四、隐式Intent 接收过滤标签
五、PendingIntent 介绍
六、Intent的七大属性
七、使用ADB调试 Intent

一、Intent 简介

Intent 是一个消息传递对象,主要用于组件之间的通讯,例如:启动Activity、启动Service、传递Broadcast等。

Intent 主要功能流程图如下:

Intent 主要功能流程图

二、 Intent 主要用途

1. 启动Activity

  • startActivity()
    无返回值,直接启动Activity

  • startActivityForResult()
    有返回值,返回值在onActivityResult() 回调

2. 启动Service

  • startService()
    一次性操作

  • bindService()
    绑定组件,随组件生命周期结束而结束

3. 发送Broadcast

  • sendBroadcast()
    普通无序广播

  • sendOrderedBroadcast()
    有序广播

  • sendStickyBroadcast()
    持续黏性广播

三、 Intent 分类

1.显示 Intent

按名称(完全限定类名)指定要启动的组件。
例如:

Intent intentActivity = new Intent(MainActivity.this,
                            ActivityMethods.class);
                    startActivity(intentActivity);

2.隐式 Intent

不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它
例如:

/**
     * 发送短信
     * **/
    public static void SendMms(Context context, String mmsString) {

        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, mmsString);
        sendIntent.setType("text/plain");
        // sendIntent.setData(Uri.parse("smsto:"));
        // This ensures only SMS apps respond
        // 修改 Intnent 选择器Tittle
        String title = context.getResources().getString(R.string.hello_world);
        Intent chooser = Intent.createChooser(sendIntent, title);

        // 验证是否有Activity 接收
        if (sendIntent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(chooser);
        }
    }

四、 隐式Intent 接收过滤标签

应用可以接收哪些隐式Intent,请在清单文件中使用 <intent-filter>元素为每个应用组件声明一个或多个 Intent过滤器。每个Intent 过滤器均根据 Intent的操作、数据和类别指定自身接受的Intent类型。 仅当隐式Intent 可以通过Intent过滤器之一传递时,系统才会将该 Intent传递给应用组件。

1. <action>

在 name属性中,声明接受的 Intent操作。该值必须是操作的文本字符串值,而不是类常量。

例如:
java 代码中启动的IntentAction

Intent sendIntent = new Intent("String_action");

Androidmanfest.xml 中过滤标签如下:

Androidmanfest 标签声明

2.<data>

使用一个或多个指定数据 URI 各个方面(scheme、host、port、path等)和 MIME 类型的属性,声明接受的数据类型。

3.<category>

在 name 属性中,声明接受的Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

例如:

category 属性使用

4. 禁止其他应用通过Intent 掉起自己组件

android:exported="false"

5. 应用主要入口点Action

<action android:name="android.intent.action.MAIN" />

6. Launcher 图标入口Action

以下两个元素必须配对使用,Activity才会显示在应用启动器中。

Launcher 标签入口

7.注意:

CATEGORY_LAUNCHER 类别指示此 Activity的图标应放入系统的应用启动器。 如果<activity>元素未使用 icon指定图标,则系统将使用<application>元素中的图标

五、PendingIntent 介绍

PendingIntent对象是Intent对象的包装器。PendingIntent 的主要目的是授权外部应用使用包含的 Intent,就像是它从您应用本身的进程中执行的一样。

主要应用于以下场景

  • 1.通知 NotificationManager
  • 2.应用小部件 AppWidget
  • 3.定时任务 AlarmManager

1. PendingIntent 使用注意事项:

  • 1.PendingIntent.getActivity()
    适用于启动 Activity的 Intent
  • 2.PendingIntent.getService()
    适用于启动Service的 Intent
  • 3.PendingIntent.getBroadcast()
    适用于启动 BroadcastReceiver 的Intent

六、Intent的七大属性

1 . Component Name(目标组件的全类、组件名称)

setComponent(),
getComponent(),
setClass() ,
setClassName()

2 . Action (intent 将执行的动作)

setAction()
getAction()

3 . Data (用于向Action 属性提供操作数据)

URI对象scheme://host:port/path (协议头,主机,端口,路径)

4 . Type 分类

指定Data所指定的Uri对应的MIME类型,不指定会根据数据自动推导

5 . Category 类别

Action 提供额外的附件类别信息,可以有多个Category,但必须有一个default

<!-- 默认分类必须加上,否则会报错 -->
<category android:name="android.intent.category.DEFAULT"/>

6 . Extra 数据载体

通过键值对进行数据存储,用于多个Action之间提供数据交换.

7 . Flags 标记

标记组件如何启动,以及启动后如何对待FALG_ACTIVITY_SINGLE_TOP
FALG_ACTIVITY_CLEAR_TOP等等)

七、 使用ADB调试 Intent

1. 语法

adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
  -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>

2.举例

adb shell am start -a android.intent.action.DIAL \
  -d tel:555-5555 -n org.example.MyApp/.MyActivit

Intent 常用方法举例,主要涉及以下内容

一、通过组件名启动
二、通过包名、类名启动
三、通过类启动
四、打电话
五、发短信
六、打开网页
七、播放音乐
八、打开图片
九、创建闹钟
十、创建定时器
十一、添加日历事件
十二、拍照
十三、打开Camera
十四、打开视频录像
十五、选择联系人
十六、查看联系人
十七、编辑联系人
十八、插入联系人
十九、写邮件
二十、打开地图指定点
二十一、检索特定类型图片

一、通过组件名启动 Activity

1. 使用方法

/**
     * 通过组件名启动Activity
     * **/
    public static void StartIntentFromComponent(Context context,
            Class intentClass) {
        Intent intent = new Intent();
        // 1.使用ComponentName 启动Activity
        ComponentName componentname = new ComponentName(context, intentClass);
        intent.setComponent(componentname);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

二、通过包名、类名启动 Activity

1.使用方法

/**
     * 通过包名类名启动Activity
     * **/
    public static void StartIntentFromPackage(Context context,
            String packageName, String className) {
        Intent intent = new Intent();
        // 1.使用ComponentName 启动Activity
        ComponentName componentname = new ComponentName(packageName, className);
        intent.setComponent(componentname);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

三、 通过类启动 Activity

1. 使用方法

/**
     * 通过Class启动Activity
     * **/
    public static void StartIntentFromClass(Context context, Class<?> classOpen) {
        Intent intent = new Intent();
        // 2.使用Setclass方法,类方法间接使用ComponentName
        intent.setClass(context, classOpen);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

四、 打电话

1. 使用Intent 打电话 方法如下

/**
     * 打电话
     * **/
    public static void MakeCall(Context context, int number) {

        // 需要打电话权限
        // <uses-permission android:name="android.permission.CALL_PHONE"/>

        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
                + number));
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

2.注意:打电话需要申请权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

五、 发短信

1.基础发送短信

/**
     * 1.基础发送短信
     * **/
    public static void SendMms(Context context, String mmsString) {

        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, mmsString);
        sendIntent.setType("text/plain");
        // sendIntent.setData(Uri.parse("smsto:"));
        // This ensures only SMS apps respond
        // 修改 Intnent 选择器Tittle
        String title = context.getResources().getString(R.string.hello_world);
        Intent chooser = Intent.createChooser(sendIntent, title);

        // 验证是否有Activity 接收
        if (sendIntent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(chooser);
        }
    }

2.自定义 发送短信

/**
     * 2.自定义 发送短信
     * **/
    public static void SendMmsCustom(Context context, String mmsString) {

        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, mmsString);
        sendIntent.setType("text/plain");
        // sendIntent.setData(Uri.parse("smsto:"));
        // This ensures only SMS apps respond
        // 修改 Intnent 选择器Tittle

        String title = context.getResources().getString(R.string.hello_world);

        Intent chooser = Intent.createChooser(sendIntent, title);

        // 验证是否有Activity 接收
        if (sendIntent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(chooser);
        }
    }

六、打开网页

1. 使用方法

/**
     * 打开网页
     * **/
    public static void OpenInternetUri(Context context, String uri) {

        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

七、播放音乐

1. 使用方法

/**
     * 播放音乐
     * **/
    public static void PlayMusic(Context context, String path) {

        // String
        // path=Environment.getExternalStorageDirectory().getAbsolutePath()+"test.mp3";
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse("file:///" + path), "audio/*");
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

2.播放特定艺术家专辑

/**
     * 搜索特定艺术家专辑
     * **/
    public static void playSearchArtist(Context context, String artist) {

        Intent intent = new Intent(
                MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH);
        intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS,
                MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
        intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist);
        intent.putExtra(SearchManager.QUERY, artist);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

八、 打开图片

1. 使用方法

/**
     * 打开图片
     * **/
    public static void OpenImage(Context context, File file) {
        // File file =new File("/mnt/sdcard/1.png");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file), "image/*");

        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

九、 创建闹钟

1. 使用方法

/**
     * 创建闹钟
     * **/

    public static void SetAlarmIntent(Context context, String message,
            int hour, int minutes) {
        Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
                .putExtra(AlarmClock.EXTRA_MESSAGE, message)
                .putExtra(AlarmClock.EXTRA_HOUR, hour)
                .putExtra(AlarmClock.EXTRA_MINUTES, minutes);

        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);

2.设置闹钟action 机权限

<!-- 设置闹钟的权限 -->
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
        <activity android:name=".Intent.IntentMethod" >
            <intent-filter>
                <action android:name="android.intent.action.SET_ALARM" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

3.显示所有闹钟

显示所有闹钟

十、创建定时器

1. 使用方法

/**
     * 创建定时器
     * **/
    public static void StartTimer(Context context, String message, int seconds) {
        Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
                .putExtra(AlarmClock.EXTRA_MESSAGE, message)
                .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
                .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

添加设置SET_TIMER的Action

<activity android:name=".Intent.IntentMethod" >
            <intent-filter>
                <action android:name="android.intent.action.SET_ALARM" />
                <action android:name="android.intent.action.SET_TIMER" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

十一、 添加日历事件

1. 使用方法

/**
     * 添加日历事件
     * **/

    public static void AddCalendarEvent(Context context, String title,
            String location, Calendar begin, Calendar end) {
        Intent intent = new Intent(Intent.ACTION_INSERT)
                .setData(Events.CONTENT_URI).putExtra(Events.TITLE, title)
                .putExtra(Events.EVENT_LOCATION, location)
                .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
                .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

2. 日历事件过滤

过滤日历action

十二、 拍照

1.使用方法

/**
     * 拍照
     * **/

    public static void CapturePhoto(Context context, String targetFilename,
            Uri mLocationForPhotos) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.withAppendedPath(mLocationForPhotos, targetFilename));
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }

    }

2. 拍照过滤

拍照过滤Action

十三、打开Camera

1. 使用方法

/**
     * 打开Camera
     * **/

    public static void OpenCamera(Context context) {
        Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

2.打开Camera 过滤

Camera 过滤 Action方法

十四、打开视频录像

1.使用方法

/**
     * 打开录像视频
     * **/

    public static void OpenCameraVideo(Context context) {
        Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

2. 打开录像功能过滤

过滤录像功能方法

十五、 选择联系人

1. 使用方法

/***
     * 选择联系人
     * **/
    public static void SelectContact(Context context) {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

十六、 查看联系人

1.使用方法

/***
     * 查看联系人
     * **/
    public static void ViewContact(Context context, Uri contactUri) {
        Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

十七、 编辑联系人

1. 使用方法

/***
     * 编辑联系人
     * **/
    public static void EditContact(Context context, Uri contactUri, String email) {
        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setData(contactUri);
        intent.putExtra(Intents.Insert.EMAIL, email);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

十八、插入联系人

1.使用方法

/***
     * 插入联系人
     * **/
    public static void InsertContact(Context context, String name, String email) {
        Intent intent = new Intent(Intent.ACTION_INSERT);
        intent.setType(Contacts.CONTENT_TYPE);
        intent.putExtra(Intents.Insert.NAME, name);
        intent.putExtra(Intents.Insert.EMAIL, email);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

十九、写邮件

1. 使用方法

/***
     * 写邮件
     * **/
    public static void composeEmail(Context context, String[] addresses,
            String subject, Uri attachment) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("*/*");
        // intent.setData(Uri.parse("mailto:"));
        // only email apps should handle this
        intent.putExtra(Intent.EXTRA_EMAIL, addresses);
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        intent.putExtra(Intent.EXTRA_STREAM, attachment);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

2. 邮件过滤

邮件过滤 方法

二十、 打开地图指定点

1. 使用方法

/***
     * 打开地图指定点
     * **/
    public static void callCar(Context context, Uri geoLocation) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(geoLocation);
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

二十一、检索特定类型图片

1.使用方法

/***
     * 检索特定类型图片 获取照片
     * **/
    public static void selectImage(Context context) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        if (intent.resolveActivity(context.getPackageManager()) != null) {
            context.startActivity(intent);
        }
    }

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,比如:文章底部留言,12小时内必删,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

点个在看,为大佬点赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值