Android开发实践 Intent

Intent是应用程序之间通信的重要媒介,Activity、Service、BroadcastReceiver都是依靠Intent来进行启动的。

Intent对象大致包含了Component、Action、Category、Data、Type、Extra、Flag这七种属性。

Component:用于确定指定需求启动的目标组件

Action:代表该Intent所要完成的一个抽象动作

Category:用于为Action增加额外的附加类别信息,通常Action会与Category结合使用

Data:通常用于向Action属性提供操作的数据

Type:用于指定该Data所指定Uri对应的MIME类型

Extra:通常用于在多个Activity之间进行数据交换

Flag:用于为该Intent添加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent添加控制旗标。

下面将介绍Intent对象各属性的作用:

1.Component属性

Intent的Component属性需要接受一个ComponentName对象

// 创建一个ComponentName对象
ComponentName comp = new ComponentName(MainActivity.this, TwoActivity.class);
Intent intent = new Intent();
// 为Intent设置Component属性
intent.setComponent(comp);
// Intent intent = new Intent(MainActivity.this, TwoActivity.class);
startActivity(intent);

下面来显示Activity对应Intent的Component属性的包名、类名

// 获取该Activity对应的Intent的Component属性
ComponentName comp = getIntent().getComponent();
// 显示该ComponentName对象的包名、类名
show.setText("组件包名为:" + comp.getPackageName() + "\n组件类名为:" + comp.getClassName());
// 运行结果:组件包名为:com.gc.component
// 组件类名为:com.gc.component.TwoActivity

2.Action、Category属性和intent-filter配置

Android提供的标准Action:Intent.ACTION_VIEW(表示一个抽象的查看操作),具体查看什么,启动哪个Activity来查看取决于Activity的intent-filter配置中包含了该ACTION_VIEW,该Activity就有可能被启动。

1)我们来实现一下点击按钮为Intent指定Action跳转TwoActivity,如下:

// 创建Intent对象
Intent intent = new Intent();
// 为Intent设置Action属性(属性值就是一个普通字符串)
intent.setAction("com.gc.intent.action.CRAZYIT_ACTION");
startActivity(intent);

接下来配置intent-filter元素(用于配置Activity响应的Intent),intent-filter元素通常包括Action、Category、Data子元素

<activity android:name=".TwoActivity" android:label="@string/app_name">
    <intent-filter>
        <!-- 指定该Activity能响应Action为指定字符串的Intent -->
        <action android:name="com.gc.intent.action.CRAZYIT_ACTION" />
        <!-- 指定该Activity能响应Action属性为helloWorld的Intent -->
        <action android:name="helloWorld" />
        <!-- 指定该Action能响应Category属性为指定字符串的Intent -->
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

接下来我们在开启的TwoActivity中获取该Activity对应的Intent的Category属性

Set<String> cates = getIntent().getCategories();

2)指定Action、Category调用系统Activity

Android内部提供了大量标准的Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:

Action常量 对应字符串 简单说明
ACTION_MAIN android.intent.action.MAIN 应用程序入口
ACTION_VIEW android.intent.action.VIEW 显示指定数据
ACTION_CHOOSER android.intent.action.CHOOSER 显示一个Activity选择器
ACTION_GET_CONTENT android.intent.action.GET_CONTENT 让用户选择数据,并返回所选的数据
ACTION_DIAL android.intent.action.DIAL 显示拨号面板
ACTION_CALL android.intent.action.CALL 直接向指定用户拨打电话
ACTION_SEARCH android.intent.action.SEARCH 执行搜索

标准Category常量及对应字符串如下:

Category常量 对应字符串 简单说明
CATEGORY_DEFAULT android.intent.category.DEFAULT 默认Category
CATEGORY_BROWSABLE android.intent.category.BROWSABLE 指定该Activity能被浏览器安全调用
CATEGORY_TAB android.intent.category.TAB 指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHER android.intent.category.LAUNCHER Activity显示在顶级程序列表中
CATEGORY_INFO android.intent.category.INFO 用于提供包信息
CATEGORY_HOME android.intent.category.HOME 设置该Activity随系统启动而运行
CATEGORY_CAR_DOCK android.intent.category.CAR_DOCK 指定手机被插入汽车硬件时运行该Activity
CATEGORY_DESK_DOCK android.intent.category.DESK_DOCK 指定手机被插入桌面硬件时运行该Activity
CATEGORY_CAR_MODE android.intent.category.CAR_MODE 指定该Activity可在车载环境下使用

3)我们设置一个按钮,点击将返回系统Home界面,按钮的点击事件如下:

// 创建Intent对象
Intent intent = new Intent();
// 为Intent设置Action、Category属性
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

3.Data、Type属性

Data通常用于向Action属性提供操作的数据,Type用于指定该Data所指定Uri对应的MIME类型。

1)Data和Type关系微妙,会相互覆盖:

Intent先设置Data,后设置Type,那么Data被覆盖;
Intent先设置Type,后设置Data,那么Type被覆盖;
如果希望两者都存在,则应调用Intent的setDataAndType()方法。

Data属性接收一个Uri对象,一个Uri对象通常表示形式如下:

scheme://host:port/path
// 例如:content://com.android.contacts/contacts/123

2)接下来使用Action、Data属性启动系统Activity浏览指定网页,点击事件如下:

// 创建Intent
Intent intent = new Intent();
String data = "http://www.126.com";
// 根据指定字符串解析出Uri对象
Uri uri = Uri.parse(data);
// 为Intent设置Action属性
intent.setAction(Intent.ACTION_VIEW);
// 设置Data属性
intent.setData(uri);
startActivity(intent);

本篇介绍总结了Android系统中Intent的功能和用法,当Activity应用需要启动某个组件时,总需要借助Intent来实现,还有启动Service、BroadcastReceiver组件也都是由Intent来实现的。

时间: 2024-11-05 18:27:50

Android开发实践 Intent的相关文章

Android开发实践:WIFI连接功能的封装

在上一篇文章<Android开发实践:WIFI扫描功能的封装>介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用. 与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果.该回调接口的定义如下: public interface WifiConnectListener { public void OnWifiConne

Android开发实践:Android交叉编译工具链的使用

前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件. 经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

Android开发实践:由new Handler()说开去

最近面试一些Android开发的应聘者,除了基本的Activity生命周期等基础问题以外,我一般还会问如下两个问题: (1) Service与Thread有什么区别? (2) 在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别? 第一个问题其实是一个伪命令,因为Service是Android四大组件之一,而Thread只是Java提供的一个封装了线程管理的工具类,无论是Activity还是Service,都可以通过Thread来创建一个

Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题. 首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: package com.titcktick.customview; import android.content.Con

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

Android开发实践:以“专业”的态度处理多线程

刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更"专业"?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,但是在实际的项目中,往往不那么简单,比如需要设计Socket通信协议,需要处理Socket的连接异常断开,需要考虑在线程阻塞的情况下如何正常退出和释放资源等等,关于这些"实战经验",前面的文章也有所涉及,以后有空准备再开个专题跟大家分享探讨一下,今天先简单地说说怎样更&quo

Android开发实践:实战演练隐式Intent的用法

本文通过完成一个实战任务,来掌握Android开发中隐式Intent的用法. 任务:假设我们已经实现了一个视频播放器(PlayerActivity),我们希望能把它注册到系统中,当用户点击本地视频或者在线视频时,能启动这个视频播放器. (假设该类的全路径为:com.jhuster.videoplayer.PlayerActivity) [注]:本文完整的示例代码请到我的Github下载,地址:VideoPlayer 1. 什么是隐式Intent? Intent是Android中比较重要的组件,常

Android开发实践:自己动手编写图片剪裁应用(1)

最近利用一周左右的业余时间,终于完成了一个Android图片剪裁库,核心功能是根据自己的理解实现的,部分代码参考了Android源码的图片剪裁应用.现在将该代码开源在Github上以供大家学习和使用,地址:https://github.com/Jhuster/ImageCropper,效果如下所示: 我的大致计划是首先介绍一下这个库的用法,然后再写几篇文章介绍一下其中的一些原理和关键技术,希望对Android开发新手有所帮助. [特性] 支持通过手势移动和缩放剪裁窗口 支持固定剪裁窗口大小.固定