Android中Intent具体解释(一)
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具体解释(一)的更多相关文章
- Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍
通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Inten ...
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...
- Android中Intent传值与Bundle传值的区别详解
Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面 这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...
- [转]Android中Intent传递对象的两种方法(Serializable,Parcelable)
http://blog.csdn.net/xyz_lmn/article/details/5908355 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种 ...
- Android中intent如何传递自定义数据类型
转载自:http://www.cnblogs.com/GoAhead/archive/2012/07/16/2593868.html 大家好,好久不见,今天要给大家讲一下Android中Intent中 ...
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
[转][原文] 大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object); ...
- Android中Intent的用法总结
Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle), ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- 【转】Android中intent传递对象和Bundle的用法
原文网址:http://blog.csdn.net/lixiang0522/article/details/8642202 android中的组件间传递的对象一般实现Parcelable接口,当然也可 ...
随机推荐
- react-native react-navigation使用
npm install react-navigation --save 安装 代码中引入StackNavigator组件 5CF902D1-9639-494D-8775-A9A87F376734. ...
- Hadoop hostname: Unknown host
本来下想在一台虚拟机上,搭建一个hadoop的测试hadoop,用于调试和阅读hadoop源代码,发现在虚拟机上执行: $hostname -i hostname: Unknown host 这个是因 ...
- struts2:在Action中使用Servlet的API,设置、读取各种内置对象的属性
有两种方式可以实现在Action中使用Servlet的API.一种是使用org.apache.struts2.ServletActionContext类,另一种是使用com.opensymphony. ...
- Python无限元素列表实例教程
有关Python中无限元素列表的实现方法. 本文实例讲述了Python怎么实现无限元素列表的方法,具体实现可使用Yield来完成.下面所述的2段实例代码通过Python Yield 生成器实现了简单的 ...
- 【转】10个非常有用的网页设计工具 | Goodfav Magazine
10+ very useful Web Designer Tools Totally free legal computer eBooks download, available in various ...
- Shiro系列(1) - 权限管理的介绍与原理
1. 什么是权限管理 一般来说,只要有用户参与,那么该系统都会需要权限管理,权限管理实现了对用户访问系统 指定功能的限制,按照管理员定义的安全规则或权限策略,限制用户只能访问自己被授权的那些资源路径 ...
- webBrowser获取cookie
private void BtnOpenUrl_Click(object sender, EventArgs e) { if (txtUrl.Text != "") { Myweb ...
- Python运维自动化开发之Fabric模块
本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便.主要用于多台服务器批量执行任务. 非内置Python模块,需要手 ...
- SQL Server中利用正则表达式替换字符串
--如果存在则删除原有函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace G ...
- ssh以密钥的方式登录服务器时,只要有密钥可以登服务器,如果有密钥和公钥同时存在(在公钥没问题的情况下可以),但如果公钥有问题,就不能登录成功
在~/.ssh/下如果只有密钥或公私同时存在时,都可以成功登录服务器,但!!!!!!如果公钥有换成别的服务器的公钥时,是无法登录远程的服务器!!!!