Android学习笔记(三四):再谈Intent(上)-一些知识

Android学习笔记(七):多个Activity和Intent中,我们先在学会了如何使用intent在代码中唤起activity。此处作深一步地学习。

什么是Intent

intent是对一个操作处理的抽象描述。context可以在使用startActivity(intent)来launch一个actvivity,就如我们在学习笔记(七)中的处理,也是最常用的方式,将activity在我们的应用中整合;可以在通过sentBroast(intent)来广播给任何有兴趣的BroadcastReceiver,可以通过startService(intent)启动服务;可以通过bindService(Intent, ServiceConnection, int)和一个后台服务进行通信。

基本要素

intent有两个基础的要求,一是action,一是data;也即采用哪些处理动作,并提供传递给这个处理动作的数据。action是一个常量,例如ACTION_VIEW用于查看资源,ACTION_EDIT 用于编辑资源,ACTION_PICK是进行选择。data是Uri的方式。例如ACTION_DIAL content://contacts/people/1,ACTION_VIEW  tel:123,ACTION_EDIT  content://contacts/people/1,ACTION_VIEW  content://contacts/people/等等。其中通过Android系统的桌面icon来launch的action为ACTION_MAIN是不带data。

看看Intent的构造函数之一:intent = new Intent(Intent.ACTION_SENDTO ,uri)。这是我们在笔记(七)中的例子,包含两个重要的信息:action(处理的动作)和data(向处理动作传递的参数)。

Intent的基本属性

我们可以在minifest.xml文件,或者代码编写中,通过intent的方法来设置属性。

category:主activity采用LAUNCHER category,这表明它将在launcher menu中显示,其他的一般使用DEFAULT或者ALTERNATIVE。看一个在manifest.xml的例子。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.commonsware.android.skeleton">
    <application>
        <activity android:name=".Now" android:label="Now">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

相关的intent的信息在<intent-filter>中定义。intent-filter属于activity。这个例子我们在intent-filter的定义表明这是一个应用中的main activity,采用category是LAUNCHER,也即在Android的主menu中有一个icon。
可一有多个action和多个category在intent-filter中,这表明这个component,也就是这个activity可处理多种类型的intent。

MIME type:指出Uri数据类型,即所需要操作的资源的类型。如果我们希望采用第三方代码提供的服务,MIME type/data是这是很好的方式。

<activity android:name=".TourViewActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.item/vnd.commonsware.tour" />
  </intent-filter>
</activity>

这是app中的一个非主activity,他的Uri类型为vnd.android.cursor.item/vnd.commonsware.tour。

component:intent所需接收的activity的class类型,然而一般我们都不需要进行设置,Android会根据intent的信息,例如action,data/MIME type,以及catergory来自动选择所需的组建。如果这个属性设置,将强制指定,除非我们非常了解确知,或者有特殊的指定(不使用系统默认方式而采用我们的自己的处理,而我们的处理应当在我们的app内,component的名字在我们当前的app中是私有),一般不对此进行设定。

extras:通过bundle方式传递给的信息,例如传递一个email的消息内容等。

接收器Receiver

有时希望在服务中触发某些处理,而不是唤起一个activity,有些时候,唤起是有条件选择的,在条件A是唤起acivityM,在条件B时,唤起activity N。对于这些情况,可使用继承BroadcastReceiver接口来处理。

这种intent接收器是一次性的,用于接收intent,特别是这种广播方式的intent(例如广播电能不足),然后action。action通常是会launch另外的intent以此触发actvivty,服务,以及其他componment的处理逻辑。
BroadcastReceiver只有一个方法onReceive(),在manifest中添加一个receiver的方式为:

<receiver android:name=".MyIntentReceiverClassName" />

BroadcastReceiver将一直alive直至执行onReceive(),执行完即生命周期结束,不会再使用。这在我们使用时要注意的,例如不要在onReceive()中有什么callback之类的处理,换而言之就是不要和service帮定,也不要用于打开一个dialog。

如果要触发long-lived的component,例如某个actvity或者service,需要receiver和这些activity同等的存活时间。这种情况,不要在Manifest中对receiver进行定义,而是在代码中。在activity的onResume()中调用registerReceiver() ,来表明对某个intent的兴趣,在onPause()中调用unregisterReceiver(),来表明不需要这些intents,因为我们不需要在pause的时候接收intent,这样可以节省开支。注意不要在Activity.onSaveInstanceState()中unregister,这样在用户通过back键返回时并不会被调用。

相关链接:我的Android开发相关文章

时间: 2024-10-15 13:21:21

Android学习笔记(三四):再谈Intent(上)-一些知识的相关文章

Android学习笔记进阶之在图片上涂鸦(能清屏)

Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java [java] view plaincopy package xiaosi.handWriting; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import andro

Android 学习笔记(10)—— Intent 基本运用

作者:夏至 欢迎转载,也请保留这段申明,谢谢 最近太忙了,都没什么时间来整理,前9个上传之后格式不对,都没好好整理,以后会抽空整理. Android的通信桥梁 -- Intent . 使用一个activity实在是太简单了,布局上也有限,那我们能不能像我们真机上的一样,一点就跳到另一个界面去了.这里我们就使用Intent,在活动中穿梭.至于为什么学着UI组件,突然跑到这个家伙来,那当然是为下一节做准备啦.除了活动,它还可以是服务或者广播.启动可以下列方法: startActivity(Inten

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

Android学习笔记(八) Intent

在一开始学习Android的过程中,对于Intent并没有太深入的理解,以为Intent只是作为一个传数据的中间对象,但是随着学习内容的增多,发现Intent的机制实际上贯穿于整个Android的过程: 1.Intent启动:Intent的传输数据只是作为其中一个重要的功能而存在,但是其更重要的作用在于启动/调用的机制,Android如何启动/调用一个应用.组件,首先需要的是一个定位的过程,需要启动哪个组件?指定的某个组件.或者是某个类型的组件,通过抽象成Intent进行统一的调用,只要对Int

Android学习笔记(十一) Intent

一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.Intent对象的基本使用方法 Intent intent = new Intent(); intent.setClass(MainActivity.this,OtherActivity.class); //此处放入putExtra语句用于存放数据 startActivity(intent); 三.使用

Android 学习笔记之 Actionbar作为回到上一级

首先,给Actionbar添加返回图标: 代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); isSendMsg = (Switch) findViewById(R.id.isSendMessage); isCall = (Switch) findViewById(R.id.

Android学习笔记三:用Intent串联activity

一:Intent Intent可以理解为 意图. 我们可以通过创建intent实例来定义一个跳转意图,意图包括:要跳转到哪个页面.需要传递什么数据. 然后通过startActivity(intent)来启动跳转. 有两种方式定义Intent:显式Intent.隐式Intent. 二:显式Intent 1)我们可以在actvity的java文件中,通过代码显示定义Intent,参数为:从哪个页面,跳转到哪个页面. Intent intent = new Intent(FirstActivity.t

Python学习笔记(六)再谈Python模块

Python程序包含多个模块文件,一个主体.顶层文件实现主要控制流程.调用组件和工具,其他模块文件则提供组件和工具,python自带了许多实用的模块称为标准链接库.模块是python中最高级别的程序组织单元,将代码和数据封装起来以便重用.每一个文件都是一个模块,并且可以通过"导入"来使用其他模块的变量(顶层定义的所有变量).模块被导入时就生成了一个模块对象.从抽象的角度看,模块的作用有: 1)代码重用-模块文件的代码可以永久保存,可以被多个客户端使用.任意的重新运行和重载 2)划分系统

Android学习笔记(三五):再谈Intent(下)-一些实践

Android的UI框架要求用户将他们的app分为activity,通过itent来进行调度,其中有一个main activity由Android的launcher在桌面中调用.例如一个日历的应用,需要查看日历的activity,查看单个事件的activity,编辑事件的activity等等.在查看日历的activity中,如果用户选择的某个事件,需要通过查看事件的activity来处理.这就是最近本的app UI框架,本次,我们将学习如何通过intent来完成. Activity之间的关系 某