Intent是一种消息传递机制。它能够在应用程序内使用,也能够在应用程序间使用,主要用途分为:

1.使用类名显示的启动一个特定的Activity或Service

2.启动Activity或Service来运行一个动作的Intent,通常须要使用特定的数据,或者对特定的数据运行动作

3.广播某个事件已经发生

Intent最常见的一个使用方法是显示的(通过指定要装载的类)或隐式的(通过请求对一条数据运行某个动作)启动新的activity,在后一种情况下,动作不一定由调用应用程序中的Activty运行。

Intent也能够在系统范围内发送广播消息。应用程序能够注冊一个Broadcast Receiver来监听对应这些广播的Intent。Android就是通过广播Intent来发布系统事件,比方网络连接状态或者电池电量的改变。

1.使用Intent来启动activity

Intent最常见的用途就是绑定应用程序组件。并在应用程序之间进行通信。

1.1 显示启动新Activity

要显示的选择要启动的Activity类。能够创建一个新的Intent来指定当前Activity的上下文以及要启动的Activity的类,然后把这个Intent传递给startActivity。代码例如以下:

<span style="white-space:pre">	</span>Intent intent = new Intent(getApplicationContext(), Activity1.class);
startActivity(intent);

在调用startActivity之后,新的Activity将会被创建 启动和恢复执行。他会移动到Activity栈的顶部。

调用新的Activity的finish或按下设备的返回button将关闭该Activity。并把它从栈中移除。

1.2 隐式的Intent和执行时迟绑定

隐式的Intent提供了一种机制,能够让匿名的应用程序组件对应请求动作,也就是说,能够要求系统启动一个可运行给定动作的Activity。而不必知道须要那启动哪个应用程序或Activity。

假如在我们的应用程序中,能够让用户点击某个button实现拨打电话的操作。那么能够使用隐式的Intent来完毕,代码例如以下:

<span style="font-size:14px;"><span style="white-space:pre">	</span>intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:010-123456"));
startActivity(intent);</span>

Android会解析这个Intent,并启动一个新的Activity,该Activity会提供对这个电话号码进行拨号的动作。

当构建一个隐式的Intent时,须要指定一个要运行的动作,另外。也能够提供运行那个动作须要的uri数据,还能够通过向Intent加入extra来向目标Intent发送额外的数据。

Extra是一种想Intent附加基本类型值得机制。

假设多个Activity都能运行指定的动作,则会向用户呈现各种选项。Intent Resolution解析过程是通过分析注冊的Broadcast Receiver来完毕的。

很多本地应用程序都提供了能够对特定数据运行动作的Activity。第三方应用程序能够通过注冊来支持新的动作,也能够提供本地动作的替换提供器。

1.3 确定Intent是否能解析

在自己的应用程序中。利用第三方应用程序的Activity和Service是十分方便的,可是我们无法保证用户设备上安装了特定的某个应用程序或者设备上有可以处理我们的请求的应用程序。

因此。在调用startActivity之前,确定调用是否可以解析为一个Activity是一种非常好的选择。

通过调用Intent的resolveActivity方法,并向该方法传入包管理器,可以对包管理器进行查询。确定是否有Activity可以启动以响应该Intent。代码例如以下:

<span style="font-size:14px;"><span style="white-space:pre">	</span>Intent intent = new Intent(getApplicationContext(), Activity1.class);
PackageManager pm = getPackageManager();
ComponentName cn = intent.resolveActivity(pm);
if (cn == null) {</span>
<span style="font-size:14px;">		//没有activity能够处理这个动作,检查google play能否够
Uri marketUri = Uri.parse("market://search? q=pname:com.happy.demo");
Intent marketIntent = new Intent(Intent.ACTION_VIEW).setData(marketUri);
if(marketIntent.resolveActivity(pm)!=null){
startActivity(marketIntent);
}else{
Log.i(TAG, "sorry,无法解析");
}
<span style="white-space:pre"> </span>} else {
startActivity(intent);
}</span>

假设没有找到对应的Activity。能够选择禁用相关的功能,也能够引导用户去应用市场中找合适的应用程序。

1.4 从Activity返回结果

通过startActivity启动的Activity独立于父Activity。而且在关闭时不会提供不论什么反馈。

当须要反馈时。能够启动一个Activity作为还有一个Activity的子Activity。用它向父Activity传递结果,子Activity仅仅是以一种不同的方式启动的Activity。

当子Activity结束时。它会出发调用Activity内的事件处理程序onActivityResult。

对于一个Activity为还有一个Activity提供数据输入的情况,子Activity特别适用。

startActivityForResult的工作形式和startActivity相似,可是有一个重要的差别,除了传入显示或隐式Intent外。还须要传入一个请求码,这个值将在后面用户唯一标识返回了结果的子Activity。代码例如以下:

<span style="white-space:pre">	</span>private static final String TAG = "MainActivity";
private static final int SHOW_ACTIVITY_01 = 1;
@Override
<span style="white-space:pre"> </span>protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(getApplicationContext(), Activity1.class);
startActivityForResult(intent, SHOW_ACTIVITY_01);
<span style="white-space:pre">	</span>}

当准备好返回子Activity时。能够在调用finish曾经调用setResult。以便向调用Activty返回一个结果。

setResult方法有两个參数:结果码和表示为Intent的结果数据本身。

结果码是执行子Activity的结果----一般是Activity.RESULT_OK或者Activity.RESULT_CANCELED。当这两个值不能满足我们需求时,能够使用自己的响应码。setResult支持随意的整数值。

作为结果返回的Intent通常包括某段内容(比方选择的联系人 电话号码)的URI和用户返回附加信息的一组extra。代码例如以下:

<span style="font-size:14px;"><span style="white-space:pre">	</span>long selectedItemId = listView.getSelectedItemId();
Uri selectedHorse = Uri.parse("content://horses/"+selectedItemId);
intent = new Intent(Intent.ACTION_PICK, selectedHorse);</span>
<span style="font-size:14px;">	setResult(Activity.RESULT_OK, intent);
finish();</span>

假设用户通过按下硬件返回键关闭Activity。或者在调用finish之前没有调用setResult,那么结果码将被设置为Result_CANCELED,结果Intent将被设置为null。

当子Activity关闭的时候,将会触发其调用Activity的onActivityResult事件处理程序,能够对其进行重写来处理返回结果,其方法接收三个參数,分别为:

请求码:在启动正在返回的Activity时使用的请求码

结果码:子Activity设置的结果码。用于说明其结果。

数据:Intent用来包装全部返回的数据,可能包括代表指定内容的uri,也可能是子Activity设置的Intent内以extra形式返回的数据。

代码例如以下:

<span style="font-size:14px;"><span style="white-space:pre">	</span>@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SHOW_ACTIVITY_01:
if (requestCode == Activity.RESULT_OK) {
//TODO
}
break; case SHOW_ACTIVITY_02:
if (requestCode == Activity.RESULT_OK) {
//TODO
}
break;
} }</span>

好了,Intent第一篇就简单写到这了,目測没什么难的,都是基础性的东西。

Android中Intent具体解释(一)的更多相关文章

  1. Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍

    通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Inten ...

  2. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...

  3. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  4. [转]Android中Intent传递对象的两种方法(Serializable,Parcelable)

    http://blog.csdn.net/xyz_lmn/article/details/5908355 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种 ...

  5. Android中intent如何传递自定义数据类型

    转载自:http://www.cnblogs.com/GoAhead/archive/2012/07/16/2593868.html 大家好,好久不见,今天要给大家讲一下Android中Intent中 ...

  6. Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

    [转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...

  7. Android中Intent的用法总结

    Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle), ...

  8. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  9. 【转】Android中intent传递对象和Bundle的用法

    原文网址:http://blog.csdn.net/lixiang0522/article/details/8642202 android中的组件间传递的对象一般实现Parcelable接口,当然也可 ...

随机推荐

  1. DCM 图片查看

    因为要处理一些医学图像,需要把dcm格式的文件转换成jpg格式.本来用Sante DICOM Editor用得挺好的,方便查看dcm文件,但是在转换上每次只能转一张(本人没有找到用该软件批量转格式的方 ...

  2. Android Studio主题设置、颜色背景配置

    打开http://color-themes.com/有很多样式可供选择 导入方式 下载主题—xxx.jar 注意:如果我们下载下来的jar名字如果有空格,一定要把空格去掉,同时文件路径中不要含有中文 ...

  3. django -- while time zone support is active

    一.先看报错: django 在处理datetime类型的的报错/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site ...

  4. eclipse自动切换到debug视图

    原文出自:http://blog.csdn.net/yizhizouxiaqu/article/details/7594502 当弹出"Confir Perspective Switch&q ...

  5. ASP.NET MVC中全局异常处理

    以前不知道从哪里找到的处理全局异常的,觉得蛮好用就记下来了. 1, 建立MyExecptionAttribute.cs类,写入如下代码: using System; using System.Coll ...

  6. listview 两个Item可以同时点击

    android:splitMotionEvents="false" ListView的这个属性可以限制它不能同时点击两个Item

  7. OpenCV中图像算术操作与逻辑操作

    OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作各自是图像点操作与块操作.简单点说图像点操作就是图像每一个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实 ...

  8. 菜鸟学Java(四)——JSP内置对象

    学习JavaWeb就离不开JSP,而学习JSP又不得不了解它常用的九个内置对象.今天来做一个简单介绍. request Request封装了用户提交的信息,通过调用Request相应的方法可以获取封装 ...

  9. 2-7-集合运算(A-B)∪(B-A)-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第2章  线性表 - 集合运算(A-B)∪(B-A) ——<数据结构>-严蔚敏.吴伟民版        ★有疑问先阅读★ 源码使用说明  链接☛☛☛ <数据结构-C语言 ...

  10. 提取字符串中的数字(C语言)

    题目要求 问题描述:给定一个任意字符串,提取出其中所包含的整数. 样例输入:A12 32bc de51f6576g 样例输出:共计 4 个整数:12 32 51 6576 解决方案-指针版本 核心思想 ...