Android学习总结(十)———— Intent的使用
一.Intent的基本概念
我们已经学习完了Android的四大组件了,在四大组件中我们用得最多的是Intent-Filter。Intent含义就是你想利用它调用哪个组件实现相关的功能,比如调用相机组件实现拍照、调用Contact组件获取联系人信息等。通过传递Intent对象调用的这些组件功能时,这些组件可能是安卓系统自身提供的,也可能是你自定义的。
Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成Android各个组件之间的通讯。比如说调用startActivity()来启动一个activity,或者broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver, 再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的activity 或者service,所以可以将intent理解成activity之间的粘合剂。
二.显式Intent与隐式Intent的区别
2.1 显式Intent
通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个。
2.2隐式Intent
不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框。
三.Intent的七个属性
3.1 ComponentName(组件名称)
指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。隐式Intent没有明确要启动哪个组件,应用会根据Intent指定的规则去启动符合条件的组件。示例如下:
ComponentName componentName = new ComponentName(MainActivity.this,NextActivity.class);
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
//简化为
Intent intent = new Intent(MainActivity.this,NextActivity.class);
startActivity(intent);
3.2 Action(动作)
一个普通的字符串,代表Intent要完成的一个抽象动作,比如发信息的一个权限,而具体由哪个组件来完成Intent并不负责,就是仅仅知道会用这个动作,谁来完成就交给Intent-filter进行筛选。
要注意在java中的Action和Intent-filter中的格式是不一样的,比如:<action android name = "android.intent.action.CALL"> 和 intent.setAction(Intent.ACTION_CALL)。
3.3 Category(类别)
同样是普通的字符串,Category则用于为Action提供额外的附加类别信息,两个通常结合使用,一个Intent对象只能有一个Action,但是能有多个Category。
同样在java与Intent-filter中的格式也是不一样的,比如:<category android name = android.intent.category .DEFAULT> 和 intent.addCategorie(Intent.CATEGORY_DEFAULT);可调用removeCategory()删除上次添加的种类,也可以getCategories()方法获取当前对象所包含全部种类。
3.4 Data(数据),Type(MIME类型)
Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示:scheme://host:port/path(参数依次为协议头,主机,端口,路径)
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统会根据Data属性值来分析数据类型。

3.5 Extras(额外)
Extra属性用于在多个Action之间进行数据交换,extra的属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,有自己的key-value,进行数据存储。
3.6 Flags(标记)
表示不同来源的标记,多数用于只是Android如何启动Activity以及启动后如何对待,标记都定义在Intent类中。也可以通过FLAG属性为intent添加一些额外的控制旗标。如:intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
四.示例代码
4.1 显示Intent
这个用得很多,直接就上例子,代码如下:
package com.nyl.intenttest; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnHome; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnHome = (Button) findViewById(R.id.btnHome);
btnHome.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnHome:
Intent it = new Intent();
it.setAction(Intent.ACTION_MAIN);
it.addCategory(Intent.CATEGORY_HOME);
startActivity(it);
break;
}
}
}
这是一个非常简单的例子,点击按钮后就会跳转到系统桌面,就不上运行的效果图了,动手去操作吧!
4.2 隐式Intent
点击按钮后,所有Action为VIEW的Activity被筛选出来,由用户进一步选择,代码如下:
package com.nyl.intenttest; import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity2 extends Activity implements View.OnClickListener { private Button btnTwo; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
btnTwo = (Button) findViewById(R.id.btnTwo);
btnTwo.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnTwo:
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
startActivity(it);
break;
}
}
}
最后在第二个Activity的Intent中添加以下代码,如下所示:
<activity android:name=".MainActivity2"
android:label="第二个Activity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
运行效果图,如下:

一个简单的显式Intent和隐式Intent就学到这里。
Android学习总结(十)———— Intent的使用的更多相关文章
- 十一、Android学习第十天——项目开始(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十一.Android学习第十天——项目开始 Android知识点的学习告一 ...
- android 学习随笔十四(页面跳转与数据传递)
1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...
- android学习之路--------intent
正式开始学习android,没有看书和视频,所以没有系统的学,只是看到哪个知识点就去学习,今天学习界面之间的跳转,以及传值,主要的知识点是intent, @Override protected voi ...
- android 学习随笔十八(广播与服务 )
1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...
- android 学习随笔十六(广播 )
1.广播接收者 BroadcastReceiver 接收系统发出的广播 现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了 Andro ...
- android 学习随笔十五(Activity的生命周期与摧毁时返回数据 )
1.Activity的生命周期 onCreate:创建时调用 onStart:在屏幕上可见,但是还没有获得焦点 onResume:可见并且获得焦点 onPause:可见,但是失去焦点 onStop:不 ...
- android学习笔记29——Intent/IntentFilter
Intent/IntentFilter Intent封装android应用程序需要启动某个组件的“意图”,Intent还是应用程序组件之间通信的重要媒介. EG:Activity之间需要交换数据时,使 ...
- Android学习笔记之Intent(2)
打开网页 package com.jiahemeikang.helloandroid; import java.io.File; import com.jiahemikang.service.Echo ...
- Android学习笔记之Intent(1)
1.Intent指定启动目标组件 2.Intentfilter描述基本组件所在地址 3.其他包引入资源文件时记得引入R所在的包 package com.jikexueyuan.intent; impo ...
- Android学习(十五) 系统服务
一.常用系统服务 后台Service在系统启动时被SystemService开启 1.MountService:监听是否有SD卡安装和移除. 2.ClipboardService:提供剪切板功能. 3 ...
随机推荐
- Android开发相关工具(eclipse篇)
ADT 安装该工具后才能配置Android SDK包,使可以在eclipse里开发Android程序 AVD Android模拟器管理工具,创建删除Android模拟器 SDK Manager And ...
- 【Linux学习】Linux文件系统3—文件操作命令
Linux文件系统3-文件操作命令 Linux文件操作命令主要有: cd: 改变目录位置 pwd: 显示当前目录的绝对路径 ls: 显示文件名称.属性等 -a 列出全部文件 -l 列出 ...
- 浅析Apache/Tomcat/JBOSS/Nginx之区别
浅析Apache/Tomcat/JBOSS/Nginx服务器之区别 一.Apache和Tomcat的区别 Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上, ...
- python 三元表达式 列表推导式,生成器表达式。递归,匿名函数, 内置函数
三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值 res = x if x>y else y print(res) name= input("姓名&g ...
- css控制页面文字不能被选中user-select:none;
现象:html中可能有些地方不想让用户复制文字,或是用a标签做了个点击按钮,点快的时候文字会被选中,很丑,这个时候可以使用下面的方案禁止文字选中. 原因:鼠标点快了文字会被选中. 解决方案:不同的浏览 ...
- laravel M层
目录 App\Models 没有就自己创一个 创建对应控制器的php文件,首字母大写 <?php namespace App\Models; use Illuminate\Database\ ...
- Unity亚洲开发者大会会议简录之技术篇,Profiler的一些参数的意思
2014Unity亚洲开发者大会会议简录之技术篇 拖公司的福,有幸去了一趟北京参加了一场Unity3D的交流盛宴,在为期两天的时间内,不仅有着技术上收获,也有心灵上的震撼.现在先来说说技术方面的一些比 ...
- 【NOIP模拟】序列
[问题描述] 一个序列被称为有趣的序列是它的所有的子串拥有一个唯一的整数(这个整数在整个序列中只出现过一次).给你一个序列的整数, 问你它是否是有趣的. [输入格式] 第一行 T, 表示数据组数.接下 ...
- react native 安卓打包--mac环境,如果打包不成功可注意下my-release-key.keystore的位置关系(绝对路径)
// my-release-key.keystore和my-key-alias都是可修改的名称 1.生成签名密钥(keytool -genkey -v -keystore my-release-key ...
- typescript学习笔记(一)----基础类型
1.使用typescript前第一个操作就是全局配置typescript环境 ---------------npm install -g typescript 2.typescript(以下称为ts, ...