`
肖福燕
  • 浏览: 11820 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深入了解Intent

阅读更多
1、Intent组件在Android中是一个十分重要的组件,它是连接不同应用程序的桥梁和纽带,也是让组件级复用(Activity和Service)成为可能的一个重要因素。Intent组件的主要作用是运行在相同或不同应用程序的Activity、Service、Broadcasereciver间进行切换和数据的传送。Intent的功能有很多,例如:打开网页、打电话、发短信等。

2、Intent的构成
  Intent数据结构两个最重要的部分是动作和动作对应的数据,典型的动作类型有:MAIN、VIEW、DAIL、EDIT等,二动作对应的数据一般以URI的形式进行表示。
  1、Intent的动作(Action)
  在Intent中,Action就是希望触发的动作。当你指明了一个Action,执行者就会依照这个动作的指示接受响应的输入,表现对应行为,产生响应的输出。可以通过setAction()方法进行设置Action,通过getAction()方法读取。
  2、Intent动作对应的数据
  一共分为以下六种数据:数据(Data)、数据类型(Type)、操作类别(Category)、附加信息(Extras)、组件(Component)、标志(Flags)。
  数据:指作用与动作的数据的URI和数据的MIME类型。不同的动作有不同的数据规格。例如如果动作是ACTION_VIEW,数据字段是一个http:URI,接受活动将被调用去下载和显示URI指向的数据,不同的动作对应不同的Data。
  数据类型:指定要传送的数据的MIME类型,可以直接通过setType()方法进行设置,getType()方法读取类型。一般Intent的数据类型能够根据数据本身进行判定,但是通过setType()方法设置属性,可以强制采用显示指定的类型而不必进行推导。
  操作类别:有时通过Action,配合Data或Type,很多时候可以准确地表达出一个完整的意图,但也会知道一些约束在里面才能够更精准。一个实例是:所有的应用主Activity都需要一个Category为CATEGORY_LAUNCHER,Action为ACTION_MAIN的Intent。
  附加信息:传递的是一组键值对,可以使用putExtra()方法进行设置,主要的功能是传递数据(Uri)所需要的一些额外的操作信息。使用extras可以为组件提供扩展信息。
  组件:指明了将要处理的Activity程序,通常Android会根据Intent中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是如果component这个属性有指定的话,将直接使用它指定的组件。所有的组件信息都被封装在一个ComponentName对象中,这些组件必须在AndroidManifest.xml文件中“<application>”中注册。
  标志:Flags是一个整形数,由一系列的标志位构成,这些标志用来指明运行模式的,共有20种。这些标志都定义在Intent类中,可以通过addFlags()方法进行增加。

3、使用实例
从google搜索内容:
  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_WEB_SEARCH);
  intent.putExtra(SearchManager.QUERY, "searchString");
  startActivity(intent);
浏览网页
  Uri uri = Uri.parse("http://www.baidu.com");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
显示地图
  Uri uri = Uri.parse("geo:33.333333, -44.444444");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
路径规划
  Uri uri = Uri.parse("http://maps.google.com/maps?f=dsaddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
拨打电话
  Uri uri = Uri.parse("tel:03165659631");
  Intent intent = new Intent(Intent.ACTION_DIAL, uri);
  startActivity(intent);
调用发短信的程序
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.putExtra("sms_body", "text");
  intent.setType("vnd.android-dir/mms-sms");
  startActivity(intent);
发送短信
  Uri uri = Uri.parse("smsto:12345678999");
  Intent it = new Intent(Intent.ACTION_SENDTO, uri);
  it.putExtra("sms_body", "text");
  startActivity(it);
  String body = "This is body";
  Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null));
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body);
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true);
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true);
  startActivity(intent);
发送彩信
  Uri uri = Uri.parse("content://media/external/images/media/23");
  Intent it = new Intent(Intent.ACTION_SEND);
  it.putExtra("sms_body", "text");
  it.putExtra(Intent.EXTRA_STREAM, uri);
  it.setType("image/png");
  startActivity(it);
  StringBuilder sb = new StringBuilder();
  sb.append("file://");
  sb.append(fd.getAbsoluteFile());
  Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null));
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject);
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body);
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString());
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode);
  intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent);
  startActivity(intent);
播放多媒体
  方式一:Intent it = new Intent(Intent.ACTION)VIEW);
  Uri uri = Uri.parse("file:///sdcard/demo.mp3");
  it.setDataAndType(uri, "audio/mp3");
  startActivity(it);
  方式二:Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
卸载apk
  Uri uri = Uri.fromParts("package", strPackageName, null);
  Intent it = new Intent(Intent.ACTION_DELETE, uri);
  startActivity(it);
安装apk
  Uri uri = Uri.fromParts("package", "xxx", null);
  return new Intent(Intent.ACTION_PACKAGE_ADDED, uri);
打开照相机
  方式一:Intent it = new Intent(Intent.ACTION_CAMERA_BUTTON, null);
  sendBrodcast(it);
  方式二:long dataTaken = System.currentTimeMillis();
  String name = createName(dataTaken) + ".jpg";
  fileName = folder + name;
  ContentValues values = new ContentValues();
  values.put(Images.Media.TITLE, fileName);
  values.put("_data", fileName);
  values.put(Images.Media.PICASA_ID, fileName);
  values.put(Images.Media.DISPLAY_NAME, fileName);
  values.put(Images.Media.DESCRIPTION, fileName);
  values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName);
  Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  it.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  startActivityForResult(it, 10);
从gallery选取图片
  Intent it = new Intent();
  it.setType("image/*");
  it.setAction(Intent.ACTION_GET_CONTENT);
  startActivityForResult(it, 11);
打开录音机
  Intent it = new Intent(Media.RECORD_SOUND_ACTION);
  startActivity(it);
显示应用详细列表
  Uri uri = Uri.parse("market://details?id=app_id");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
发送email
  方式一:Uri uri = Uri.parse("mailto:xxx@xxx.com");
  Intent it = new Intent(Intent.ACTION_SENDTO, uri);
  startActivity(it);
  方式二:Intent it = new Intent(Intent.ACTION_SEND);
  it.putExtra(Intent.EXTRA_EMAIL, "my@xxx.com");
  it.putExtra(Intent.EXTRA_TEXT, "The body text");
  it.setType("text/plain");
  startActivity(Intent.createChooser(it, "Choose email client"));
  方式三:Intent it = new Intent(Intent.ACTION_SEND);
  String[] tos = {"my@xxx.com"};
  String[] ccs = {"you@xxx.com"};
  it.putExtra(Intent.EXTRA_EMAIL, tos);
  it.putExtra(Intent.EXTRA_CC, ccs);
  it.putExtra(Intent.EXTRA_TEXT, "body text");
  it.putExtra(Intent.EXTRA_SUBJECT, "subject text");
  it.setType("message/rfc822");
  startActivity(Intent.createChooser(it, "Choose email client"));
  发送附件:Intent it - new Intent(Intent.ACTION_SEND);
  it.putExtra(Intent.EXTRA_SUBJECT, "subject text');
  it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/demo.mp3");
  it.setType("audio/mp3");
  startActivity(Intent.createChooser(it, "Choose enail client"));
寻找应用
  Uri uri = Uri.parse("market://search?q=pname:pkg_name");
  Intent it = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(it);
打开联系人列表
  方式一:Intent it = new Intent();
  it.setAction(Intent.ACTION_GET_CONTENT);
  it.setType("vnd.android.cursor.item/phone");
  startActivityForResult(it, REQUEST_TEXT);
  方式二:Uri uri = Uri.parse("content://contacts/people");
  Intent it = new Intent(Intent.ACTION_PICK, uri);
  startActivity(it, REQUEST_TEXT);
打开另一程序
  Intent it = new Intent();
  ComponentName cn = new ComponentBane("com.yellowbook.android2", "com.yellowbock.android2.AndroidSearch");
  it.setComponent(cn);
  it.setAction("android.intent.action.MAIN");
  startActivityForResult(it, RESULT_OK);
调用系统编辑器添加联系人
  Intent it = new Intent(Intent.ACTION_INSERT_OR_EDIT);
  it.setType("vnd.android.cursor.item/contact:);
  it.putExtra("name", "myName");
  it.putExtra(android.provider.Contacts.Intents.Insert.COMPANY, "organization");
  it.putExtra(android.provider.Contacts.Intents.Insert.EMAIL, "email");
  it.putExtra(android.provider.Contacts.Intents.Insert.PHONE, "homePhone");
  it.putExtra(android.provider.Contacts.Intents.Insert.SECONDARY_PHONE, "mobilePhone");
  it.putExtra(android.provider.Contacts.Intents.Insert.TERTIARY_PHONE, "workPhone");
  it.putExtra(android.provider.Contacts.Intents.Insert.JOB_TITLE, "title");
  startActivity(it);
分享到:
评论

相关推荐

    intent的深入分析

    Intent是Android系统中一个至关重要的组件,它是应用...开发者应深入理解Intent的各个属性和使用场景,并遵循最佳实践,确保应用的健壮性和用户体验。通过不断的实践和学习,我们可以更好地掌握Intent,提升开发能力。

    Android的Intent实验

    通过这个实验,开发者可以深入理解Intent的工作原理,并学会如何在实际项目中有效利用Intent进行组件间的通信。通过不断的实践,你会更加熟练地运用Intent,提升Android应用的交互性和用户体验。

    android Intent test

    在“android Intent test”项目中,我们将会深入理解Intent的概念、使用方式以及其在源码中的实现原理。 Intent主要有两种类型:显式Intent和隐式Intent。显式Intent用于直接指定要启动的组件,通过类名或组件的...

    java Intent的应用小例子

    在这个“java Intent的应用小例子”中,我们将深入理解Intent的基本概念和使用方法,以及它在实现乘法功能中的应用。 1. **Intent的基本概念**: - Intent是一个对象,用于封装应用程序中的动作、数据和目标信息。...

    intent使用源码

    在深入理解Intent的使用源码之前,我们需要先了解Intent的基本概念和组成部分。 Intent主要包含两部分:Action(动作)和Data(数据)。Action定义了Intent想要执行的操作,比如ACTION_VIEW、ACTION_CALL等。Data则...

    Android应用源码之Intent_Intent.zip

    本资源包“Android应用源码之Intent_Intent.zip”应该包含了关于Intent使用的一些示例代码和解析,帮助开发者深入理解Intent的工作原理。 1. **Intent的类型** Intent主要有两种类型:显式Intent和隐式Intent。...

    Android Intent切换.zip

    本资料"Android Intent切换.zip"包含了关于Intent使用的源码示例,通过解析其中的文件,我们可以深入理解Intent的工作机制。 首先,`源码说明.txt`可能包含对Intent使用的基本介绍和代码解释。通常,这种文本文件会...

    Intent的启动

    深入理解Intent的启动,需要查看Android系统的源代码。在ActivityManagerService(AMS)中,处理startActivity()和startService()请求,涉及Intent的解析、组件的查找和生命周期管理。 总结: Intent是Android系统...

    Android源码——Intent切换.zip

    在深入理解Intent工作原理时,可以查看Android源码中的`Intent`类和`IntentResolver`类。`Intent`类主要负责Intent的构建和操作,`IntentResolver`则处理Intent的匹配逻辑。通过阅读源码,开发者可以了解Intent如何...

    实验七 使用Intent在Activity间传输数据

    在“实验七 使用Intent在Activity间传输数据”中,我们将深入理解Intent的工作原理及其在不同Activity间传输数据的方法。这个实验旨在帮助开发者掌握如何在Android应用程序的不同界面之间有效地传递信息。 首先,...

    安卓Android源码——Intent.rar

    本资源“安卓Android源码——Intent.rar”可能包含了Intent的详细源代码分析,帮助开发者深入理解Intent的工作原理。 1. **Intent基础概念**: Intent在Android中扮演着“信使”的角色,它携带数据并指明一个操作...

    android各组件详解- Intent.

    通过深入理解Intent的各个组成部分,开发者可以更加高效地利用Intent机制,构建功能丰富且交互流畅的Android应用程序。无论是跨组件通信、启动服务还是发送广播,Intent都扮演着不可或缺的角色,掌握其使用技巧对于...

    Android应用源码之Intent.zip

    通过分析这个"Intent.zip"中的源码,开发者可以深入理解Intent的工作原理,学习如何正确地创建和使用Intent,以及如何设计和解析IntentFilter,这对于提高Android应用的交互性和灵活性具有重要意义。

    intentintent

    在Android操作系统中,Intent是一种非常重要的组件,它用于在应用程序之间、组件之间传递消息和启动服务。...在进行安卓实验4intent时,实践这些概念将有助于深入理解Intent的工作原理和使用场景。

    Android Intent 学习

    通过以上内容,我们可以深入理解Intent在Android开发中的应用,并能灵活运用到实际项目中,无论是启动组件、传递数据还是进行跨组件通信,Intent都是不可或缺的一部分。通过实践“Android Intent学习实例”,能够...

    [Android开发从零开始].7.Intent初级学习

    在这个初级学习阶段,我们将深入理解Intent的基本概念、类型以及如何使用。 一、Intent基础 Intent在Android系统中扮演着“信使”的角色,它能启动新的Activity或Service,或者向BroadcastReceiver发送广播。Intent...

    Android组件间通信–深入理解Intent与IntentFilter

    在实际应用中,理解Intent和IntentFilter的工作原理对于优化组件间的交互至关重要。例如,如果你想创建一个公开的Activity,允许其他应用调用,你需要在Activity的IntentFilter中添加相应的配置,这样其他应用的...

    安卓Android源码——Intent1.rar

    本压缩包文件“安卓Android源码——Intent1.rar”很可能包含了有关Intent的源代码分析和示例,帮助开发者深入了解Intent的工作机制。 首先,Intent 的基本结构分为两部分:Action 和 Data。Action 定义了 Intent 的...

    Android组件间通信--深入理解Intent与IntentFilter

    3. 对于隐式Intent,开发者应当提供清晰的文档说明,以便其他开发者了解如何使用。 4. 使用显式Intent时,确保组件名正确无误,否则会导致找不到目标组件的异常。 5. 考虑到隐私和安全,谨慎处理隐式Intent,尤其是...

Global site tag (gtag.js) - Google Analytics