[转帖]Android系列教程之十二:Intents and Intent Filters(三)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3358 | 回复: 0   主题: [转帖]Android系列教程之十二:Intents and Intent Filters(三)        下一篇 
jie.liang
注册用户
等级:少校
经验:1003
发帖:77
精华:0
注册:2013-10-11
状态:离线
发送短消息息给jie.liang 加好友    发送短消息息给jie.liang 发消息
发表于: IP:您无权察看 2013-10-18 9:35:45 | [全部帖] [楼主帖] 楼主

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

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中定义的,大致格式如下:

Xml代码

  1. <intent-filter>
  2. <actionandroid:name="android.intent.action.VIEW"></action>
  3. <categoryandroid:name="android.intent.category.DEFAULT"></category>
  4. <dataandroid: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.  * 返回ListView需要的数据 
  28.  * @return ListView需要的数据 
  29.  */ 
  30.  private List<Map<String,Object>> getData() { 
  31.        List<Map<String,Object>> data=new ArrayList<Map<String,Object>>(); 
  32.        addItem(data, "打开拨号界面并输入电话123456", new Intent(Intent.ACTION_DIAL, Uri.parse("tel://123456")), true); 
  33.        return data; 
  34.  } 
  35.  /** 
  36.  * 给ListView添加数据 
  37.  * @param data 存储数据的List 
  38.  * @param name 要显示的Title 
  39.  * @param intent 单击某一项时要启动的Activity 
  40.  * @param isActivity 启动的是否是Activity,true是,false为广播 
  41.  */ 
  42.  private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) { 
  43.        Map<String, Object> temp = new HashMap<String, Object>(); 
  44.        temp.put("title", name); 
  45.        temp.put("intent", intent); 
  46.        temp.put("isActivity", isActivity); 
  47.        data.add(temp); 
  48.  } 
  49.  


 这时我们运行程序,单击“打开拨号界面并输入电话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.        


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

Xml代码

  1. <activityandroid:name=".TextWatcherActivity"
  2. android:label="查看TXT文件">
  3. <intent-filter>
  4. <actionandroid:name="android.intent.action.VIEW"></action>
  5. <categoryandroid:name="android.intent.category.DEFAULT"></category>
  6. <dataandroid: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.        


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

Xml代码

  1. <activityandroid:name=".ImageWatcherActivity"
  2. android:label="查看图片文件">
  3. <intent-filter>
  4. <actionandroid:name="android.intent.action.VIEW"></action>
  5. <categoryandroid:name="android.intent.category.DEFAULT"></category>
  6. <dataandroid: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)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论