Activity--intent

来源:互联网 发布:paxos算法和zookeeper 编辑:程序博客网 时间:2024/05/22 06:52

intent :

1   作用:intent提供了一种通用的消息系统,它允许你的应用程序与其他应用程序间传递Intent来执行动作和产生事件

2   intent包含内容:action(要执行的动作),data,category(类别,被执行动作的附加信息),component(指定intent的目标组件的类名称),extra,type(数据类型)


Action,也就是要执行的动作(系统)

constant

Target component

Action

ACTION_CALL

activity

Initiate a phone call.

ACTION_EDIT

activity

Display data for the user to edit.

ACTION_MAIN

activity

Start up as the initial activity of a task, with no data input and no returned output.

ACTION_SYNC

activity

Synchronize data on a server with data on the mobile device.

ACTION_BATTERY_LOW

broadcast receiver

A warning that the battery is low.

ACTION_HEADSET_PLUG

broadcast receiver

A headset has been plugged into the device, or unplugged from it.

ACTION_SCREEN_ON

broadcast receiver

The screen has been turned on.

ACTION_TIMEZONE_CHANGED

broadcast receiver

The setting for the time zone has changed.


Data,也就是执行动作要操作的数据

Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其 URI数据的类型是不同的(可以设置type属性指定特定类型数据)。如:打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs。

一般情况下Date属性通常用于向Action属性提供操作的数据。

URI描述

动作

说明

http://web_address

android.intent.action.VIEW

启动Web浏览器

content://contacts/people/1

android.intent.action.EDIT

更新id=1的联系人数据

content://contacts/people/

android.intent.action.VIEW

浏览所有人的数据

tel:123

android.intent.action.CALL

拨打电话

tel:123

android.intent.action.VIEW

浏览电话123的数据

content://contacts/people/1

android.intent.action.DIAL

拨打id=1的联系人电话


type(数据类型),显式指定Intent的Date所指定Uri对应的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。


category(类 别),被执行动作的附加信息。例如 :actionACTION_MAINcategory为LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;action为ACTION_MAIN,category为CATEGORY_HOME,显示桌面。而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这 些动作可以在同一块数据上执行。还有其他的为

Constant

Meaning

CATEGORY_BROWSABLE

The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.

CATEGORY_GADGET

The activity can be embedded inside of another activity that hosts gadgets.

CATEGORY_HOME

The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.

CATEGORY_LAUNCHER

The activity can be the initial activity of a task and is listed in the top-level application launcher.

CATEGORY_PREFERENCE

The target activity is a preference panel.

component(组件),指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如actiondata/typecategory进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行发送电子邮件这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

注意:

我们需要什么时候加android.intent.category.DEFAULT呢?

1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。

     Explicit Intent明确的指定了要启动的Acitivity,比如以下Java代码: 
      Intent intent= new Intent(this, B.class)

     Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

2、intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。

理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。

例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。

1 不同Activity跳转,显式意图和隐式意图

2 显示意图:

Intent i=newIntent();

i.setClass(MainActivity.this, SecondActivity.class);

startActivity(i);

 

Intent i=newIntent();

i.setComponent(new ComponentName(SecondActivity.this, ThirdActivity.class));

startActivity(i);

 

i.setClassName(SecondActivity.this,ThirdActivity.class.getName());

3 隐式意图:注意activity必须设置DEFAULT类型

i.setAction("hello");

i.addCategory("abc");

startActivity(i);

<intent-filter>

<categoryandroid:name="android.intent.category.DEFAULT"/>

<action android:name="hello"/>

<category android:name="abc"/>

</intent-filter>

 

举例:

如果在activity中通过如下隐式意图的代码启动一个activity

Intent i =  new Intent();

i.setAction(Intent.ACTION_CALL);

i.setData(Uri.parse("tel:222"));

startActivity(i);

在打电话的应用中,打电话的activity界面的manifest配置应该如下:

<intent-filter>

<action android:name="android.intent.action.CALL" />

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="tel" />

</intent-filter>

 

举例: 

Intent intent = newIntent();  

intent.setAction("com.hoo.kay");  

//设置数据URI与数据类型匹配

//intent.setData(data);   

//intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndType

intent.setDataAndType(Uri.parse("hoo://www.hoo.com/person"), "image/gif");  

startActivity(intent);  

 

被隐式启动的activity的配置:

<activityandroid:name="Intent2DateActivity">

<intent-filter>

<action android:name="com.hoo.kay"/>

<categoryandroid:name="android.intent.category.DEFAULT"/>

        <data android:host="www.hoo.com" android:scheme="hoo" android:mimeType="image/gif" android:path="/person"/>

</intent-filter>

</activity>

 

注意:

对于一个Action字符串,系统有可能会找到一个Activity能处理这个Action,也有可能找到多个Activity,也可能一个都找不到。
1、找到一个Activity
很简单,直接打开这个Activity。这个不需要解释。
2、找到多个Acyivity
系统会提示从多个activity中选择一个打开。

 

3、一个Activity都没找到
一个都没找到的话,程序就会出错,会抛出ActivityNotFoundException。比如随便写一个action字符串:

 

4 传递数据:

5 普通的数据:两种方式:Bundle、putExtra

Activity 关闭后返回的数据:



0 0
原创粉丝点击