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. zTree变异篇:如何让同级树节点平铺而非垂直显示

    昨天有一个zTree的使用者在实际的项目中有着这样一个特殊的需求,要求同级树节点能够水平显示,根据设定的宽度自动换行,效果图如下所示:   通过在浏览器调试模式下观察其同级节点的css为: 这个dis ...

  2. 使 Inno Setup 打包出的安装程序以管理员身份运行

    找到 Inno Setup 安装目录下的 SetupLdr.e32 文件,用 Resource Hacker 将其中的 Manifest 修改一下: 改为: <requestedExecutio ...

  3. 一篇文章学会shell工具篇之sed

    sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫做流编辑器,在shell脚本和Makefile ...

  4. amazon建立基于centos的ec2

    在amazon上建立centos系统的ec2,主要就是系统要找对. 1.登录网址:amazonaws-china.com,注意这个网址是专门为在国内建立国外通用亚马逊ec2设立的,其他的是用国内的ec ...

  5. zabbix rpm 安装 新增zabbix yum 源 并更新

    需要安装的包: # rpm -qa|grep zabbix zabbix-server-2.4.3-1.el6.x86_64 zabbix-web-mysql-2.4.3-1.el6.noarch z ...

  6. ngx_http_stub_status_module

    ngx_http_stub_status_module是一个Nginx的内置 HTTP模块,该模块可以提供Nginx的状态信息.编译的时候 需指定加载该模块: --with-http_stub_sta ...

  7. .NET MVC+ EF+LINQ 多表联查VIEW显示列表

    1.VIEW 页面显示代码 <link href="~/Content/bootstrap.css" rel="stylesheet" /> < ...

  8. 重复代码检查工具simian的基本用法

    simian是一个检查重复代码的工具,支持通过命令行和UI方式来检查代码,可以检查多种语言(比如C\C++, java, c#等)的代码,常见的编程语言都支持,下面先来看看如何使用命令行来检查c++重 ...

  9. psycopg使用

    1.使用示例 import psycopg2 # 建立数据库连接 conn = psycopg2.connect("dbname=test user=postgres") # 开启 ...

  10. CORS跨域、Cookie传递SessionID实现单点登录后的权限认证的移动端兼容性测试报告

    简述 本文仅记录如标题所述场景的测试所得,由于场景有些特殊,且并不需兼容所有浏览器,所以本文的内容对读者也许并无作用,仅为记录. 场景.与实现 需在移动端单点登录 需在移动端跨域访问我们的服务 基于历 ...