`

Android系列教程之十二:Intents and Intent Filters(三)

阅读更多

接上节继续。。版权所有:飞雪无情,转载请注明出处:

http://flysnow.iteye.com/blog/978225

Android开发技术交流群86686524 (已满)请加120059404

Android系列教程目录:

  1. Android教程之一:Window下搭建Android开发环境

  2. Android教程之二:Linux下搭建Android开发环境

  3. Android教程之三:第一个Android应用,HelloWorld

  4. Android系列教程之四:Android项目的目录结构

  5. Android系列教程之五:Activity的生命周期

  6. Android系列教程之六:TextView小组件的使用--附带超链接和跑马灯效果

  7. Android系列教程之七:EditText使用详解-包含很多教程上看不到的功能演示

  8. Android系列教程之八:ListView组件的使用

  9. Android系列教程之九:GridView组件的使用

  10. Android系列教程之十:Intents and Intent Filters(一)

  11. Android系列教程之十一:Intents and Intent Filters(二)

数据(data)检测

data标记也是在intent-filter中定义的,大致格式如下:

<intent-filter>
        		<action android:name="android.intent.action.VIEW"></action>
        		<category android:name="android.intent.category.DEFAULT"></category>
        		<data android:mimeType="text/plain"></data>
        	</intent-filter>

       每个data定义一个URI和数据类型(MIME),URI由4个属性来定义,分别是android:scheme,android:host,android:port,android:path..这个四个属性构成如下格式的URI: scheme://host:port/path    如:content://com.flysnow.intent:8080/show/view。其中content就是scheme,com.flysnow.intent就是host,8080就是port,show/view就是path...如果有经常使用ContentProvider的应该熟悉。。我们经常定义的authority不就是host+port吗?还有这几个元素都是可选的,但是不是随便用就可以的,port要依赖于host,没有host,port就会被忽略,不起作用,同样,如果要使用host+port(authority)就必须指定scheme。而path则依赖于scheme和authority。。


       还有一个很重要的类型就是mimeType,这个属性用于指定内容的类型,也就是这个组件可以处理哪些类型的内容。。如text/plain表示无格式文本类型,mimeType也支持通配符,使用text/*则表示所有文本类型。通过使用它,你可以很方便的开发出关联打开诸如txt文件,pdf文件的应用。后面的两个自理将会演示txt文件查看器,图片查看器的例子。。MIME可以参考http://www.w3school.com.cn/media/media_mimeref.asp。这里有所有的内容类型的定义。。

开发实例-拨打电话,text阅读器和图片查看器

下面通过一个例子来演示data的检测,项目名为Intents,应用名为Intents and Filters,运行在Android2.2版本上.主启动Activity为IntentsTestList。例子包括以下演示:

  1. 通过发送intent的方式“打开拨号界面并输入电话123456”。
  2. 创建一个Text文件阅读器
  3. 创建一个图片查看器

首先我们实现第一项,修改IntentsTestList类如下:

/**
 * Intents测试列表类
 * @author 飞雪无情
 * @since 2011-3-14
 */
public class IntentsTestList extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //定义ListAdapter
		setListAdapter(new SimpleAdapter(this, getData(),
				android.R.layout.simple_list_item_1, new String[] { "title" },new int[] {android.R.id.text1}));
		getListView().setTextFilterEnabled(true);
    }
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		Intent intent=(Intent)getData().get(position).get("intent");
		Boolean isActivity=(Boolean)getData().get(position).get("isActivity");
		if(isActivity){
			startActivity(intent);
		}else{
			sendBroadcast(intent);
		}
	}

	/**
	 * 返回ListView需要的数据
	 * @return ListView需要的数据
	 */
	private List<Map<String,Object>> getData() {
		List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
		addItem(data, "打开拨号界面并输入电话123456", new Intent(Intent.ACTION_DIAL, Uri.parse("tel://123456")), true);
		return data;
	}
	/**
	 * 给ListView添加数据
	 * @param data 存储数据的List
	 * @param name 要显示的Title
	 * @param intent 单击某一项时要启动的Activity
	 * @param isActivity 启动的是否是Activity,true是,false为广播
	 */
	private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) {
        Map<String, Object> temp = new HashMap<String, Object>();
        temp.put("title", name);
        temp.put("intent", intent);
        temp.put("isActivity", isActivity);
        data.add(temp);
    }
	
}

 这时我们运行程序,单击“打开拨号界面并输入电话123456”就会打开系统的自带的拨号界面,并且默认已经录入了要拨打的号码“123456”。效果图如下:

 

  然后我们实现第二功能-txt文件阅读器

新建TextWatcherActivity代码如下:

/**
 * 显示文本的Activity
 * @author 飞雪无情
 * @since 2011-3-24
 */
public class TextWatcherActivity extends Activity {
	private TextView mTextView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mTextView=new TextView(this);
		setContentView(mTextView);
	}

	@Override
	protected void onStart() {
		super.onStart();
		Intent txtIntent=getIntent();
		Uri data=txtIntent.getData();
		String txt;
		try {
			txt = readTxt(data);
		} catch (IOException e) {
			txt="打开txt文件异常";
		}
		mTextView.setText(txt);
	}
	/**
	 * 读取txt文本
	 * @param txtUri
	 * @return
	 * @throws IOException
	 */
	private String readTxt(Uri txtUri) throws IOException{
		BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(txtUri),Charset.forName("GBK")));
		StringBuilder txt=new StringBuilder();
		String buf="";
		while((buf=bufferedReader.readLine())!=null){
			txt.append(buf).append("\n");
		}
		return txt.toString();
	}
	
	
}

 然后在AndroidManifest.xml中加入如下定义:

<activity android:name=".TextWatcherActivity"
        	android:label="查看TXT文件">
        	<intent-filter>
        		<action android:name="android.intent.action.VIEW"></action>
        		<category android:name="android.intent.category.DEFAULT"></category>
        		<data android:mimeType="text/plain"></data>
        	</intent-filter>
        </activity>

 这样在单击txt文件的时候就可以选择我们的这个Activity对txt文件处理,显示其内容.我们新建一个1.txt文件,写上一些内容,放在我们的sd卡中,使用文件管理工具查看这个txt文件,会弹出如下图的提示,看到我们刚刚做的《TXT阅读器》了吧。

选择“查看TXT文件”,就可以看到我们的txt内容:

最后实现第三个功能--图片查看器

新建ImageWatcherActivity,代码如下:

/**
 * 显示文本的Activity
 * @author 飞雪无情
 * @since 2011-3-24
 */
public class ImageWatcherActivity extends Activity {
	private final String IMAGE_URI_KEY="imageUriKey";
	private Uri image;
	private ImageView mImageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mImageView=new ImageView(this);
		setContentView(mImageView);
	}

	@Override
	protected void onStart() {
		super.onStart();
		Intent txtIntent=getIntent();
		image=txtIntent.getData();
		//对于大图片未做优化处理
		mImageView.setImageURI(image);
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		image=savedInstanceState.getParcelable(IMAGE_URI_KEY);
		mImageView.setImageURI(image);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putParcelable(IMAGE_URI_KEY,image);
	}
	
	
}

 然后在AndroidManifest.xml中加入如下定义:

<activity android:name=".ImageWatcherActivity"
        	android:label="查看图片文件">
        	<intent-filter>
        		<action android:name="android.intent.action.VIEW"></action>
        		<category android:name="android.intent.category.DEFAULT"></category>
        		<data android:mimeType="image/*"></data>
        	</intent-filter>
        </activity>

 这样在单击图片文件的时候就可以选择我们的这个Activity对txt文件处理并且显示。

 

数据(data)检测小结

对于data的匹配,如果说怎么怎么匹配,在什么情况下通过可能会比较难以理解,这里以一种简单的方式来解说。

假定我们定义的Intent Filter 的data标签为集合A,传递的Intent中包含的data为集合B,当B是A的子集时就通过了(Action和Category也得检测通过)。如果B为空(不配置data),那么A也得为空(不配置data)才能通过 。更详细(繁琐)的介绍请参考doc

 

Intents and Intent Filters总结

Android提供了以Intent的方式调用Android设备的内置Google应用,比如打电话,调用Google浏览器打开网页,搜索等。关于这方便的介绍可以参考Android开发文档《Intents List: Invoking Google Applications on Android Devices》这一节的介绍,很详细。docs/guide/appendix/g-app-intents.html。


Intent是一个很好的设计,它提供了一种在各个组建之间通信的方式,也为我们使用其他的应用的功能提供了可能,这样如果我们想在自己的应用打开一个网页,我们就不用特意迁入一个webview,我们直接调用Android内的浏览器打开即可。。


最后值得一提的是PackageManager这个类中为我们提供了一系列的query...()方法,可以让我们根据我们定义的Intent查询特定的匹配Intent Filter标记的所有组件。。有兴趣的可以研究一下。。

  • 大小: 8.2 KB
  • 大小: 38.3 KB
  • 大小: 43.4 KB
  • 大小: 9.6 KB
  • 大小: 44.5 KB
  • 大小: 39.9 KB
31
8
分享到:
评论
4 楼 飞雪无情 2011-05-15  
fortianwei 写道
楼主在吗,请问你有没有弄android付费软件?需要LVL授权验证那个?我现在遇到的问题就是:不管是谁的手机测试,返回的都是LICENSED,都自动回调allow()函数,付费软件默认的不应该是NOT_LICENSED的吗?如果楼主看到了还请您帮帮我啊。
不好意思,美做过付费的,这个没有研究过,不过应该需要Google Market的License
3 楼 fortianwei 2011-05-15  
楼主在吗,请问你有没有弄android付费软件?需要LVL授权验证那个?我现在遇到的问题就是:不管是谁的手机测试,返回的都是LICENSED,都自动回调allow()函数,付费软件默认的不应该是NOT_LICENSED的吗?如果楼主看到了还请您帮帮我啊。
2 楼 飞雪无情 2011-03-30  
深夜未眠 写道
鄙人初学Android,向博主学习。

共同学习
1 楼 深夜未眠 2011-03-30  
鄙人初学Android,向博主学习。

相关推荐

    Android系列教程之十二:Intents and Intent Filters(三).docx

    本教程将深入讲解Intent和Intent Filters,特别是如何利用它们进行数据检测。 在Intent Filter中,`&lt;data&gt;`标签用于定义Intent可以携带的数据类型和URI。例如,以下是一个简单的Intent Filter配置: ```xml ...

    Android Intents and Intent Filters(一)

    Android Intents and Intent Filters(一) 对应博客地址:http://blog.csdn.net/michael__li/article/details/6947545

    Intents and Intent Filters 理论中英双文

    内含四个pdf文件,分别为 Intent and Intent-filter Intents and Intent Filters理论英文 Intents and Intent Filters理论中文 Intent入门指南 详尽介绍关于android intent

    Android Intents and Intent Filters(二)源代码

    Android Intents and Intent Filters(二)源代码 对应博客 http://blog.csdn.net/michael__li/article/details/6950127

    Android开发之旅 Intents和Intent Filters(实例部分)(免费)

    ### Android开发之旅:深入理解Intents与Intent Filters 在Android开发中,`Intents`与`Intent Filters`是实现组件间通信的关键技术。通过这两项技术,开发者可以让应用程序中的不同组件,甚至不同的应用程序之间...

    Android开发之旅

    Android开发之旅:环境搭建及HelloWorld 1 Android开发之旅:HelloWorld项目的目录结构 2 Android开发之旅:android架构 3 Android开发之旅:应用程序...Android开发之旅 Intents和Intent Filters(实例部分) 17

    Android Studio 实验二:Intent的使用

    在Android开发环境中,Intent是应用间通信的重要工具,它用于启动其他组件或传递数据。本实验将深入探讨Android Studio中Intent的使用,帮助你更好地理解如何在不同的Activity之间跳转和传递信息。 首先,让我们...

    Learning Android Intents

    ### 学习Android Intents:理解与应用Intents的力量 #### 概述 在深入学习Android Intents之前,我们先来了解下什么是Intents以及它在Android开发中的重要性。Intents是Android平台中用于应用程序间通信的核心机制...

    Intents 和Intent filter 理论介绍

    Intent 在 Android 开发中扮演着至关重要的角色,它是应用程序组件间通信的关键机制,使得组件之间可以实现松散耦合的交互。Intent 不仅仅用于启动另一个 Activity,还可以启动 Service 或触发 Broadcast Receiver。...

    Android-Intents-3

    ### Android Intents 深入理解:第三部分——使用Tab #### 一、引言 在Android开发过程中,Intents是实现组件间通信的核心机制之一。通过Intents,应用程序的不同部分(如活动、服务等)可以相互通信,传递数据或...

    Learning Android: Develop Mobile Apps Using Java and Eclipse(第二版)

    Chapter 1 Android Overview Android Overview History Android Versions Android Flavors Summary Chapter 2 Java Review Comments Data Types: Primitives and Objects Modifiers Arrays Operators Control Flow ...

    Unlocking Android

    Chapter 4: Intents and Services Chapter 5: Storing and Retrieving Data Chapter 6: Networking Chapter 7: Telephony Chapter 8: Notification and Alarms Chapter 9: Graphics and Animation Chapter 10: ...

    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面.

    Android Intent 跳转到系统应用中的拨号界面、联系人界面、短信界面 在 Android 开发中,Intent 是一个非常重要的概念,它允许不同的应用程序之间进行交互和通信。在本文中,我们将探讨如何使用 Intent 跳转到系统...

    Android-Intents-1

    根据 Marty Hall 所提供的培训资料,我们可以了解到 Android 设计的核心理念之一是将应用程序分解为一系列小型的、单屏幕的组件,这些组件被称为 Activities。这种设计理念旨在简化应用的开发过程,并提高用户体验。...

    android的intent跳转

    在Android开发中,Intent是应用程序之间以及应用程序内部组件之间通信的主要机制。Intent可以用来启动新的活动(Activity)、启动服务(Service)或者传递消息。在这个场景中,我们将关注Intent如何用于在Android...

    Professional Android 4 Application Development 源代码

    Creating Intent Filters and Broadcast Receivers Chapter 6: Using Internet Resources Downloading and Parsing Internet Resources Using the Download Manager Using Internet Services Connecting to Google ...

    Android Espresso Test Intents and Webview

    在Android应用开发中,测试是确保产品质量的关键环节。Espresso是一个强大的UI测试框架,它使得开发者可以编写直接、简洁的测试代码,以验证用户界面的行为。本篇文章将深入探讨Espresso如何与Intent和Webview协同...

Global site tag (gtag.js) - Google Analytics