首页 文章 精选 留言 我的

精选列表

搜索[组件式],共10010篇文章
优秀的个人博客,低调大师

android组件通讯 Intent Filter隐式实现Intent

Intent Filter是android里非常有特色的一个概念。他的用户体验和windows下的文件管理器的弹出菜单里的“打开方式”非常相似。在windows中,当用户选择了打开方式菜单后,系统让用户选择应用来打开所选择的文件。而在android中的文件已经被uri资源代替了。 Intent Filter在android中的应用非常普遍,尤其在资源共享中。例如,当用户选择了一个图片,选择了共享,我们常常会发现一个选择列表。这个选择列表是动态生成的,不是一成不变的。假如你新安装了facebook应用,那么facebook就会出现在这个列表里面。从这个例子可以发现,intent filter的设计使得android系统显得更加灵活了。 要实现一个Intent Filter, 我们要在AndroidManifest.xml中加入必要的设置,以通知系统某个activity都能够处理什么类型的URI资源,然后要在activity的onCreate中加入必要的代码以处理系统传递过来rui资源。 一个Service、 Activity 或者 Brodcast Reciever 的Intent Filter , 的事件过滤器, 我们用着大家都很了然的说法来描述之吧, 实际上描述了拥有这些过滤器组建在系统中所具有能力。 Filter 的创建都是通过 manifest.xml 文件, 但是对于 Broadcast Reciever 用Context.registerReceiver()来创建。Filter 可以包含三种类型的过滤条件 <action> <category> <data> 一个Intent 是否能够通过一个过滤器到达对应的处理器取决于, Intent 所包含的 所有Categroy 是够都在 过滤器中的catergory 列表里出现。 换句话说, 没有 catergory字段的Inteng 可以通过任何过滤器, 而一个过滤器, 必须至少要有一个可以通过的限定,Category 或者 Action。 对于Action 也一样, 能够通过Filter 的Itent的 Action必须被列与 Category中。同样, 没有Action 的Intent 也可以通过所有的Filter。 对于<data>过滤条件稍微复杂点, 但是总的原则还是, 只有Intent 能够通过 Filter, 那么Intent 中的信息,必须出现在Filter中。 <data> 需要指定scheme://host:port/path , 条件顺序的优先级随着范围缩小而降低,相当于,看作目录,在子目录下匹配。比如, Filter指定了 scheme, 那么所有具有这个 scheme 的 Intent 都能通过,这个Filter, 类似的通配符的情况也是允许的。 这里翻译文档中的四个例子情况: a.如果没有定义URI 和数据类型, 则,该Intent只能通过没有定义URI和 数据类型的 过滤器。 b.只定义了URI的 Intent 只能通过只定义了 URI 的过滤器。 c.只定义了 数据类型的 Intent 也只能通过只定义了 数据类型的过滤器。 d. 如果一个Intent同事定义了URI和 数据类型, 或者数据类型可以由URI推定, 则只有具备了对应的数据类型,或者 content: 或者 file: 类型,并且没有定义URI的过滤器。(这种情况, 你自己代码一下就明白了, 在写下去,我也不鸟鸟了。) 如果通向Activities 的Intent 引起了多个响应, 就会出现需要用户指定的提示, 或者是异常。 差不多就是这样的情况了, android 的这种机制非常适合移动设备之间的应用相互调用, 以便在更大的粒度上达成复用。很强大。 /Chapter06_Intent_Filter/src/com/amaker/ch06/app/MainActivity.java 代码 packagecom.amaker.ch06.app; importcom.amaker.ch06.app.R; importandroid.app.Activity; importandroid.content.Intent; importandroid.net.Uri; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; /** * *IntentFilter测试 */ publicclassMainActivityextendsActivity{ //声明Button privateButtonbtn; privatestaticfinalStringACTION1="com.amaker.ch06.app.TEST_ACTION1"; privatestaticfinalStringACTION2="com.amaker.ch06.app.TEST_ACTION2"; privatestaticfinalStringACTION3="com.amaker.ch06.app.TEST_ACTION3"; privatestaticfinalStringCATEGORY1="com.amaker.ch06.app.CATEGORY1"; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //设置内容布局 setContentView(R.layout.main); //实例化按钮 btn=(Button)findViewById(R.id.Button01); Stringa=Intent.ACTION_VIEW; //添加单击监听器 btn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewview){ Intentintent=newIntent(); //intent.setAction(ACTION1); //Uridata=Uri.parse("content://com.amaker.ch07.app/abc"); //intent.setData(data); intent.addCategory(CATEGORY1); intent.setAction("android.intent.action.VIEW"); intent.setData(Uri.parse("http://www.google.com")); startActivity(intent); } }); } } /Chapter06_Intent_Filter/src/com/amaker/ch06/app/TestActivity.java 代码 packagecom.amaker.ch06.app; importcom.amaker.ch06.app.R; importandroid.app.Activity; importandroid.os.Bundle; /** *测试IntentFilter */ publicclassTestActivityextendsActivity{ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main1); } } /Chapter06_Intent_Filter/res/layout/main.xml 代码 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:text="测试IntentFilter" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> /Chapter06_Intent_Filter/res/layout/main1.xml 代码 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="测试IntentFilter" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </LinearLayout> /Chapter06_Intent_Filter/AndroidManifest.xml 代码 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.amaker.ch06.app" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name="TestActivity"> <intent-filter> <actionandroid:name="com.amaker.ch06.app.TEST_ACTION1"/> <actionandroid:name="com.amaker.ch06.app.TEST_ACTION2"/> <actionandroid:name="com.amaker.ch06.app.TEST_ACTION3"/> <actionandroid:name="android.intent.action.VIEW"/> <dataandroid:scheme="content"android:path="com.amaker.ch07.app/abc"/> <dataandroid:scheme="http"android:path="www.google.com"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.BROWSABLE"/> <categoryandroid:name="com.amaker.ch07.app.CATEGORY1"/> </intent-filter> </activity> </application> <uses-sdkandroid:minSdkVersion="3"/> </manifest> 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080659

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册