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. 容错处理库Polly使用文档

    Design For Failure1. 一个依赖服务的故障不会严重破坏用户的体验.2. 系统能自动或半自动处理故障,具备自我恢复能力. 以下是一些经验的服务容错模式 超时与重试(Timeout an ...

  2. update关联其他表批量更新数据-跨数据库-跨服务器Update时关联表条件更新

    1.有时在做项目时会有些期初数据更新,从老系统更新到新系统.如果用程序循环从老系统付给新系统. 2.有时在项目中需要同步程序,或者自动同步程序时会有大量数据更新就可能用到如下方法了. 3.为了做分析, ...

  3. jenkins启动appium服务

    想在jenkins中,自动定时启动appium服务,shell命令已准备如下: BUILD_ID=dontKillMe echo "" > appium.log nohup ...

  4. 最强 Android Studio 使用小技巧和快捷键总结

    最强 Android Studio 使用小技巧和快捷键总结   写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android ...

  5. react-native react-navigation使用

    npm install react-navigation --save 安装 代码中引入StackNavigator组件   5CF902D1-9639-494D-8775-A9A87F376734. ...

  6. 怎么部署 .NET Core Web项目 到linux

    .NET Core is free, open source, cross platform and runs basically everywhere. STEP 0 - GET A CHEAP H ...

  7. centos 7部署graphite(nginx+uwsgi)

    http://www.debugrun.com/a/o5qyP9W.htmlhttp://blog.csdn.net/tsingfu1986/article/details/44239503 http ...

  8. 《Java Concurrency》读书笔记,构建线程安全应用程序

    1. 什么是线程安全性 调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态.如果其他线程企图访问一 ...

  9. android开发前奏曲之开发工具ADT

    原文:http://android.eoe.cn/topic/android_sdk Android开发工具(ADT)插件为Eclipse提供了一个专业级的开发环境,用于构建Android应用程序.这 ...

  10. C++/C课程设计(2)工资管理系统功能说明

    原文取自个人博客:www.jycoder.com欢迎訪问 百度网盘下载源码:Demo.zip 百度网盘下载软件文档:软件文档.zip 工资管理系统 一,     基本功能要求: 1)以password ...