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. 有关opacity或RGBA设置颜色值及元素的透明值

    opacity声明来设置元素的透明值,当opacity设置元素的透明值,内部的文字及元素也会透明,通过RGBA设置的颜色值只针对当前元素,内部的文字及元素的透明值并未发生变化   opacity声明来 ...

  2. Keep Mind Working

    想找一个这样的地方,可以让脑袋持续运转着.不会像游戏一样让人着迷,不会像有色电视一样让人想错地方,也不会像工作一样充满太多严密.就是让脑袋继续转着,适意地思考些什么. 之前会跑去游戏里,至少没有太污. ...

  3. PHP常用功能模块

    错误异常模块 错误处理 1. 系统定义了一些二进制码,用来表示错误报告的级别:     在 /etc/php5/apache2/php.ini中修改php配置文件,其中display_errors默认 ...

  4. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  5. GUI—ST_emWin移植

    GUI-ST_emWin移植 一.st_emwin移植 1.stemwin源文件下载:ST官网 https://my.st.com/content/my_st_com/en/search.html#q ...

  6. HTTP首部解析

    HTTP首部解析 转载请注明出处:HTTP首部解析 文章目录 1.与HTTP协议相关的Web服务器 2.HTTP首部 与HTTP协议相关的Web服务器 在说明HTTP首部相关知识之前,有必要先了解一下 ...

  7. pyqt4桌面软件各种画布组合结构实例

    import sys reload(sys) sys.setdefaultencoding('utf8') from PyQt4 import QtGui, QtCore try: from PyQt ...

  8. iOS 应用全部添加滑动返回

    if ([self  class] == [HomeViewController class]||[self  class] == [ComprehensivefinanceViewControlle ...

  9. CAD 二次开发 -- 自动加载开发的DLL

    CAD二次开发可以采用写扩展DLL的方式实现.该DLL的函数可以被CAD调用. 但是调用前,必须用命令netload 将该dll加载到CAD. 其实可以修改注册表,当CAD软件启动后,自动加载扩展DL ...

  10. Asp.net SignalR 让实时通讯变得简单

    巡更项目中,需要发送实时消息,以及需要任务开始提醒,于是便有机会接触到SignalR,在使用过程中,发现用SignalR实现通信非常简单,下面我思明将从三个方面分享一下: 一.SignalR是什么 A ...