Android 中的 Intent 是将要执行的操作的一种抽象的描述,是一个用于Android 各个组件之间传递消息的对象。

Intent 的基本用法

Intent 基本的使用方法主要有三种:

  • 启动一个新的 Activity 实例。

      通过将 Intent 传入 startActivity()中可以启动一个新的实例,其中的 Intent 描述了要启动的 Activity,并包含了一些必要的数据

  • 启动一个服务

       通过将 Intent 传入 startService() 中可以启动一个服务器执行一些一次性的操作(如下载文件等)。其中的 Intent 描述了要启动的服务,并包含了一些必要的数据。

  • 发送广播

      广播指那些所有应用都可以接受的消息,通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),可以将广播传递给其他应用。

Intent 的类型

  Intent 可以分为两种类型:

  • 显式Intent(Explicit Intents)

      通过完全限定类名来指定要启动的组件。当明确的知道要启动的 ActivityService 的名称时可以使用显式的 Intent。例如,启动一个 ActivityService 去响应用户的操作。创建显式 Intent 启动 Activity 或 Service,系统会立即启动 Intent 指定的组件。

  • 隐式 Intent(Implicit Intents)

      不指定特定的组件,而是声明要执行的操作,从而允许其它的组件来处理。例如发送一个 E-mail,则可以使用隐式的 Intent,允许其它的应用来处理该操作。

显式 Intent的使用

  下面的代码表示,当点击按钮 Next 时,启动一个显式的 Intent,转向一个指定的页面

	Button Next = (Button)findViewById(R.id.Next);
Next.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(firstActivity.this,secondActivity.class);
startActivity(intent);
}
});
隐式 Intent 的使用

  下面的代码,当点击按钮 Broswer 时,启动一个隐式的 Intent,打开一个 Web 页面

	Broswer Next = (Button)findViewById(R.id.Broswer);
Next.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.Parse("http://www.baidu.com");
startActivity(intent);
}
});

   创建隐式的 Intent时,Android 系统将 Intent 中指定的内容与设备上其它应用的 AndroidManifest.xml 中声明的 Intent-filter 进行比较,如果 Intent 与声明的 Intent-filter 匹配,则启动对应的组件,并将 Intent传递给它。如果存在多个 intent-filter匹配,则提供一个选择器供用户选择使用哪个应用来处理。

注意:显式的 Intent 总是能够传递给它的目标,而不管目标组件的 intent-filter 是如何定义的

  用户可能没有任何应用可以处理你发送到 startActivity 的隐式 Intent,如果出现这种情况,则调用会失败,且 应用会崩溃 ,因此,在发出一个隐式的 Intent 之前最好验证一下当前设备是否具有可以处理该 Intent 请求的应用。可以调用 Intent 对象的 resolveActivity() 来验证,如果方法返回 null,则说明当前设备没有可以处理该 Intent 的应用,必要情况下应该停止发出此 Intent,如果 返回不为空,则表示至少存在一个可以处理该 Intent的应用。

 

注意:Android 官方建议,通过显式的 Intent 来启动服务,并且不要为服务声明 Intent-Filter,因为使用隐式的 Intent 启动服务时,无法确定响应 Intent* 的服务,用户也无法看到启动的服务,存在一定的安全隐患。在 Android 5.0 开始,使用隐式的 Intent 调用 bindService()将会发生异常。

接收隐式的 Intent

  要声明应用可以处理哪些隐式的 Intent,需要在 AndroidManifest.xml 中使用 intent-filter 属性为组件声明一个或多个 intent 过滤器,每个 intent 过滤器都可以根据 Intent 的操作、数据和类别指定自身接收的 Intent。仅当隐式的 Intent 匹配某一 Intent的规则时,Android 系统才会将 隐式的 Intent 传递给应用组件。如果一个组件没有声明任何的 Intent 过滤器,那么它只能通过显式Intent 的方式启动。

  每个 Intent 过滤器均由 AndroidMainfest.xml 中的 intent-filter 属性标签来定义,并嵌套在响应的最近中(例如 Activity)

	<Activity android:name=".second">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<catetory android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
</intent-filter>
     </Activity>

intent-filter 中可以使用的属性

  • action

      在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。

  • data

  使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。data 标签内的 scheme等几个属性均为可选,但存在线性依赖关系,具体如下:

1. 如果未指定 scheme 则忽略 host
2. 如果未指定 host 则忽略 port
3. 如果未指定 scheme 和 host,则忽略 path
  • category

  在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

  在定义 intent-filter 时,我们可以使用上述属性中的一个或多个进行任意的组合,系统通过将

Intent 与 intent-filter 中定义的属性规则进行测试,只有通过所有的测试时,才会将 Intent 传递给该组件。


注意:使用 Intent 过滤器时,无法安全地防止其他应用启动组件。如果需要保证只有自己的应用可以访问应用内部的某些组件,可以针对该组件将其 exported 属性设置为 false


使用 Intent 在 Activity 间传递数据

  • 使用 Intent 向下一个 Activity 传递数据

  下面的例子,当我们点击 Next 按钮时,将输入框的值传入下一个 second 页面

	Button btn = (Button)findViewById(R.id.Next);
final EditText UName = (EditText)findViewById(R.id.UName);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent transferData = new Intent(MainActivity.this,second.class);
transferData.putExtra("data",UName.getText().toString());
startActivity(transferData);
} });

  在 second 页面中,我们可以通过以下的方式来获取传入的数据

	Intent intent = getIntent();
String UName = intent.getStringExtra("data");
  • 使用 Intent 回传数据给上一个 Activity

  有时候我们希望启动一个新的 Activity 来处理一些数据,然后可以回传处理结果到当前的 Activity,这是我们便可以通过 Activity 的 startActivityForResult 来实现。

  下面的例子,在第一个 Activity 中点击按钮时将文本框中的内容传入一个新的 Activity,在第二个 Activity 中对第一个 Activity 传过来的内容进行处理,然后回传给第一个 Activity。

  第一个 Activity:

	Button btn = (Button)findViewById(R.id.Click);
final EditText UName = (EditText)findViewById(R.id.UName);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(MainActivity.this,second.class);
intent.putExtra("data",UName.getText().toString());
startActivityForResult(intent,1);//第二个参数表示一个请求码,必须唯一
} });

  第二个 Activity

	Button SayBtn = (Button)findViewById(R.id.Say);
SayBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
String UName = getIntent().getStringExtra("data");
Intent intent = new Intent();
intent.putExtra("return_data","我明白了,你的名字为: " + UName + "很高兴认识你");
setResult(RESULT_OK,intent);
finish();
}
});

  重写第一个 Activity 的 onActivityResult 方法,该方法会在第二个 Activity 销毁后调用

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:{
if(resultCode == RESULT_OK){
String replyData = data.getStringExtra("return_data");
Toast.makeText(this,replyData,Toast.LENGTH_SHORT).show();
}
}
break;
}
}

在这里我们便可以接收到第二个 Activity 处理后的数据了。

android 基础03 -- Intent的更多相关文章

  1. Android 基础知识 -- Intent

    Intent (意图) Android通信的桥梁,可以通过Intent启动Activity , Service , 发送指定广播到Receiver <1> 启动Activity : sta ...

  2. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  3. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  4. Mono.Android 基础

    Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...

  5. Android中的Intent详解

    前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面.因为每一个Acticity的任务不一样,所以经常互在各个Activi ...

  6. 基础4 Android基础

    基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...

  7. Android基础总结+SQlite数据库【申明:来源于网络】

    Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...

  8. android基础---->service的生命周期

    服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...

  9. android基础---->IntentService的使用

    这一篇博客,我们开始前台服务与IntentServie源码分析的学习,关于service的生命周期及其简单使用,请参见我的博客:(android基础---->service的生命周期) 目录导航 ...

随机推荐

  1. detach() 与remove()

    detach() 与remove()区别,在于remove()掉后,就没有啦,添加的事件也没有啦,后者还有啊,可以保留的哦,虽然 $("div").click(function() ...

  2. CSS3背景渐变。。。

    CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用 CSS3 G ...

  3. esp8266 SDK开发之环境搭建

    最近在弄这个WiFi模块,发现网上SDK开发方面的资料很少,发现了一套视频教程,不过主讲人的讲课方式实在受不了.对基于SDK开发感兴趣的同学可以通过本帖在Ubuntu系统上通过Eclipes搭建开发环 ...

  4. IDEA第七章----插件

    idea的另一个可爱之处,就是它的强大的插件,下面我以CodeGlance插件为例,这个可以快速定位代码 第一节:安装插件 ● All plugins 显示所有插件. ● Enabled 显示当前所有 ...

  5. mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类

    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...

  6. android自定义文本框,后面带清空按钮

    android常见的带清空按钮的文本框,获得焦点时如果有内容则显示,否则不显示 package com.qc.health.weight; import com.qc.health.R; import ...

  7. Label 和 checkbox 不为人知的小秘密

    最近开发的时候同事遇见了一个问题,点击label的时候改变checkbox的属性,或许大家觉得这是一个很简单的问题,然而这里面却蕴藏着一个大坑! 举例说明: 页面简单,就是一个 <input i ...

  8. selenium之 驱动环境配置chrome、firefox、IE

    讲起动态网页获取我们一定会用到selenium,至于selenium在各种语言的开发代码很多,但是在我们兴致勃勃找了很多代码,要运行的时候,编译器只会给我们抛出异常,因为我们没有配置好环境.下面我将为 ...

  9. 用json方法来作深拷贝应该知道的一点东西!

    之前写js比较多的的时候也写过深拷贝,浅拷贝,继承啥的,还有自定义的监听事件.然而过了很久都忘了. 最近在项目上用的深拷贝都是 b = JSON.parse( JSON.stringify(a) ) ...

  10. UINavigationController 返回手势与 leftBarButtonItem

    UINavigationController 返回手势与 leftBarButtonItem UINavigationController 自带从屏幕左侧边缘向右滑动的返回手势,可以通过这个手势实现 ...