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

数据(data)检测

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

Xml代码 复制代码 收藏代码
  1. <intent-filter> 
  2.                 <action android:name="android.intent.action.VIEW"></action> 
  3.                 <category android:name="android.intent.category.DEFAULT"></category> 
  4.                 <data android:mimeType="text/plain"></data> 
  5.             </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类如下:
Java代码 复制代码 收藏代码
  1. /**
  2. * Intents测试列表类
  3. * @author 飞雪无情
  4. * @since 2011-3-14
  5. */ 
  6. public class IntentsTestList extends ListActivity { 
  7.     /** Called when the activity is first created. */ 
  8.     @Override 
  9.     public void onCreate(Bundle savedInstanceState) { 
  10.         super.onCreate(savedInstanceState); 
  11.       //定义ListAdapter 
  12.         setListAdapter(new SimpleAdapter(this, getData(), 
  13.                 android.R.layout.simple_list_item_1, new String[] { "title" },new int[] {android.R.id.text1})); 
  14.         getListView().setTextFilterEnabled(true); 
  15.     } 
  16.     @Override 
  17.     protected void onListItemClick(ListView l, View v, int position, long id) { 
  18.         Intent intent=(Intent)getData().get(position).get("intent"); 
  19.         Boolean isActivity=(Boolean)getData().get(position).get("isActivity"); 
  20.         if(isActivity){ 
  21.             startActivity(intent); 
  22.         }else
  23.             sendBroadcast(intent); 
  24.         } 
  25.     } 
  26.  
  27.     /**
  28.      * 返回ListView需要的数据
  29.      * @return ListView需要的数据
  30.      */ 
  31.     private List<Map<String,Object>> getData() { 
  32.         List<Map<String,Object>> data=new ArrayList<Map<String,Object>>(); 
  33.         addItem(data, "打开拨号界面并输入电话123456", new Intent(Intent.ACTION_DIAL, Uri.parse("tel://123456")), true); 
  34.         return data; 
  35.     } 
  36.     /**
  37.      * 给ListView添加数据
  38.      * @param data 存储数据的List
  39.      * @param name 要显示的Title
  40.      * @param intent 单击某一项时要启动的Activity
  41.      * @param isActivity 启动的是否是Activity,true是,false为广播
  42.      */ 
  43.     private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) { 
  44.         Map<String, Object> temp = new HashMap<String, Object>(); 
  45.         temp.put("title", name); 
  46.         temp.put("intent", intent); 
  47.         temp.put("isActivity", isActivity); 
  48.         data.add(temp); 
  49.     } 
  50.      
/**
 * 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代码如下:

Java代码 复制代码 收藏代码
  1. /**
  2. * 显示文本的Activity
  3. * @author 飞雪无情
  4. * @since 2011-3-24
  5. */ 
  6. public class TextWatcherActivity extends Activity { 
  7.     private TextView mTextView; 
  8.  
  9.     @Override 
  10.     protected void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.         mTextView=new TextView(this); 
  13.         setContentView(mTextView); 
  14.     } 
  15.  
  16.     @Override 
  17.     protected void onStart() { 
  18.         super.onStart(); 
  19.         Intent txtIntent=getIntent(); 
  20.         Uri data=txtIntent.getData(); 
  21.         String txt; 
  22.         try
  23.             txt = readTxt(data); 
  24.         } catch (IOException e) { 
  25.             txt="打开txt文件异常"
  26.         } 
  27.         mTextView.setText(txt); 
  28.     } 
  29.     /**
  30.      * 读取txt文本
  31.      * @param txtUri
  32.      * @return
  33.      * @throws IOException
  34.      */ 
  35.     private String readTxt(Uri txtUri) throws IOException{ 
  36.         BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(txtUri),Charset.forName("GBK"))); 
  37.         StringBuilder txt=new StringBuilder(); 
  38.         String buf=""
  39.         while((buf=bufferedReader.readLine())!=null){ 
  40.             txt.append(buf).append("\n"); 
  41.         } 
  42.         return txt.toString(); 
  43.     } 
  44.      
  45.      
/**
 * 显示文本的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中加入如下定义:

Xml代码 复制代码 收藏代码
  1. <activity android:name=".TextWatcherActivity" 
  2.             android:label="查看TXT文件"> 
  3.             <intent-filter> 
  4.                 <action android:name="android.intent.action.VIEW"></action> 
  5.                 <category android:name="android.intent.category.DEFAULT"></category> 
  6.                 <data android:mimeType="text/plain"></data> 
  7.             </intent-filter> 
  8.         </activity> 

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

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

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

新建ImageWatcherActivity,代码如下:

Java代码 复制代码 收藏代码
  1. /**
  2. * 显示文本的Activity
  3. * @author 飞雪无情
  4. * @since 2011-3-24
  5. */ 
  6. public class ImageWatcherActivity extends Activity { 
  7.     private final String IMAGE_URI_KEY="imageUriKey"
  8.     private Uri image; 
  9.     private ImageView mImageView; 
  10.  
  11.     @Override 
  12.     protected void onCreate(Bundle savedInstanceState) { 
  13.         super.onCreate(savedInstanceState); 
  14.         mImageView=new ImageView(this); 
  15.         setContentView(mImageView); 
  16.     } 
  17.  
  18.     @Override 
  19.     protected void onStart() { 
  20.         super.onStart(); 
  21.         Intent txtIntent=getIntent(); 
  22.         image=txtIntent.getData(); 
  23.         //对于大图片未做优化处理 
  24.         mImageView.setImageURI(image); 
  25.     } 
  26.  
  27.     @Override 
  28.     protected void onRestoreInstanceState(Bundle savedInstanceState) { 
  29.         super.onRestoreInstanceState(savedInstanceState); 
  30.         image=savedInstanceState.getParcelable(IMAGE_URI_KEY); 
  31.         mImageView.setImageURI(image); 
  32.     } 
  33.  
  34.     @Override 
  35.     protected void onSaveInstanceState(Bundle outState) { 
  36.         super.onSaveInstanceState(outState); 
  37.         outState.putParcelable(IMAGE_URI_KEY,image); 
  38.     } 
  39.      
  40.      
/**
 * 显示文本的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中加入如下定义:

Xml代码 复制代码 收藏代码
  1. <activity android:name=".ImageWatcherActivity" 
  2.             android:label="查看图片文件"> 
  3.             <intent-filter> 
  4.                 <action android:name="android.intent.action.VIEW"></action> 
  5.                 <category android:name="android.intent.category.DEFAULT"></category> 
  6.                 <data android:mimeType="image/*"></data> 
  7.             </intent-filter> 
  8.         </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标记的所有组件。。有兴趣的可以研究一下。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值