赞
踩
所有Android应用都由一个或多个活动组成,另外还包括其他一些组件如布局。活动是用户可以完成的一个确定的事情。使用意图可以启动其他应用中的活动。其过程就是第一个活动向Android传递一个意图,Android检查这个意图,然后Android要求第二个活动启动。
可以创建一个意图来启动另一个活动,尽管这个活动在另一个应用中。
现在的问题是怎么知道用户设备上有哪些活动?怎么知道哪些活动适合我们要完成的任务?怎么知道如何使用这些活动?
创建意图
所有这些问题都可以使用动作action来解决
Intent intent = new Intent(Intent.ACTION_SEND);
以上是创建意图来指定一个动作的语法,Android提供了很多可用的标准动作:
Intent.ACTION_DIAL拨号,Intent.ACTION_WEB_SEARCH完成web搜索,Intent.ACTION_SEND发送消息…
增加额外的消息
一旦指定了想要使用的动作,还可以为它增加额外的信息。我们希望随意传递一些文本,这些文本将构成我们要发送的消息的消息体。为此可以使用以下代码给意图:
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, messageText);
//这些属性是Intent.ACTION_SEND的特有属性。并不是所有动作都有这个属性
这里的messageText是你想发送的文本。这就告诉Android你希望这个活动能处理MIME数据类型为“text/plain”的数据,另外还会告诉它要发送的文本是什么。
另外如果还想增加其他额外信息,还可以另外再调用putExtra()方法。例如,如果你想指定消息的主题,可以使用以下代码来设置:
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
这里的subject是消息的主题。
修改上一节的CreateMessageActivity.java文件
package com.hfad.mymessenger; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; //确保继承了Activity类 public class CreateMessageActivity extends Activity { @override //创建活动时会调用onCreate()方法 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_message); } //单击按钮时会调用这个方法 public void onSendMessage(View view){ //从ID为message的可编辑文本域得到文本 EditText messageView = (EditText)findViewById(R.id.message); String messageText = messageView.getText().toString(); //不再创建一个显式意图指定ReceiveMessageActivity //这里创建了一个使用发送动作的隐式意图 Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, messageText); //启动意图中指定的活动 startActivity(intent); } }
发生了什么
1、调用onSendMessage()方法时,会创建一个意图。startActivity()方法将这个意图传给Android。这个意图指定了动作ACTION_SEND,MIME类型为text/plain。
2、Android了解到这个意图只能传递到能处理ACTION_SEND和text/plain数据的活动。Android检查用户设备上的所有活动,查找能接收这个意图的活动。(如果没有活动能处理这个意图,会抛出一个ActivityNotException)
3、如果只有一个活动能接收这个意图,Android会让这个活动启动并传入意图。
如果有多个活动都能接收这个意图,Android会显示一个活动选择器对话框,让用户选择要使用的活动
4、用户选择他想要的活动后,Android让这个活动启动,并向这个活动传入意图,这个活动会在新消息中显示意图中包含的额外文本。
意图过滤器
为Android提供一个意图时,它必须明确哪个活动或哪些活动能处理这个意图。这个过程称为意图解析。
使用隐式意图时,Android使用意图中的信息来确定哪些组件能接收这个意图。为此,它要检查每个应用AndroidManifest.xml中的意图过滤器。
意图过滤器指出各个组件可以接收哪些类型的意图。
举个例子,下面的记录对应一个可以处理ACTION_SEND动作的活动。这个活动能接收MIME类型为text/plain或image的数据。
<activity android:name="ShareActivity">
<intent-filter>
<!--这会告诉Android这个活动可以处理ACTION_SEND -->
<action android:name="android.intent.action.SEND" />
<!--意图处理器必须包含类别default,否则无法接收隐式意图 -->
<category android:name="android.intent.category.DEFAULT" />
<!--下面是这个活动能处理的数据类型 -->
<data android:mimeType="text/plain" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。